Jump to content

Recommended Posts

Posted

Доброго дня!

 

Занялся вопросом шейпинга трафика на роутере. Суть такова: 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 и пр.

Я уже просто замучился.

Posted

Доброго дня!

 

Занялся вопросом шейпинга трафика на роутере. Суть такова: 2 интернет-канала и 1 локалка. Первый канал основной, второй - резервный, при падении одного автоматом переключается на другой, с этим проблем нет.

 

Нужно ограничить входящий и исходящий трафик на обоих интерфейсах интернет-каналов. Иначе говоря, чтобы сам роутер не качал и не отдавал используя весь канал. Также нужно динамическое распределение полосы пользователям за NATом, иначе говоря, трафика который форвардится.

Одно из правил - на вход резать сложно. Т.е. к примеру у вас 10 Мбит и вы поставили шейпер на 10Мбит, но юзер может влупить на торрентах скорость 100Мбит, и даже с учетом congestion control и прочего, на вас будет прилетать на 1-10 мегабит больше чем вы поставили.

В реальности, на большом количестве пользователей, если канал бывает в "полку" надо резать с запасом около 10-30%.

 

Много читал, много думал, много пробовал. В итоге дошел вот до чего:

Если честно, читать вам нужно больше. В принципе начало неплохое, но вы совсем не ухватили концепцию.

 

Вкратце:

1)Если вы вешаете дисциплину на интерфейс - вы шейпите _исходящий_ траффик

2)Чтобы шейпить на интерфейсе на вход - почитайте про ifb

3)Скорее всего в iptables у вас будут выполняться только 4 первых правила

 

Но по-моему это как-то коряво, стопудово можно эту конструкцию сделать куда компактней и удобней. Плюс это только маркировка трафика для форвардинга. Как мне ограничить трафик на внешних интерфейсах для самого роутера?

Господа, был бы очень признателен если бы кто-нибудь подробно объяснил формирование фильтров для трафика средствами tc, iptables и пр.

Я уже просто замучился.

Советую поискать еще на англоязычных ресурсах, там часто расписано с примерами

Posted

1)Если вы вешаете дисциплину на интерфейс - вы шейпите _исходящий_ траффик

Это я понял сразу после такого как шейпер опробовал))

 

2)Чтобы шейпить на интерфейсе на вход - почитайте про ifb

А вот это уже что-то, спасибо, посмотрим, изучим. Вопрос про входящий трафик снимается.

 

3)Скорее всего в iptables у вас будут выполняться только 4 первых правила

Нет, работают все правила. Трафик на указанных портах сыпется в 1-1.2 мбита, трафика на остальных портах, торрентах и пр. скукоживается до 128 кбит. :)

 

Советую поискать еще на англоязычных ресурсах, там часто расписано с примерами

В основном везде примеры из того же LARTC, который на русский успешно переведен и написано доходчиво, но с фильтрами что-то более расширеного и внятного ни на русском ни на ивритеинглише не нашел.

 

Суть в том что нынешняя конструкция работает и работает так как я именно и хотел. Вопрос больше в том, как это реализовано)) Вот я и ищу правды в поисках более эстетичного варианта реализации, вместо странных правил iptables. Плюс, хочется заранее знать какие есть варианты оперирования с фильтрами, вдруг где еще придется столкнуться с шейпингом, может даже еще на более высоком уровне.

 

Если честно, читать вам нужно больше.

Я за последний год столько документации прочитал, сколько не читал за последние лет 10. :)

Posted

А вот это уже что-то, спасибо, посмотрим, изучим. Вопрос про входящий трафик снимается.

Еще успел много почитать.

Дисциплина Ingress Policer мне в помощь IFB вообще не совсем то.

Posted

А, похоже расширение CLASSIFY не является конечным. Не очень хорошо для производительности и читаемости, но в данном случае терпимо.

В любом случае я пользую u32 фильтры

Posted

Дисциплина Ingress Policer мне в помощь IFB вообще не совсем то.

Вам шейпинг или полисинг?

Шейпинг с приоритезацией/разделением скорости на абонов тем же esfq - ifb, полисинг (от которого смысла в вашем случае 0 ибо полисиер есть у апстрима на вашем канале) - ingress policier

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...
На сайте используются файлы cookie и сервисы аналитики для корректной работы форума и улучшения качества обслуживания. Продолжая использовать сайт, вы соглашаетесь с использованием файлов cookie и с Политикой конфиденциальности.