на главную | войти | регистрация | DMCA | контакты | справка | donate |      

A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
А Б В Г Д Е Ж З И Й К Л М Н О П Р С Т У Ф Х Ц Ч Ш Щ Э Ю Я


моя полка | жанры | рекомендуем | рейтинг книг | рейтинг авторов | впечатления | новое | форум | сборники | читалки | авторам | добавить



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-заголовке (at nexthdr+13). Что касается второго селектора, то если бы мы хотели усложнить себе жизнь, можно было бы записать match u8 0x06 0xff at 9, вместо специального селектора protocol tcp (здесь число 6 — это номер протокола TCP), в 10-м байте IP-заголовка. С другой стороны, в этом примере мы не использовали специальный селектор, для отбора по биту ACK, просто потому, что такого селектора не существует.

Фильтр, приведенный ниже, является модификацией предыдущего примера. На этот раз не производится проверка длины IP-заголовка. Вы спросите — почему? Потому, что фильтр, приведенный выше, работает только на 32-х битных системах.

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

 match ip protocol 6 0xff \

 match u8 0x10 0xff at nexthdr+13 \

 match u16 0x0000 0xffc0 at 2 \

 flowid 1:3


12.1.1. Селектор u32. | Linux Advanced Routing & Traffic Control HOWTO | 12.1.3. Селекторы специального назначения.