Каков правильный синтаксис для сопоставления фрагментов со смещением> 0 в tc?
Я пытался:
... u32 match u8 255 ff at 7 flowid 2:1
Но безрезультатно
Согласно Заголовок IPv4 Формат (не дайте себя обмануть нумерацией при размышлении над битами позже), вы должны сравнить 13 младших битов объединенных двух байтов по смещению 6 и 7.
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|Version| IHL |Type of Service| Total Length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Identification |Flags| Fragment Offset |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Time to Live | Protocol | Header Checksum |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Source Address |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Destination Address |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Options | Padding |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Так что это не может быть сопоставлено с u8 но требует например u16. Также, tc u32 кажется, не хватает не логический оператор, поэтому он может только надежно сопоставлять пакеты без смещение фрагмента (или пакеты без смещения, но с установленным MF и т. д.) в одном правиле. Для этого есть даже сокращения, если вы также хотите включить флаг MF в проверку:
... u32 match ip nofrag flowid 2:1 # would match the opposite of what's wanted
без флага MF:
... protocol ip u32 match u16 0 0x1fff flowid 2:1
Таким образом, вы можете использовать два фильтра, чтобы инвертировать логику, первый фильтр, чтобы обойти второй (вы можете дополнить действие с другим плавный если нужно):
... prio 1 protocol ip u32 match u16 0 0x1fff action pass
... prio 2 protocol ip matchall flowid 2:1
или вы можете полностью изменить модуль фильтра и использовать tc basicс состязаться функции, которые включают логические операторы, такие как не, таким образом достигнув цели в одном фильтре:
... protocol ip basic match 'not cmp(u16 at 6 layer network mask 0x1fff eq 0)' flowid 2:1