tc u32 - як співставити протоколи L2 в останніх ядрах?


12

У мене є гарний формувач, з хеш-фільтруванням, побудований на мосту Linux. Коротше кажучи, br0підключення externalта internalфізичні інтерфейси, пакети з тегами VLAN мостикуються "прозоро" (я маю на увазі, що VLAN-інтерфейсів немає).

Тепер різні ядра роблять це по-різному. Я можу помилятися з точними діапазонами версій ядра, пробачте, будь ласка. Дякую.

2.6.26

Отже, в debian, 2.6.26 і вище (до 2.6.32, я вважаю) --- це працює:

tc filter add dev internal protocol 802.1q parent 1:0 prio 100 \
    u32 ht 1:64 match ip dst 192.168.1.100 flowid 1:200

Тут "ядро" відповідає двом байтам у полі "протокол" з 0x8100, але зараховує початок ip-пакету як "нульову позицію" (вибачте за мою англійську, якщо я трохи незрозумілий).

2.6.32

Знову ж таки, у debian (я не створив ванільне ядро), 2.6.32-5 --- це працює:

tc filter add dev internal protocol 802.1q parent 1:0 prio 100 \
    u32 ht 1:64 match ip dst 192.168.1.100 at 20 flowid 1:200

Тут "ядро" збігається з аналогічним для протоколу, але рахує зсув з початку заголовка цього протоколу --- я повинен додати 4 байти для зміщення (20, а не 16 для адреси dst). Це нормально, здається більш логічним, як на мене.

3.2.11, остання стабільна зараз

Це працює --- так, ніби тег 802.1q взагалі немає:

tc filter add dev internal protocol ip parent 1:0 prio 100 \
    u32 ht 1:64 match ip dst 192.168.1.100 flowid 1:200

Проблема полягає в тому, що я не зміг знайти спосіб відповідати тегу 802.1q.

Відповідність тегу 802.1q минулого

Я міг би це зробити раніше:

tc filter add dev internal protocol 802.1q parent 1:0 prio 100 \
    u32 match u16 0x0ed8 0x0fff at -4 flowid 1:300

Зараз я не в змозі відповідати 802.1q тег at 0, at -2, at -4, at -6або , як це. Основне питання , який у мене є нуль хітів розраховувати --- цей фільтр не перевіряється на всіх, «неправильний протокол», іншими словами.

Будь ласка, будь-хто, допоможіть мені :-)

Дякую!

Відповіді:


4

Тег VLAN позбавлений Skb в останніх ядрах. Спробуйте щось подібне, щоб зробити мета-відповідність у skb:

tc filter add dev internal protocol all parent 1:0 prio 100 basic match 'meta(vlan mask 0xfff eq 0x0ed8)' flowid 1:300

Спроба додати кореневий фільтр для protocol allдає мені RTNETLINK answers: Invalid argument(тут ядро ​​3.3.4). Я протестую це з новими ядрами. Дякую.
— броунів

Це працювало для мене з debian wheezy ядром 3.2.0. Я додав ще одну відповідь з повними деталями.
— Нік Крейг-Вуд

3

Мені довелося робити саме це. Я виявив, що відповідь, запропонована @Thusitha, був правильним способом зробити це для нових ядер.

Тестовано з хрипким ядром 3.2.0-4 Debian та iproute (звідки походить команда tc) версії 20120521-3 + b3

Ось повний сценарій, tc filterрядки майже точно такі, як вказано @Thusitha

function qos() {
    if="$1"
    vlan1="$2"
    vlan2="$3"

    # delete previous
    tc qdisc del dev $if root >/dev/null 2>&1
    tc qdisc del dev $if ingress >/dev/null 2>&1

    # Root HTB for $if
    tc qdisc add dev $if root handle 1: htb r2q 1 default 1

    # Root class to borrow from
    tc class add dev $if parent 1: classid 1:1 htb quantum 1000000 rate 500mbit ceil 500mbit burst 64k prio 2
    tc qdisc add dev $if parent 1:1 handle 101 sfq perturb 10

    # class for vlan1
    tc class add dev $if parent 1:1 classid 1:106 htb quantum 1000000 rate 1.00mbit ceil 1.00mbit burst 6k
    tc qdisc add dev $if parent 1:106 handle 107 sfq perturb 10
    tc filter add dev $if protocol all parent 1: prio 100 basic match "meta(vlan mask 0xfff eq ${vlan1})" flowid 1:106

    # class for vlan2
    tc class add dev $if parent 1:1 classid 1:108 htb quantum 1000000 rate 1.00mbit ceil 10.00mbit burst 6k
    tc qdisc add dev $if parent 1:108 handle 108 sfq perturb 10
    tc filter add dev $if protocol all parent 1: prio 100 basic match "meta(vlan mask 0xfff eq ${vlan2})" flowid 1:108

}

qos eth1 1234 1235
qos eth2 2345 2346

Дивно, protocol allпомилка в ядрі ванілі. Я повинен це перевірити більше. Дякую.
— броунівський

1

Я рекомендую використовувати wireshark для того, щоб зафіксувати те, що відбувається через інтерфейс, як видно в просторі користувачів, і використовувати його для написання фільтра. Мені цікаво, чи можливо інтерфейс з якихось причин знімає теги VLAN (не дивлячись на те, що він налаштований на прозорий міст). Можливо, це додавання зайвих тегів чи щось таке?


Ні, це не знімання тегів VLAN, безумовно - все працює (трафік перемикається через магістралі на апаратних комутаторах), за винятком фільтрів у формувальнику. Я придивляюся, однак, ближче. Я переглянув можливість завантаження тегів VLAN, але ці драйвери не здатні виконувати види завантаження.
— броунівський

tcpdumpпоказує ідентифікатори vlan на всіх інтерфейсах bridgeта портах.
— броунів

Тепер мій хороший формувач працює під Linux ядро ​​3.3.4, все чудово працює, крім фільтрації тегів 8021q (я можу жити без нього). Проблема залишається невирішеною. В будь-якому випадку, дякую.
— броунів

1

Ви можете позначити пачки Vlan за допомогою ebtables .

# mark packets according to the vlan id
ebtables -i br0 -A PREROUTING -p 802_1Q --vlan-id 1 -j mark --mark-set 1
ebtables -i br0 -A PREROUTING -p 802_1Q --vlan-id 5 -j mark --mark-set 2

Потім нанесіть форму на основі маркування. ebtables та iptables мають однакове маркування.

Я цього ще не робив. Тож це скоріше придумка.


Я сумніваюся, він буде працювати безперебійно на посиланні 10Gb ... Я хотів би уникати будь-яких * таблиць. Дякуємо за пропозицію в будь-якому випадку.
— броунівський

@brownian Ви думаєте, що виконання точно такої ж фільтрації в iproute2 матиме більш високу продуктивність? Це те саме ядро, той самий шлях коду, ті ж алгоритми. Поки ви випадково не зробите щось, як увімкнути відстеження з'єднання, ви не повинні бачити різниці. * таблиці можуть впливати на продуктивність, оскільки вони можуть робити багато складних речей. Але це не означає, що це буде .
— tylerl

@tylerl Так як я на самом деле доведеться фільтр з iproute2 (сотні клієнтів в одній і тій же VLAN, купа фільтрів хеш) - будь-який інший додаткової перевірки для кожного пакету буде впливати на продуктивність, я вважаю.
— броунів

0

Спробуйте вимкнути reorder_hdrопцію в інтерфейсі vlan. Якщо параметр заголовка впорядкування включений, теги з кадрів видаляються. Перевірте це за командою ip -d link list dev vlan_iface.


1
Будь ласка, чи можете ви уточнити, коли він видаляється та коли він вставляється назад? Я маю на увазі, що позначений кадр входить в міст Linux і потім залишає його з іншого інтерфейсу - коли / де відбуваються ці маніпуляції з тегами та коли / де tcвикликаються фільтри? У вас є посилання на карту чи подібне? Дякую!
— броунів

Будь ласка, ще одна думка: про який інтерфейс vlan ви маєте на увазі? На цьому мості немає жодного інтерфейсу vlan (у першому абзаці я написав "я маю на увазі, немає інтерфейсів VLAN").
— броунівський
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.