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.