Перейти к содержимому
Калькуляторы

[решено] LInux. Шейпинг на QinQ терминаторе linux, htb и qinq интерфейсы

Есть soft-BRAS на linux, терминирующий IPOE клиентов. У сервера 2 интерфейса - bond0 в мир(тут все понятно и просто) и bond1 с qinq на клиентов(тут возникают проблемы).

Биллинговая система генерирует готовые развесистые конфиги для batch tc.

Если вешаю шейпер на конечный клиентский влан(bond1.2000.1000 к примеру) - естественно работает. Вешаю на bond1.2000 - как ни странно тоже работает, клиентские вланы режутся.

Но если повесить на основной интерфейс bond1 - не работает. И это портит всю красоту картины, тех же svlan несколько сотен и вешать по экземпляру на каждый - расточительство, да и смысл классового шейпера пропадает.

 

В данный момент обошел проблему с помощью ifb и заворота трафика с аплинк-порта, но IMHO это костыль для машины без PPP-тоннелей.

Как заставить tc понимать трафик с 2 метками и почему он собака видит трафик 1 меткой?

Дебажил в меру сил ситуацию, на интерфейсе bond1 не отрабатывают фильтры, такое ощущение что TC считает что этот трафик вообще не IP.

 

Вот кусок кусок конфига, использовал его для экспериментов

// корень с дефолтным классом без ограничений
qdisc add dev bond0.2 root handle 2 htb default d
class add dev bond0.2 root  htb rate 2000Mbit ceil 2000Mbit  quantum 65535
// не режем внутрисетевой трафик
class add dev bond0.2 parent 2:0 classid 2:7 htb rate 2000Mbit ceil 2000Mbit  quantum 65535
filter add dev bond0.2 parent 2:0 protocol ip u32 match ip dst xx.xx.164.0/22 flowid 2:7
filter add dev bond0.2 parent 2:0 protocol ip u32 match ip dst yy.yy.64.0/19  flowid 2:7
qdisc add dev bond0.2 parent 2:7 handle 7 pfifo  limit 10000

Смещения для всех полей задавал, в любых комбинациях и разных значений(0-4-8 байт) - никакой реакции.

 

Пробовал даже переписать в сыром виде согласно lartc, не работает:

class add dev bond1 parent 1:0 classid 1:7 htb rate 2000Mbit ceil 2000Mbit  quantum 65535
filter add dev bond1 parent 1:0 u32 match u32 0xXXXXa400 0xfffff000 at 20 flowid 1:7
filter add dev bond1 parent 1:0 u32 match u32 0xYYYY5000 0xfffff000 at 20 flowid 1:7
qdisc add dev bond1 parent 1:7 handle 7 pfifo  limit 10000

Изменено пользователем kayot

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Коряво описал свою хотелку, или никто таким не заморачивался?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

может смещения ip scr/dst надо поправить с учетом qinq?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Пробовал все комбинации, не в нем дело. Тем более на нетегированном и тегированном с 1 меткой работает вообще без правок.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

В чем вообще смысл такой оптимизации?

Дерево служит для ускорения выборки листа, но если дисциплина повешена на интерфейс, то проблемы с ее выборкой нет вообще.

Т.е. (теоретически) набор бесклассовых шейперов для клиентских интерфейсов будет (как минимум) не медленнее, чем общее дерево для бонда.

Но при этом имхо значительно проще в обслуживании.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

А фиг его знает нынче честно говоря. Раньше приоритезировали http и узкие внешние каналы делили между пользователями.

Нынче там классовость разве что для разделения на локальный и внешний трафик, наверное действительно проще все это выкосить и резать на клиентских вланах.

 

Да, вопрос вообще возник т.к. биллинг генерирует готовые конфиги на все сервера доступа(те самые классовые), и мне проще припинать то что уже работает а не пилить с нуля.

Изменено пользователем kayot

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Нынче там классовость разве что для разделения на локальный и внешний трафик,

На локале ответил. Маркировать трафик иптейблсом, и вешать 2 (или более) классов на ифейс дабы уменьшить кол-во создаваемых фильтров. Один класс - мир (можно с подклассами, дабы у абона при активно качающем торренте серфинг был мягким и шелковистым), один (или более) - локалка/IX/что там еще...

 

Да, в LEAF запилен подобный шейпер в пакете ppp-hsh, оттуда можно дернуть такую реализацию шейпера входящего трафика. Исход там через ifb+хеши (через скрипт-обертку из пакета hsh дергаются скорости классов).

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Тем более на нетегированном и тегированном с 1 меткой работает вообще без правок.

Там с 2 тегами начинается веселье - один тег "программный", второй может оффлоадиться NIC'ом, или два тега программных. Еще REORDER_HDR привносит веселья. Не то смещение - самое простое объяснение.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

filter add dev bond0.2 parent 2:0 protocol ip u32 match ip dst yy.yy.64.0/19 flowid 2:7

А если попробовать protocol all

Или конкретнее protocol 802.1Q (можно просто цифрами 0x8100)

Изменено пользователем SABRE

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

protocol all/any пробовал, нет такого варианта. Ну а 8100 врядли имеет смысл, не тот это протокол..

Изменено пользователем kayot

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

protocol all/any пробовал, нет такого варианта. Ну а 8100 врядли имеет смысл, не тот это протокол..

Странно. Специально проверил:

ip address show:

3: eth0.10@eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc htb state UP
   link/ether 00:11:00:00:00:06 brd ff:ff:ff:ff:ff:ff
4: eth0.10.20@eth0.10: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP
   link/ether 00:11:00:00:00:06 brd ff:ff:ff:ff:ff:ff
   inet 192.168.20.10/24 scope global eth0.10.20
   inet6 fe80::211:ff:fe00:6/64 scope link
      valid_lft forever preferred_lft forever

ip neigh show:

192.168.20.20 dev eth0.10.20 lladdr 00:aa:bb:cc:dd:ee PERMANENT

ping 192.168.20.20

tcpdump

[5015915.548333] device eth0 entered promiscuous mode
tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
15:00:13.401969 00:11:00:00:00:06 (oui Unknown) > 00:aa:bb:cc:dd:ee (oui Unknown), ethertype 802.1Q (0x8100), length 106: vlan 10, p 0, ethertype 802.1Q, vlan 20, 
p 0, ethertype IPv4, (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto ICMP (1), length 84)
   192.168.20.10 > 192.168.20.20: ICMP echo request, id 32723, seq 1, length 64
       0x0000:  00aa bbcc ddee 0011 0000 0006 8100 000a  ................
       0x0010:  8100 0014 0800 4500 0054 0000 4000 4001  ......E..T..@.@.
       0x0020:  913a c0a8 140a c0a8 1414 0800 bc95 7fd3  .:..............
       0x0030:  0001 cd4e 1752 0000 0000 1222 0600 0000  ...N.R....."....
       0x0040:  0000 1011 1213 1415 1617 1819 1a1b 1c1d  ................
       0x0050:  1e1f 2021 2223 2425 2627 2829 2a2b 2c2d  ...!"#$%&'()*+,-
       0x0060:  2e2f 3031 3233 3435 3637                 ./01234567
^C

Ну и главное

tc -s filter show dev eth0

root@asterisk:~# tc -s filter show dev eth0
filter parent 1: protocol ip pref 49144 u32
filter parent 1: protocol ip pref 49144 u32 fh 808: ht divisor 1
filter parent 1: protocol ip pref 49144 u32 fh 808::800 order 2048 key ht 808 bkt 0 terminal flowid ???  (rule hit 114 success 0)
 match c0a81414/ffffffff at 16 (success 0 )
       action order 1: gact action continue
        random type none pass val 0
        index 25 ref 1 bind 1 installed 71 sec used 71 sec
       Action statistics:
       Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0)
       backlog 0b 0p requeues 0

filter parent 1: protocol 802.1Q pref 49145 u32
filter parent 1: protocol 802.1Q pref 49145 u32 fh 807: ht divisor 1
filter parent 1: protocol 802.1Q pref 49145 u32 fh 807::800 order 2048 key ht 807 bkt 0 terminal flowid ???  (rule hit 63 success 63)
 match 000a0000/00ff0000 at -8 (success 63 )
       action order 33: gact action continue
        random type none pass val 0
        index 21 ref 1 bind 1 installed 14106 sec used 6 sec
       Action statistics:
       Sent 6678 bytes 63 pkt (dropped 0, overlimits 0 requeues 0)
       backlog 0b 0p requeues 0


filter parent 1: protocol 802.1Q pref 49148 u32
filter parent 1: protocol 802.1Q pref 49148 u32 fh 804: ht divisor 1
filter parent 1: protocol 802.1Q pref 49148 u32 fh 804::800 order 2048 key ht 804 bkt 0 terminal flowid ???  (rule hit 72 success 72)
 match 00140000/0fff0000 at -4 (success 72 )
       action order 129: gact action continue
        random type none pass val 0
        index 18 ref 1 bind 1 installed 14363 sec used 6 sec
       Action statistics:
       Sent 7632 bytes 72 pkt (dropped 0, overlimits 0 requeues 0)
       backlog 0b 0p requeues 0


filter parent 1: protocol 802.1Q pref 49152 u32
filter parent 1: protocol 802.1Q pref 49152 u32 fh 800: ht divisor 1
filter parent 1: protocol 802.1Q pref 49152 u32 fh 800::800 order 2048 key ht 800 bkt 0 terminal flowid ???  (rule hit 87 success 87)
 match c0a81414/ffffffff at 16 (success 87 )
       action order 257: gact action continue
        random type none pass val 0
        index 14 ref 1 bind 1 installed 14825 sec used 6 sec
       Action statistics:
       Sent 9222 bytes 87 pkt (dropped 0, overlimits 0 requeues 0)
       backlog 0b 0p requeues 0

Первый по порядку - protocol ip, match 192.168.20.20 at 16

Второй - protocol 802.1Q (0x8100), match по внешней метке VID 10

Третий - protocol 802.1Q (0x8100), match по внутренней метке VID 20

Четвертый - protocol 802.1Q (0x8100), match 192.168.20.20 at 16

 

Только-что попробовал

root@asterisk:~# tc filter add dev eth0 protocol any parent 1:0 u32 match u32 0xc0a81414 0xffffffff at 16 action continue
Error: argument "invalid protocol" is wrong: any

 

С all все в порядке:

root@asterisk:~# tc -s filter show dev eth0
filter parent 1: protocol all pref 49143 u32
filter parent 1: protocol all pref 49143 u32 fh 809: ht divisor 1
filter parent 1: protocol all pref 49143 u32 fh 809::800 order 2048 key ht 809 bkt 0 terminal flowid ???  (rule hit 66 success 16)
 match c0a81414/ffffffff at 16 (success 16 )
       action order 1: gact action continue
        random type none pass val 0
        index 26 ref 1 bind 1 installed 137 sec used 2 sec
       Action statistics:
       Sent 1696 bytes 16 pkt (dropped 0, overlimits 0 requeues 0)
       backlog 0b 0p requeues 0

Изменено пользователем SABRE

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Ну а 8100 врядли имеет смысл, не тот это протокол..

filter parent 1: protocol ip pref 49142 u32
filter parent 1: protocol ip pref 49142 u32 fh 80b: ht divisor 1
filter parent 1: protocol ip pref 49142 u32 fh 80b::800 order 2048 key ht 80b bkt 0 terminal flowid ???  (rule hit 3 success 3)
 match 00000000/00000000 at 0 (success 3 )
       action order 1: gact action continue
        random type none pass val 0
        index 28 ref 1 bind 1 installed 39 sec used 28 sec
       Action statistics:
       Sent 877 bytes 3 pkt (dropped 0, overlimits 0 requeues 0)
       backlog 0b 0p requeues 0

3 пакета - SSH. Пинговал 6-ю пакетами. Ни один не прошел. Параметр protocol указывает на тип пакета, который матчится u32. Для QinQ это именно 0х8100, а не IP (0х0800), вот правила и не работают.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Попробовал, работает с protocol all, не знаю как я до этого проверял. И даже смещения править не нужно.

Спасибо!

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

kayot А с 802.1Q? Смещения действительно править не нужно. Более того, на таком бутерброде:

root@asterisk:~# tcpdump -e -vvv  -XX -i eth0 ether dst 00:aa:bb:cc:dd:ee
tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
18:36:34.809490 00:11:00:00:00:06 (oui Unknown) > 00:aa:bb:cc:dd:ee (oui Unknown), ethertype 802.1Q (0x8100), length 110: vlan 10, p 0,
ethertype 802.1Q, vlan 20, p 0, ethertype 802.1Q, vlan 30, p 0, ethertype IPv4, (tos 0x0, ttl 64, id 0, offset 0, flags [DF], 
proto ICMP (1), length 84)
   192.168.20.10 > 192.168.20.20: ICMP echo request, id 809, seq 1, length 64
0x0000:  00aa bbcc ddee 0011 0000 0006 8100 000a  ................
0x0010:  8100 0014 8100 001e 0800 4500 0054 0000  ..........E..T..
0x0020:  4000 4001 913a c0a8 140a c0a8 1414 0800  @.@..:..........
0x0030:  2284 0329 0001 02d3 1852 0000 0000 ec59  "..).....R.....Y
0x0040:  0c00 0000 0000 1011 1213 1415 1617 1819  ................
0x0050:  1a1b 1c1d 1e1f 2021 2223 2425 2627 2829  .......!"#$%&'()
0x0060:  2a2b 2c2d 2e2f 3031 3233 3435 3637       *+,-./01234567
^C

Имя устройства eth0.10.20.30

Смещения так-же не нужно править, Отсчет всегда с начала IP.

Изменено пользователем SABRE

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Join the conversation

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

Гость
Ответить в тему...

×   Вставлено в виде отформатированного текста.   Вставить в виде обычного текста

  Разрешено не более 75 смайлов.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.