Назад | Перейти на главную страницу

tc соответствует смещению фрагмента IPv4

Каков правильный синтаксис для сопоставления фрагментов со смещением> 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