Миграция шейпера с ESFQ на SFQ flow has keys dst

Linux, безопасность, сети и все что с этим связано
Аватара пользователя
Llama
Неотъемлемая часть форума
Сообщения: 9749
Зарегистрирован: 06 фев 2002, 11:40
Откуда: Менск

Миграция шейпера с ESFQ на SFQ flow has keys dst

Сообщение Llama »

Добрый день.
В более-менее последних ядрах появилась альтернатива ESFQ в виде внешнего классификатора для SFQ.

Вот кусочек шейпера с ESFQ:

Код: Выделить всё

/opt/sbin/tc qdisc del dev eth2 root
/opt/sbin/tc qdisc add dev eth2 root handle 1 htb default 50 r2q 10
/opt/sbin/tc class add dev eth2 parent 1: classid 1:2 htb rate 100Mbit

/opt/sbin/tc class add dev eth2 parent 1:2 classid 1:20 htb rate 200Kbit ceil 100Mbit prio 10
/opt/sbin/tc qdisc add dev eth2 parent 1:20 handle 20 esfq perturb 10 hash dst
/opt/sbin/tc filter add dev eth2 parent 1:0 protocol ip prio 100 u32 match ip sport 22 0xffff classid 1:20

~skip~ 

/opt/sbin/tc class add dev eth2 parent 1:2 classid 1:50 htb rate 85Mbit ceil 100Mbit prio 50
/opt/sbin/tc qdisc add dev eth2 parent 1:50 handle 50 esfq perturb 10 hash dst
Вот аналог придуманный мною для SFQ/flow:

Код: Выделить всё

/sbin/tc qdisc del dev eth2 root
/sbin/tc qdisc add dev eth2 root handle 1 htb default 50 r2q 10

/sbin/tc class add dev eth2 parent 1: classid 1:2 htb rate 100Mbit

/sbin/tc class add dev eth2 parent 1:2 classid 1:20 htb rate 200Kbit ceil 100Mbit prio 10
/sbin/tc qdisc add dev eth2 parent 1:20 handle 20 sfq
/sbin/tc filter add dev eth2 parent 1:0 protocol ip prio 100 u32 match ip sport 22 0xffff classid 1:20
/sbin/tc filter add dev eth2 parent 20: protocol ip handle 20 flow hash keys nfct-dst divisor 1024


/sbin/tc class add dev eth2 parent 1:2 classid 1:50 htb rate 85Mbit ceil 100Mbit prio 50
/sbin/tc qdisc add dev eth2 parent 1:50 handle 50: sfq
/sbin/tc filter add dev eth2 parent 50: protocol ip handle 50 flow hash keys nfct-dst divisor 1024
Синтаксис верный, но - не работает. Через какое-то время пакеты теряются до полной непроходимости.
Документации по flow я не обнаружил и плохова-то понимаю как действует фильтр на дисциплину...
Опыт растет прямо пропорционально выведенному из строя оборудованию

Аватара пользователя
Jek
Неотъемлемая часть форума
Сообщения: 425
Зарегистрирован: 25 авг 2002, 08:50
Откуда: Minsk
Контактная информация:

Re: Миграция шейпера с ESFQ на SFQ flow has keys dst

Сообщение Jek »

Я, конечно, очень вовремя отвечаю, но пусть будет, в назидание потомкам и самому себе, когда забуду:

Проблема с пропаданием пакетов вызвана тем, что в дефолтный класс (в примере --- 1:50) направляются ВСЕ пакеты. ВСЕ --- в том числе и ARP. Затем, если мы повесили фильтр на дисциплину, но этот фильтр не пропускает ARP-пакеты, то имеем вышеописанное. Соответственно, надо либо выкинуть из определения корневой дисциплины класс по умолчанию (следя, чтобы ни один фильтр не сматчил ARP-пакеты, и чтобы на все нужные нам пакеты находился свой фильтр), либо высокоприоритетным фильтром направить их в какой-либо высокоскоростной класс. Второе мне не удалось, хотя вот здесь есть пример, который у меня не заработал: http://yesican.chsoft.biz/lartc/arp.html .
"Но в декабре я по ошибке позвонил вместо
модема на винчестер." (Linus Torvalds, "Just for fun")

demon-odinok
Заглянувший
Сообщения: 1
Зарегистрирован: 05 фев 2011, 05:51

Re: Миграция шейпера с ESFQ на SFQ flow has keys dst

Сообщение demon-odinok »

Тут дело в том что не поздно писать, действительно инфы мало по этому поводу в интернете , поэтому для все трудящихся выкладываю что у меня получилось :)

P.S
И было бы неплохо в этой теме о параметре делителя divisor 1024 поговорить

#! /bin/bash
# modprobe ifb
ipt=/sbin/iptables
ipr=/sbin/tc
$ipt -F -t mangle
dev_in=eth2
down=10mbit

$ipr qdisc del dev $dev_in root &> /dev/null

$ipr qdisc add dev $dev_in root handle 1: htb default 99
$ipr class add dev $dev_in parent 1: classid 1:1 htb rate $down burst 250k

################################## ARP ####################################################################################

$ipr class add dev $dev_in parent 1:1 classid 1:2 htb rate 100kbps ceil $down burst 150k prio 0
$ipr qdisc add dev $dev_in parent 1:2 handle 2: sfq perturb 10
$ipr filter add dev $dev_in protocol ip parent 1:0 prio 2 handle 2 fw flowid 1:2
$ipr filter add dev $dev_in parent 1:2 protocol all prio 2 u32 match u16 0x0806 0xffff at -2 flowid 1:2

########### Jek там в примере ошибка вместо protocol ip ------ protocol all надо поставить

################################# default 99 ################################################################################

$ipr class add dev $dev_in parent 1:1 classid 1:99 htb rate 56kbps ceil $down burst 150k prio 7
$ipr qdisc add dev $dev_in parent 1:99 handle 99: sfq perturb 5
$ipr filter add dev $dev_in protocol ip parent 1:0 prio 1 handle 99 fw flowid 1:99
$ipr filter add dev $dev_in parent 1:99 protocol ip handle 99 flow hash keys nfct-dst divisor 1024 baseclass 1:99

################################ dns SYN,RST,ACK - ICMP ##########################################################################

$ipt -t mangle -A POSTROUTING -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK ACK -m length --length :64 -j MARK --set-mark 3
$ipt -t mangle -A POSTROUTING -p tcp --syn -m length --length 40:68 -j MARK --set-mark 3
$ipt -t mangle -A POSTROUTING -p tcp --tcp-flags ALL SYN,ACK -m length --length 40:68 -j MARK --set-mark 3
$ipt -t mangle -A POSTROUTING -p tcp --tcp-flags ALL ACK -m length --length 40:100 -j MARK --set-mark 3
$ipt -t mangle -A POSTROUTING -p tcp --tcp-flags ALL RST -j MARK --set-mark 3
$ipt -t mangle -A POSTROUTING -p tcp --tcp-flags ALL ACK,RST -j MARK --set-mark 3
$ipt -t mangle -A POSTROUTING -p tcp --tcp-flags ALL ACK,FIN -j MARK --set-mark 3
$ipt -t mangle -A POSTROUTING -p icmp -m length --length 28:1500 -m limit --limit 2/s --limit-burst 5 -j MARK --set-mark 3
$ipt -t mangle -A POSTROUTING -p icmp -j MARK --set-mark 3
$ipt -t mangle -A POSTROUTING -p tcp --dport 53 -j MARK --set-mark 3
$ipt -t mangle -A POSTROUTING -p tcp --sport 53 -j MARK --set-mark 3
$ipt -t mangle -A POSTROUTING -p udp --dport 53 -j MARK --set-mark 3
$ipt -t mangle -A POSTROUTING -p udp --sport 53 -j MARK --set-mark 3

$ipr class add dev $dev_in parent 1:1 classid 1:3 htb rate 80kbps ceil 1mbit burst 1k prio 1
$ipr qdisc add dev $dev_in parent 1:3 handle 3: pfifo
$ipr filter add dev $dev_in protocol ip parent 1:0 prio 1 handle 3 fw flowid 1:3

################################## ssh ##################################################################################

$ipt -t mangle -A POSTROUTING -p tcp --sport 22 -j MARK --set-mark 4
$ipt -t mangle -A POSTROUTING -p tcp --dport 22 -j MARK --set-mark 4
$ipt -t mangle -A POSTROUTING -p tcp --sport 222 -j MARK --set-mark 4
$ipt -t mangle -A POSTROUTING -p tcp --dport 222 -j MARK --set-mark 4

$ipr class add dev $dev_in parent 1:1 classid 1:4 htb rate 30kbps ceil $down burst 15k prio 2
$ipr qdisc add dev $dev_in parent 1:4 handle 4: sfq perturb 10
$ipr filter add dev $dev_in protocol ip parent 1:0 prio 1 handle 4 fw flowid 1:4
$ipr filter add dev $dev_in parent 1:4 protocol ip handle 4 flow hash keys nfct-dst divisor 1024 baseclass 1:4

################################## CS ###################################################################################

$ipt -t mangle -A POSTROUTING -p udp --dport 27015 -j MARK --set-mark 5
$ipt -t mangle -A POSTROUTING -p udp --dport 27016 -j MARK --set-mark 5
$ipt -t mangle -A POSTROUTING -p tcp --dport 27018 -j MARK --set-mark 5

$ipr class add dev $dev_in parent 1:1 classid 1:5 htb rate 30kbps ceil $down burst 15k prio 3
$ipr qdisc add dev $dev_in parent 1:5 handle 5: sfq perturb 10
$ipr filter add dev $dev_in protocol ip parent 1:0 prio 1 handle 5 fw flowid 1:5
$ipr filter add dev $dev_in parent 1:5 protocol ip handle 5 flow hash keys nfct-dst divisor 1024 baseclass 1:5

################################## WEB VPN #####################################################################################

$ipt -t mangle -A POSTROUTING -p tcp -m tcp --sport 80 -j MARK --set-mark 6
$ipt -t mangle -A POSTROUTING -p tcp -m tcp --dport 80 -j MARK --set-mark 6
$ipt -t mangle -A POSTROUTING -p tcp --sport 443 -j MARK --set-mark 6 # https
$ipt -t mangle -A POSTROUTING -p tcp --dport 443 -j MARK --set-mark 6 # https
$ipt -t mangle -A POSTROUTING -p tcp -m tcp --dport 1723 -j MARK --set-mark 6
$ipt -t mangle -A POSTROUTING -p tcp -m tcp --dport 1722 -j MARK --set-mark 6

$ipr class add dev $dev_in parent 1:1 classid 1:6 htb rate 30kbps ceil $down burst 15k prio 4
$ipr qdisc add dev $dev_in parent 1:6 handle 6: sfq perturb 10
$ipr filter add dev $dev_in protocol ip parent 1:0 prio 1 handle 6 fw flowid 1:6
$ipr filter add dev $dev_in parent 1:6 protocol ip handle 6 flow hash keys nfct-dst divisor 1024 baseclass 1:6

Аватара пользователя
angor
Интересующийся
Сообщения: 40
Зарегистрирован: 22 сен 2007, 12:08
Откуда: Minsk
Контактная информация:

Re: Миграция шейпера с ESFQ на SFQ flow has keys dst

Сообщение angor »

Немного усложнил себе задачу:
на интерфейсе eth1 хочу порезать входящий инет (для eth1 это исходящий), а также и локальный траффик (ftp, samba, etc). RDP на VBox заметно притормаживает.

Как я делал: на корневую дисциплину поставил ограничение 200mbit, для интернет траффика создал отдельные классы, для них выставил 90% от ширины канала (ну это пока неважно), и этому траффику поставил повыше приоритет. Для RDP повесил:

Код: Выделить всё

$TC class add dev $DEV_OUT parent 1:1 classid 1:2 htb rate ${RATE_OUT}kbit ceil $[$RATE_OUT/100]mbit prio 0
или в статистике:

Код: Выделить всё

class htb 1:2 parent 1:1 leaf 2: prio 0 rate 200000bit ceil 2000Kbit burst 1599b cburst 1600b
 Sent 531864 bytes 403 pkt (dropped 0, overlimits 0 requeues 0)
 rate 227448bit 22pps backlog 0b 0p requeues 0
 lended: 100 borrowed: 303 giants: 0
 tokens: -277915 ctokens: -55091
Но задержки есть (хотя повышением приоритета добился их уменьшение).
Так вот, можно ли сделать так, чтобы некоторый локальный траффик шел с минимальными задержками (а лучше вообще без них), а другой ограничить?
Есть идеи?

Ответить