Всем постигающим азы шейпинга - ПРИВЕТ!!!
Я на Ubuntu 8.04 уже целых 3 недели!

Вот решил поделиться своими попытками реализовать нормальный шейпер.
Главная проблема шейпера на Ubuntu(да и вообще на Linux) - это отсутствие возможности ограничить скорость для самого роутера(сервера, шейпера - у кого как...)
Т.е. без дополнительных модулей ограничить общую скорость входящего трафика на роутере нельзя!
Передо мной стояли следующие задачи:
1) Реализовать общее ограничение скорости, дабы не забивать канал у провайдера.
2) Ограничить скорость у каждого компьютера в локальной сети и у роутера в том числе.
3) Динамически распределить скорость между всеми пользователями+роутер.
4) Организовать приоритет для некоторых видов трафика (SSH, telnet, HTTP).
Во первых, чтобы не задавать лишних вопросов прочтите это
http://gazette.linux.ru.net/rus/articles/taleLinuxTC.htmlГлавный вывод - нам нужен IMQ (Intermediate queueing device). Это псевдо устройство поможет сделать общее ограничение скорости и ограничение скорости для каждого в отдельности.
Альтернатив IMQ нет!

Более новый модуль IFB, примеры есть тут (
http://www.opennet.ru/tips/info/1421.shtml), у вас скорее всего уже включен в ядро - можете порадоваться! Только вот он почему-то не работает с NAT, а IMQ работает, причем замечательно!
IMQ в ядро не включен! И, видимо, не будет включен никогда... Чтобы IMQ у нас работало нам надо пропатчить ядро и пропатчить iptables.
1. Установка IMQ на Ubuntu 8.04:NB - Не пинайте сильно, я все делал от root'а... Просто в лом каждый раз писать
sudo 
Для начала скачаем патч для ядра и для iptables -
http://www.linuximq.net/patches.html.
Чтобы узнать версию своего ядра пишем:
uname -r
Чтобы узнать версию iptables пишем:
iptables --version
Теперь качаем исходники ядра:
apt-get install linux-source
Насколько я помню, после того как исходники скачались, они появяться в папке /usr/src/. Если их там нет, то копируйте их туда.
Теперь копируйте linux-2.6.24-imq.diff(у меня ядро 2.6.24-server) в папку /usr/src/.
Пишем:
cd /usr/src
tar -xjf linux-source-2.6.24.tar.bz2
cd linux-source-2.6.24
Да-да, именно в этой папке лежат исходники вашего ядра!
Для дальнейших действий нам понадобятся следующие пакеты - build-essential ncurses-dev fakeroot libqt3-mt-dev kernel-package:
apt-get install build-essential ncurses-dev fakeroot libqt3-mt-dev kernel-package
Затем:
patch -p1 < ../linux-2.6.17-imq1.diff
Чтобы сохранить все текущие настройки ядра, нужно скопировать из папки /boot/ файл config-2.6.24-21-server(повторюсь - у меня ядро 2.6.24-server):
cp /boot/config-2.6.24-21-server /usr/src/linux-2.6.24/.config
Затем пишем:
make oldconfig
- Тут мы все принимаем по умолчанию. Просто тупо жмем "Enter"
Теперь настройка ядра:
make menuconfig
После этой команды у Вас появиться меню настройки ядра. Чтобы войти в раздел - жмем "Enter", чтобы выйти - 2 раза "Esc". Настраиваем IMQ(
источник настройки):
1. Идем в
Device Drivers --> Network device support -> Установить
IMQ (intermediate queueing device) support <M>
IMQ behavior (PRE/POSTROUTING) (IMQ AB) //Тут обязательно AB!!!
Number of IMQ devices (4) // Можно до 16
2. Идем в
Networking ---> Networking options ---> Network packet filtering framework (Netfilter) ---> IP: Netfilter Configuration ---> Установить
<M> IMQ target support 3. Идем в
Networking ---> Networking options ---> Network packet filtering framework (Netfilter) ---> IPv6: Netfilter Configuration (EXPERIMENTAL) ---> Установить
<M> IMQ target support 4.Идем в
Networking support ---> Networking options ---> Network packet filtering framework (Netfilter) Установить
[ ] Network packet filtering debugging (убрать звезду)После установки такого ядра у меня отвалился звук. Чтобы этого не произошло и у вас делаем следующее:
1. Идем в
Device Drivers --> Sound --> Advanced Linux Sound Architecture --> PCI devicesУстанавливайте <M> на своей звуковухе. Если не знаете какая ставьте везде <M> 
Теперь аккуратьненько жмем по 2 раза "Esc" до тех пор пока не вернемся в главное меню. И там внизу ищем
"Save an Alternate Configuration File" жмем "Enter", "Enter" и 2 раза "Esc"

Теперь компилируем ядро:
make-kpkg --append-to-version imq1 --initrd kernel_image
Идем пить чай...
После компиляции в папке /usr/src должен появиться deb-пакет "linux-image-2.6.24.3imq1_2.6.24.3imq1-10.00.Custom_i386.deb". Пишем:
cd /usr/src
dpkg -i linux-image-2.6.24.3imq1_2.6.24.3imq1-10.00.Custom_i386.deb
Перезагружаемся. Если Ubuntu загрузилась и работает, то переходим к следующему этапу, для меня оказавшемуся самым сложным.
Главная проблема в том, что у меня почему-то не получалось откомпилировать даже чистые исходники iptables, без патча IMQ... Почему-то при компиляции iptables у меня появлялось два deb'а. Один - iptables-dev_1.3.8.0debian1-1ubuntu2_i386.deb, другой - iptables_1.3.8.0debian1-1ubuntu2_i386.deb. Но ни тот ни другой не были пропатчены...

Как я выяснил, для того чтобы в iptables можно было подключать IMQ командой "-j IMQ --todev 0", в папке /lib/iptables должен быть "libipt_IMQ.so" и "libip6t_IMQ.so". Частично как это сделать нашел тут(
http://elessar.one.pl/article_kernel2.6.php)
Скомпилить эти файлы можно так(больше не знаю как):
cd /usr/src
apt-get source iptables
apt-get build-dep iptables #(Зачем - не знаю...)
Копируйте iptables-1.3.x-imq.diff в папку /usr/src. Затем:
cd /usr/src/iptables-1.3.8.0debian1/iptables
patch -p1 <../../iptables-1.3.x-imq.diff
chmod +x extensions/.IMQ-test*
make
cd ..
dpkg-buildpackage -us -uc -nc
cd /usr/src/iptables-1.3.8.0debian1/debian/build/iptables_profectio/extensions
ls|grep IMQ
Если видите файлы libip6t_IMQ.so и libipt_IMQ.so, то все отлично:
cp *IMQ.so /lib/iptables/
cd /usr/src/
Ура!!! На данном этапе у нас стоит IMQ и работает.
2. Проверка работы IMQ в Ubuntu 8.04:Проверить можно так:
modprobe imq numdevs=4
Мы подключили модуль imq. Теперь поднимем устройство imq0:
ip link set imq0 up
ifconfig|grep imq
Если увидели - "imq0 Link encap:UNSPEC HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00", то все норм.
Чтобы проверить работу iptables пишем:
iptables -t mangle -A PREROUTING -i eth0 -j IMQ --todev 0
Если ошибок нет, то все ок. Чтобы удалить это правило введите:
iptables -t mangle -D PREROUTING -i eth0 -j IMQ --todev 0
После всех этих манипуляций можно настраивать дисциплины на интерфейсе imq0. Я настраивал все с помощью HTB. Пример можно посмотреть
тут.
Уфф!
Информация по IMQ(может кому пригодиться):
http://wiki.nix.hu/cgi-bin/twiki/view/IMQ/ImqFaq.
Всем кто вытерпел до конца - спасибо! Всем кому помог - можете и мне сказать спасибо!
