Linux Advanced Routing & Traffic Control HOWTO (Hubert, Graf) - страница 58

, т.е. первым указывается старший байт. Таким образом мы получаем номер порта назначения — 0x0016, или 22 (в десятичной форме). В случае протокола TCP, этот порт соответствует службе SSH. Надеюсь вы понимаете, что данное соответствие бессмысленно обсуждать вне контекста применения, поэтому отложим эту дискуссию на более позднее время.

Уловив все, что говорилось выше, вы без труда поймете смысл следующего селектора: match c0a80100 ffffff00 at 16. Данный селектор будет пытаться найти 3-х байтовую последовательность в IP-заголовке, начиная с 17-го байта, отсчитываемого от начала заголовка, что соответствует любому адресу назначения в сети 192.168.1.0/24.

12.1.2. Селекторы общего назначения.

Селекторы общего назначения задают шаблон, маску и смещение. Используя эти селекторы вы сможете выполнять проверку практически любого, отдельно взятого бита в заголовке IP (или протокола более высокого уровня). При написании и чтении они более сложны, чем селекторы специального назначения, которые будут обсуждаться в следующем разделе. Синтаксис селекторов общего назначения:

>match [ u32 | u16 | u8 ] PATTERN MASK [ at OFFSET | nexthdr+OFFSET]

Ключевое слово u32, или u16, или u8 указывает длину шаблона в битах. PATTERN и MASK в обязательном порядке должны иметь длину, указанную в предыдущем ключевом слове. Параметр OFFSET задает смещение от начала заголовка в байтах. Если присутствует ключевое слово nexthdr+, то смещение начинает отсчитываться от начала заголовка протокола более высокого уровня.

Приведем несколько примеров:

Этим селектором будут отобраны пакеты, у которых "время жизни" (поле TTL) равно 64. Поле TTL находится в 9-м (в 8-м, если считать с нуля) байте IP-заголовка.

># tc filter add dev ppp14 parent 1:0 prio 10 u32 \

> match u8 64 0xff at 8 \

> flowid 1:4

Следующие селекторы отберут TCP-пакеты, в которых установлен бит ACK:

># tc filter add dev ppp14 parent 1:0 prio 10 u32 \

> match ip protocol 6 0xff \

> match u8 0x10 0xff at nexthdr+13 \

> flowid 1:3

Отбор ACK-пакетов, длина которых меньше 64 байт:

>## отбор ack-пакетов более сложным способом,

>## IP protocol 6,

>## Длина IP-заголовка 0x5 (32-х битных слов),

>## Общая длина 0x34 (ACK + 12 байт опций TCP)

>## TCP ACK (бит 5, смещение 33)

># tc filter add dev ppp14 parent 1:0 protocol ip prio 10 u32 \

>            match ip protocol 6 0xff \

>            match u8 0x05 0x0f at 0 \

>            match u16 0x0000 0xffc0 at 2 \

>            match u8 0x10 0xff at 33 \

>            flowid 1:3

Это правило отберет пакеты TCP, с установленным битом ACK, и не несущие в себе данных. Это яркий пример использования двух селекторов. Конечный результат будет получен логическим умножением (операция "И") результатов каждого из селекторов. Если вы посмотрите на диаграмму TCP-заголовка, то увидите, что флаг ACK — это младший бит старшей тетрады (0x10) 14-го байта в TCP-заголовке (