Snooprah Posted November 21, 2011 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
nuclearcat Posted November 21, 2011 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
Snooprah Posted November 22, 2011 Author Posted November 22, 2011 1)Если вы вешаете дисциплину на интерфейс - вы шейпите _исходящий_ траффик Это я понял сразу после такого как шейпер опробовал)) 2)Чтобы шейпить на интерфейсе на вход - почитайте про ifb А вот это уже что-то, спасибо, посмотрим, изучим. Вопрос про входящий трафик снимается. 3)Скорее всего в iptables у вас будут выполняться только 4 первых правила Нет, работают все правила. Трафик на указанных портах сыпется в 1-1.2 мбита, трафика на остальных портах, торрентах и пр. скукоживается до 128 кбит. :) Советую поискать еще на англоязычных ресурсах, там часто расписано с примерами В основном везде примеры из того же LARTC, который на русский успешно переведен и написано доходчиво, но с фильтрами что-то более расширеного и внятного ни на русском ни на ивритеинглише не нашел. Суть в том что нынешняя конструкция работает и работает так как я именно и хотел. Вопрос больше в том, как это реализовано)) Вот я и ищу правды в поисках более эстетичного варианта реализации, вместо странных правил iptables. Плюс, хочется заранее знать какие есть варианты оперирования с фильтрами, вдруг где еще придется столкнуться с шейпингом, может даже еще на более высоком уровне. Если честно, читать вам нужно больше. Я за последний год столько документации прочитал, сколько не читал за последние лет 10. :) Вставить ник Quote
Snooprah Posted November 22, 2011 Author Posted November 22, 2011 А вот это уже что-то, спасибо, посмотрим, изучим. Вопрос про входящий трафик снимается. Еще успел много почитать. Дисциплина Ingress Policer мне в помощь IFB вообще не совсем то. Вставить ник Quote
nuclearcat Posted November 22, 2011 Posted November 22, 2011 А, похоже расширение CLASSIFY не является конечным. Не очень хорошо для производительности и читаемости, но в данном случае терпимо. В любом случае я пользую u32 фильтры Вставить ник Quote
gavru Posted November 23, 2011 Posted November 23, 2011 Поставьте traffpro и будет вам 3 в одном :) Вставить ник Quote
NiTr0 Posted November 24, 2011 Posted November 24, 2011 Дисциплина Ingress Policer мне в помощь IFB вообще не совсем то. Вам шейпинг или полисинг? Шейпинг с приоритезацией/разделением скорости на абонов тем же esfq - ifb, полисинг (от которого смысла в вашем случае 0 ибо полисиер есть у апстрима на вашем канале) - ingress policier Вставить ник Quote
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.