Snooprah Posted November 21, 2011 Доброго дня! Занялся вопросом шейпинга трафика на роутере. Суть такова: 2 интернет-канала и 1 локалка. Первый канал основной, второй - резервный, при падении одного автоматом переключается на другой, с этим проблем нет. Нужно ограничить входящий и исходящий трафик на обоих интерфейсах интернет-каналов. Иначе говоря, чтобы сам роутер не качал и не отдавал используя весь канал. Также нужно динамическое распределение полосы пользователям за NATом, иначе говоря, трафика который форвардится. Много читал, много думал, много пробовал. В итоге дошел вот до чего: #!/bin/sh ################### # # Traffic shaping # ################### # # Settings # # TC utility location TC="/sbin/tc" # Local network LOCAL_IF="vlan10" LOCAL_RATE="100mbit" # Provider 1 P1_IF="vlan11" P1_RATE="4096kbit" # Provider 2 P2_IF="vlan12" P2_RATE="2048kbit" # Rates INET_RATE="1024kbit" CEIL_RATE="1280kbit" P2P_RATE="128kbit" Переменные, все думаю понятно. 2 провайдера, один каналом 2 мбит, другой 4 мбит, локалка 100 мбит. Общая скорость интернета 1 мбит с возможностью разгона до 1280 кбит, скорость для торрентов, качалок и прочих неизвестных портов 128 кбит. Про дисциплины очередей почитал, понял что такое. В скрипте удаляем если они уже имеются и заново добавляем: # # Delete existing disciplines # $TC qdisc del dev $LOCAL_IF root $TC qdisc del dev $P1_IF root $TC qdisc del dev $P2_IF root # # Add queueing disciplines # $TC qdisc add dev $LOCAL_IF root handle 1: htb $TC qdisc add dev $P1_IF root handle 1: htb $TC qdisc add dev $P2_IF root handle 1: htb Я предпочел дисциплицы HTB (Hierarchical Token Bucket) основываюсь на документации и отзывах. Я вроде даже более менее сообразил и в плане создания классов трафика: # # Add classes # # Local net $TC class add dev $LOCAL_IF parent 1: classid 1:1 htb rate $LOCAL_RATE $TC class add dev $LOCAL_IF parent 1:1 classid 1:10 htb rate $INET_RATE ceil $CEIL_RATE prio 1 $TC class add dev $LOCAL_IF parent 1:1 classid 1:20 htb rate $P2P_RATE ceil $P2P_RATE prio 2 # Provider 1 $TC class add dev $P1_IF parent 1: classid 1:1 htb rate $P1_RATE $TC class add dev $P1_IF parent 1:1 classid 1:10 htb rate $INET_RATE ceil $CEIL_RATE prio 1 $TC class add dev $P1_IF parent 1:1 classid 1:20 htb rate $P2P_RATE ceil $P2P_RATE prio 2 # Provider 2 $TC class add dev $P2_IF parent 1: classid 1:1 htb rate $P2_RATE $TC class add dev $P2_IF parent 1:1 classid 1:10 htb rate $INET_RATE ceil $CEIL_RATE prio 1 $TC class add dev $P2_IF parent 1:1 classid 1:20 htb rate $P2P_RATE ceil $P2P_RATE prio 2 И понял что для динамического распределения каналов мне необходимы дисциплины SFQ для классов. # # Add additional disciplines # # Local net $TC qdisc add dev $LOCAL_IF parent 1:10 handle 10: sfq perturb 10 $TC qdisc add dev $LOCAL_IF parent 1:20 handle 20: sfq perturb 10 # Provider 1 $TC qdisc add dev $P1_IF parent 1:10 handle 10: sfq perturb 10 $TC qdisc add dev $P1_IF parent 1:20 handle 20: sfq perturb 10 # Provider 2 $TC qdisc add dev $P2_IF parent 1:10 handle 10: sfq perturb 10 $TC qdisc add dev $P2_IF parent 1:20 handle 20: sfq perturb 10 Где-то еще вычитал что для более менее равномерного распределения полосы сгодятся оные команды. # # Add filters # # Local net $TC filter add dev $LOCAL_IF parent 10: protocol ip handle 10 flow hash keys dst divisor 256 $TC filter add dev $LOCAL_IF parent 20: protocol ip handle 20 flow hash keys dst divisor 256 # Provider 1 $TC filter add dev $P1_IF parent 10: protocol ip handle 10 flow hash keys dst divisor 256 $TC filter add dev $P2_IF parent 20: protocol ip handle 20 flow hash keys dst divisor 256 # Provider 2 $TC filter add dev $P2_IF parent 10: protocol ip handle 10 flow hash keys dst divisor 256 $TC filter add dev $P2_IF parent 20: protocol ip handle 20 flow hash keys dst divisor 256 Судя по всему определяет как очереди SFQ обрабатывать запросы. И все, понеслись запарки в плане установки фильтров трафика, маркираторов и пр. Сейчас использую iptables с вот таким вот конфигом: # # FORWARD Chain # # Other $IPT -t mangle -A FORWARD -i $LOCAL_IFACE -o $P1_IFACE -j CLASSIFY --set-class 1:20 $IPT -t mangle -A FORWARD -i $LOCAL_IFACE -o $P2_IFACE -j CLASSIFY --set-class 1:20 $IPT -t mangle -A FORWARD -i $P1_IFACE -o $LOCAL_IFACE -j CLASSIFY --set-class 1:20 $IPT -t mangle -A FORWARD -i $P2_IFACE -o $LOCAL_IFACE -j CLASSIFY --set-class 1:20 # ICMP $IPT -t mangle -A FORWARD -i $LOCAL_IFACE -o $P1_IFACE -p icmp -j CLASSIFY --set-class 1:10 $IPT -t mangle -A FORWARD -i $LOCAL_IFACE -o $P2_IFACE -p icmp -j CLASSIFY --set-class 1:10 $IPT -t mangle -A FORWARD -i $P1_IFACE -o $LOCAL_IFACE -p icmp -j CLASSIFY --set-class 1:10 $IPT -t mangle -A FORWARD -i $P2_IFACE -o $LOCAL_IFACE -p icmp -j CLASSIFY --set-class 1:10 # TCP $IPT -t mangle -A FORWARD -i $LOCAL_IFACE -o $P1_IFACE -p tcp -m multiport --dport 20,21,22,25,53,80,110,143,443,995,3389,4899,5190,5222 -j CLASSIFY --set-class 1:10 $IPT -t mangle -A FORWARD -i $LOCAL_IFACE -o $P2_IFACE -p tcp -m multiport --dport 20,21,22,25,53,80,110,143,443,995,3389,4899,5190,5222 -j CLASSIFY --set-class 1:10 $IPT -t mangle -A FORWARD -i $P1_IFACE -o $LOCAL_IFACE -p tcp -m multiport --sport 20,21,22,25,53,80,110,143,443,995,3389,4899,5190,5222 -j CLASSIFY --set-class 1:10 $IPT -t mangle -A FORWARD -i $P2_IFACE -o $LOCAL_IFACE -p tcp -m multiport --sport 20,21,22,25,53,80,110,143,443,995,3389,4899,5190,5222 -j CLASSIFY --set-class 1:10 # UDP $IPT -t mangle -A FORWARD -i $LOCAL_IFACE -o $P1_IFACE -p udp -m multiport --dport 53,123,5190,5222 -j CLASSIFY --set-class 1:10 $IPT -t mangle -A FORWARD -i $LOCAL_IFACE -o $P2_IFACE -p udp -m multiport --dport 53,123,5190,5222 -j CLASSIFY --set-class 1:10 $IPT -t mangle -A FORWARD -i $P2_IFACE -o $LOCAL_IFACE -p udp -m multiport --sport 53,123,5190,5222 -j CLASSIFY --set-class 1:10 $IPT -t mangle -A FORWARD -i $P2_IFACE -o $LOCAL_IFACE -p udp -m multiport --sport 53,123,5190,5222 -j CLASSIFY --set-class 1:10 Но по-моему это как-то коряво, стопудово можно эту конструкцию сделать куда компактней и удобней. Плюс это только маркировка трафика для форвардинга. Как мне ограничить трафик на внешних интерфейсах для самого роутера? Господа, был бы очень признателен если бы кто-нибудь подробно объяснил формирование фильтров для трафика средствами tc, iptables и пр. Я уже просто замучился. Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
nuclearcat Posted November 21, 2011 Доброго дня! Занялся вопросом шейпинга трафика на роутере. Суть такова: 2 интернет-канала и 1 локалка. Первый канал основной, второй - резервный, при падении одного автоматом переключается на другой, с этим проблем нет. Нужно ограничить входящий и исходящий трафик на обоих интерфейсах интернет-каналов. Иначе говоря, чтобы сам роутер не качал и не отдавал используя весь канал. Также нужно динамическое распределение полосы пользователям за NATом, иначе говоря, трафика который форвардится. Одно из правил - на вход резать сложно. Т.е. к примеру у вас 10 Мбит и вы поставили шейпер на 10Мбит, но юзер может влупить на торрентах скорость 100Мбит, и даже с учетом congestion control и прочего, на вас будет прилетать на 1-10 мегабит больше чем вы поставили. В реальности, на большом количестве пользователей, если канал бывает в "полку" надо резать с запасом около 10-30%. Много читал, много думал, много пробовал. В итоге дошел вот до чего: Если честно, читать вам нужно больше. В принципе начало неплохое, но вы совсем не ухватили концепцию. Вкратце: 1)Если вы вешаете дисциплину на интерфейс - вы шейпите _исходящий_ траффик 2)Чтобы шейпить на интерфейсе на вход - почитайте про ifb 3)Скорее всего в iptables у вас будут выполняться только 4 первых правила Но по-моему это как-то коряво, стопудово можно эту конструкцию сделать куда компактней и удобней. Плюс это только маркировка трафика для форвардинга. Как мне ограничить трафик на внешних интерфейсах для самого роутера? Господа, был бы очень признателен если бы кто-нибудь подробно объяснил формирование фильтров для трафика средствами tc, iptables и пр. Я уже просто замучился. Советую поискать еще на англоязычных ресурсах, там часто расписано с примерами Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
Snooprah Posted November 22, 2011 1)Если вы вешаете дисциплину на интерфейс - вы шейпите _исходящий_ траффик Это я понял сразу после такого как шейпер опробовал)) 2)Чтобы шейпить на интерфейсе на вход - почитайте про ifb А вот это уже что-то, спасибо, посмотрим, изучим. Вопрос про входящий трафик снимается. 3)Скорее всего в iptables у вас будут выполняться только 4 первых правила Нет, работают все правила. Трафик на указанных портах сыпется в 1-1.2 мбита, трафика на остальных портах, торрентах и пр. скукоживается до 128 кбит. :) Советую поискать еще на англоязычных ресурсах, там часто расписано с примерами В основном везде примеры из того же LARTC, который на русский успешно переведен и написано доходчиво, но с фильтрами что-то более расширеного и внятного ни на русском ни на ивритеинглише не нашел. Суть в том что нынешняя конструкция работает и работает так как я именно и хотел. Вопрос больше в том, как это реализовано)) Вот я и ищу правды в поисках более эстетичного варианта реализации, вместо странных правил iptables. Плюс, хочется заранее знать какие есть варианты оперирования с фильтрами, вдруг где еще придется столкнуться с шейпингом, может даже еще на более высоком уровне. Если честно, читать вам нужно больше. Я за последний год столько документации прочитал, сколько не читал за последние лет 10. :) Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
Snooprah Posted November 22, 2011 А вот это уже что-то, спасибо, посмотрим, изучим. Вопрос про входящий трафик снимается. Еще успел много почитать. Дисциплина Ingress Policer мне в помощь IFB вообще не совсем то. Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
nuclearcat Posted November 22, 2011 А, похоже расширение CLASSIFY не является конечным. Не очень хорошо для производительности и читаемости, но в данном случае терпимо. В любом случае я пользую u32 фильтры Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
gavru Posted November 23, 2011 Поставьте traffpro и будет вам 3 в одном :) Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
NiTr0 Posted November 24, 2011 Дисциплина Ingress Policer мне в помощь IFB вообще не совсем то. Вам шейпинг или полисинг? Шейпинг с приоритезацией/разделением скорости на абонов тем же esfq - ifb, полисинг (от которого смысла в вашем случае 0 ибо полисиер есть у апстрима на вашем канале) - ingress policier Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...