Ниже будут заданы фильтры, которые направляют пакеты в нужные полосы (классы). Прошу обратить внимание на prio. Чем меньше, тем выше. Это не имеет отношения
к приоритету полос. Это приоритет для выборки пакета фильтром. Иначе может
получиться, что сначала отработает
tc filter add dev $DEV_OUT parent 1:0 $U32 $UDP classid 1:13
а
tc filter add dev $DEV_OUT parent 1:0 $U32 $DPORT 53 0xffff classid 1:12
будет сосать лапу
Я сделал несколько простых макросов, чтобы задание правил не было таким громоздким.
0xffff после порта - маска. Например, 22 0xfffe позволяет ловить и 23 порт
Все условия, которые задаются в одной команде, работают как AND.
tc filter add dev $DEV_OUT parent 1:0 prio 2 $U32 $DPORT 53 0xffff classid 1:12
Важный момент. Тут не отслеживается тип пакета. Формат udp и tcp пакета
одинаковый в самом начале и поэтому можно проверять условие на dest port сразу
для этих двух протоколов.
tc filter add dev $DEV_OUT parent 1:0 prio 1 $U32 $TCP $SPORT 22 0xfffe classid 1:10
tc filter add dev $DEV_OUT parent 1:0 prio 1 $U32 $TCP $SPORT 222 0xfffe classid 1:10
tc filter add dev $DEV_OUT parent 1:0 prio 1 $U32 $TCP $SPORT 2200 0xfffe classid 1:10
tc filter add dev $DEV_OUT parent 1:0 prio 1 $U32 $TCP $DPORT 22 0xfffe classid 1:10
tc filter add dev $DEV_OUT parent 1:0 prio 1 $U32 $TCP $DPORT 222 0xfffe classid 1:10
tc filter add dev $DEV_OUT parent 1:0 prio 1 $U32 $TCP $DPORT 2200 0xfffe classid 1:10
Самым приоритетным для меня считаются исходящие соединения на внешние ssh/telnet сервера.
К тому же я использую нестандартные порты типа 222, 2200 Так же хочу, чтобы эти
же сервисы, которые подняты на роутере, были доступны снаружи без тормозов.
Выше стоит максимальное ограничение скорости в 1/3. Нечего забивать
канал всякими scp и sftp !
tc filter add dev $DEV_OUT parent 1:0 prio 1 $U32 $ICMP classid 1:11
Пусть пингается с максимальным качеством, но не более 30-50 пакетов в секунду (20kbit/8/60).
Нечего флудить!
tc filter add dev $DEV_OUT parent 1:0 prio 2 $U32 $SPORT 53 0xffff classid 1:12
tc filter add dev $DEV_OUT parent 1:0 prio 2 $U32 $DPORT 53 0xffff classid 1:12
Пропускаю тут запросы к днс серверам наружу. Так же у меня есть днс сервер на хосте
и он должен отвечать на запросы. С таким приоритетом маркировать пакеты для своих любимых
сетевых игр, именно поэтому максимальная скорость разрешена в 1/3
например:
tc filter add dev $DEV_OUT parent 1:0 prio 2 $U32 $UDP $DPORT 27505 0xffff classid 1:12
tc filter add dev $DEV_OUT parent 1:0 prio 2 $U32 $TCP $DPORT 4000 0xffff classid 1:12
tc filter add dev $DEV_OUT parent 1:0 prio 3 $U32 $UDP classid 1:13
Все прочие udp пакеты. Возможно, некоторые пиринговые сети будут жить в этой полосе.
Но в основном для игрушек, которые не попали в более приоритетную полосу.
tc filter add dev $DEV_OUT parent 1:0 prio 3 $U32 $TCP $DPORT 3389 0xffff classid 1:14
tc filter add dev $DEV_OUT parent 1:0 prio 3 $U32 $TCP $SPORT 3389 0xffff classid 1:14
Хочу использовать rdp на внешних серверах без сильных тормозов, но и не хочу
мешать игрушкам. Так же есть некий компьютер в локальной сети, на который можно
зайти по rdp снаружи. Где-то в другом скрипте сделан dnat.
tc filter add dev $DEV_OUT parent 1:0 prio 3 $U32 $TCP $DPORT 80 0xffff classid 1:15
tc filter add dev $DEV_OUT parent 1:0 prio 3 $U32 $TCP $DPORT 443 0xffff classid 1:15
tc filter add dev $DEV_OUT parent 1:0 prio 3 $U32 $TCP $DPORT 3128 0xffff classid 1:15
tc filter add dev $DEV_OUT parent 1:0 prio 3 $U32 $TCP $DPORT 8080 0xffff classid 1:15
tc filter add dev $DEV_OUT parent 1:0 prio 3 $U32 $TCP $SPORT 25 0xffff classid 1:15
tc filter add dev $DEV_OUT parent 1:0 prio 3 $U32 $TCP $SPORT 80 0xffff classid 1:15
tc filter add dev $DEV_OUT parent 1:0 prio 3 $U32 $TCP $SPORT 443 0xffff classid 1:15
Веб серфинг пусть получит приоритет повыше. Сюда же добавлять icq, irc, smtp, pop3 ...
Тут же ограничиваю свои веб и почтовые сервисы. Приоритет выше, чем у пакетов
по умолчанию.
tc qdisc add dev $DEV_OUT parent 1:10 handle 10: sfq perturb 10
tc qdisc add dev $DEV_OUT parent 1:11 handle 11: sfq perturb 10
tc qdisc add dev $DEV_OUT parent 1:12 handle 12: sfq perturb 10
tc qdisc add dev $DEV_OUT parent 1:13 handle 13: sfq perturb 10
tc qdisc add dev $DEV_OUT parent 1:14 handle 14: sfq perturb 10
tc qdisc add dev $DEV_OUT parent 1:15 handle 15: sfq perturb 10
tc qdisc add dev $DEV_OUT parent 1:17 handle 17: sfq perturb 10
echo "Outbound shaping added to $DEV_OUT. Rate: ${RATE_OUT}Kbit/sec."
}
К каждому классу добавляются алгоритмы обработки очереди
можно вместо sfq выбрать другой тип очереди, например esfq
esfq не входит в стандартное ядро и поэтому нужно устанавливать этот
модуль отдельно (http://fatooh.org/esfq-2.6/)
Процедура для ограничения исходящего трафика закончена.
start_in(){
ip link set dev $DEV_IN qlen $QLEN_IN
tc qdisc add dev $DEV_IN root handle 1: htb default 17
tc class add dev $DEV_IN parent 1: classid 1:1 htb rate ${RATE_IN}kbit
tc class add dev $DEV_IN parent 1:1 classid 1:10 htb rate $[$RATE_IN/8]kbit prio 0
tc class add dev $DEV_IN parent 1:1 classid 1:11 htb rate $[$RATE_IN/8]kbit prio 1
tc class add dev $DEV_IN parent 1:1 classid 1:12 htb rate $[$RATE_IN/8]kbit ceil $[$RATE_IN/3]kbit prio 2
tc class add dev $DEV_IN parent 1:1 classid 1:13 htb rate $[$RATE_IN/8]kbit ceil $[$RATE_IN/3]kbit prio 3
tc class add dev $DEV_IN parent 1:1 classid 1:14 htb rate $[$RATE_IN/8]kbit ceil $[$RATE_IN/3]kbit prio 4
tc class add dev $DEV_IN parent 1:1 classid 1:15 htb rate $[$RATE_IN/8]kbit ceil ${RATE_IN}kbit prio 5
tc class add dev $DEV_IN parent 1:1 classid 1:17 htb rate $[$RATE_IN/8]kbit ceil ${RATE_IN}kbit prio 7
Примерно тоже самое, только этот интерфейс работает с локальной сетью.
tc class add dev $DEV_IN parent 1: classid 1:2 htb rate $RATE_LOCAL prio 7
Через этот класс пропускается не транзитный с adsl модема траффик, а исходящий
с роутера, поэтому используется другой, более высокий rate
tc filter add dev $DEV_IN parent 1:0 prio 1 $U32 $SRC $IP_LOCAL classid 1:2
а это фильтр для него
tc filter add dev $DEV_IN parent 1:0 prio 2 $U32 $TCP $SPORT 22 0xfffe classid 1:10
tc filter add dev $DEV_IN parent 1:0 prio 2 $U32 $TCP $SPORT 222 0xffff classid 1:10
tc filter add dev $DEV_IN parent 1:0 prio 2 $U32 $TCP $SPORT 2200 0xffff classid 1:10
tc filter add dev $DEV_IN parent 1:0 prio 2 $U32 $ICMP classid 1:11
tc filter add dev $DEV_IN parent 1:0 prio 2 $U32 $SPORT 53 0xffff classid 1:12
tc filter add dev $DEV_IN parent 1:0 prio 3 $U32 $UDP classid 1:13
tc filter add dev $DEV_IN parent 1:0 prio 3 $U32 $TCP $SPORT 3389 0xffff classid 1:14
tc filter add dev $DEV_IN parent 1:0 prio 3 $U32 $TCP $DST 10.0.0.100 $DPORT 3389 0xffff classid 1:14
tc filter add dev $DEV_IN parent 1:0 prio 3 $U32 $TCP $SPORT 80 0xffff classid 1:15
tc filter add dev $DEV_IN parent 1:0 prio 3 $U32 $TCP $SPORT 443 0xffff classid 1:15
tc filter add dev $DEV_IN parent 1:0 prio 3 $U32 $TCP $SPORT 3128 0xffff classid 1:15
tc filter add dev $DEV_IN parent 1:0 prio 3 $U32 $TCP $SPORT 8080 0xffff classid 1:15
Тут используются обычно src port вместо dst port, потому что это входящий трафик.
Хотя никто не мешает вам сделать другие политики и наслаждаться бардаком
tc qdisc add dev $DEV_IN parent 1:2 handle 2: pfifo
Использую самую простую и легкую для процессора очередь pfifo для исходящего
с роутера трафика (не транзитный!)
tc qdisc add dev $DEV_OUT parent 1:10 handle 10: sfq perturb 10
tc qdisc add dev $DEV_OUT parent 1:11 handle 11: sfq perturb 10
tc qdisc add dev $DEV_OUT parent 1:12 handle 12: sfq perturb 10
tc qdisc add dev $DEV_OUT parent 1:13 handle 13: sfq perturb 10
tc qdisc add dev $DEV_OUT parent 1:14 handle 14: sfq perturb 10
tc qdisc add dev $DEV_OUT parent 1:15 handle 15: sfq perturb 10
tc qdisc add dev $DEV_OUT parent 1:17 handle 17: sfq perturb 10
echo "Outbound shaping added to $DEV_OUT. Rate: ${RATE_OUT}Kbit/sec."
}
Процедура для ограничения входящего трафика закончена.
case "$1" in
start)
stop
start_in
start_out
;;
stop)
stop
echo "Shaping removed on $DEV_OUT/$DEV_IN."
;;
status)
status
;;
*)
echo "Usage: $0 {start|stop|status} ppp_interface ip"
esac
Теперь добавляем в /etc/ppp/ip-up
что-то типа:
if [ $4 = "1.2.3.4" ]; then
/etc/iproute2/rt_add $5 # это у меня создаются дополнительные таблицы и маршруты роутинга
# для локальной сети и для самого роутера для своих, особых целей
/etc/ppp/adsl_qos start $1 $4
fi
в /etc/ppp/ip-down:
if [ $4 = "1.2.3.4" ]; then
/etc/iproute2/rt_del $5
/etc/ppp/adsl_qos stop $1 $4
fi
Проверку можно и не делать, но у меня еще есть и dialup сервер и/или
туннель на pppd
Все. Если циферки RATE_IN/RATE_OUT подобраны правильно, то максимальная пропускная
способность канала пострадает не сильно, но зато высокоприоритетные потоки
не будут лагать даже при сильной загрузке в обоих направлениях одновременно.
Скорость входящих потоков реально зажимается без прямого воздействия на
исходящие и дропы пакетов минимальны. Скорее всего это происходит из-за
притормаживания пакета в очереди. Разумеется, от флуда это не спасет, но эти
случаи лечат обычно административными методами.
Если критично, что ограничиваются пакеты на интерфейсе локальной сети,
то нужно ставить IMQ модуль и переносить обработку с $DEV_IN на интерфейс imq#
Часть информации и заготовка для скрипта взято отсюда:
http://gazette.linux.ru.net/rus....to.html
Другие полезные ссылки по QoS:
http://www.lartc.org
http://gazette.linux.ru.net/rus/articles/taleLinuxTC.html
http://luxik.cdi.cz/~devik/qos/htb/manual/userg.htm
tcp, udp пинг. Самое то для проверки работы QoS:
http://wiki.hping.org/
imq модуль для создания виртуального интерфейса. Появляется возможность обрабатывать
входящий трафик на ppp устройстве, а не на интерфейсе локальной сети:
http://www.linuximq.net/
esfq алгоритм обработки очереди. Полезен, когда нужно распределить канал
примерно поровну между пользователями, вне зависимости от того, сколько каждый
из них использует потоков. Давить наглых регетчиков-многопоточников!!!
http://fatooh.org/esfq-2.6/
Разные полезные модули. В том числе для борьбы с p2p:
http://kem.p.lodz.pl/~peter/qnet/
Мониторинг сетевой активности:
http://iptraf.seul.org/