># tc filter add dev eth1 parent 1:0 prio 5 protocol ip u32
># tc filter add dev eth1 parent 1:0 prio 5 handle 2: protocol ip u32 divisor 256
После этого добавляются правила в созданные таблицы:
># tc filter add dev eth1 protocol ip parent 1:0 prio 5 u32 ht 2:7b: \
> match ip src 1.2.0.123 flowid 1:1
># tc filter add dev eth1 protocol ip parent 1:0 prio 5 u32 ht 2:7b: \
> match ip src 1.2.1.123 flowid 1:2
># tc filter add dev eth1 protocol ip parent 1:0 prio 5 u32 ht 2:7b: \
> match ip src 1.2.3.123 flowid 1:3
># tc filter add dev eth1 protocol ip parent 1:0 prio 5 u32 ht 2:7b: \
> match ip src 1.2.4.123 flowid 1:2
Это записи в таблице с номером 123, которые выполняют проверку на принадлежность адресам 1.2.0.123, 1.2.1.123, 1.2.2.123, 1.2.3.123, и в случае совпадения передают пакеты в классы 1:1, 1:2, 1:3 и 1:2 соответственно. Обратите внимание на то, как задается номер таблицы, шестнадцатеричное число 0x7b соответствует числу 123, в десятичном представлении.
И наконец создается хеш-фильтр, который перенаправит трафик в нужную таблицу:
># tc filter add dev eth1 protocol ip parent 1:0 prio 5 u32 ht 800:: \
> match ip src 1.2.0.0/16 \
> hashkey mask 0x000000ff at 12 \
> link 2:
А теперь поясним некоторые моменты. Заданной по-умолчанию хеш-таблице присвоен идентификатор 800:: и вся фильтрация начинается отсюда. Затем выбирается IP-адрес отправителя, который находится в 12, 13, 14 и 15 байтах в IP-заголовке и указывается, что нас интересует только последний байт. После чего трафик передается в хеш-таблицу 2:, которая была создана ранее.
Все это выглядит довольно сложным, но действительно работает и дает ошеломляющую производительность. Обратите внимание, этот пример может быть оптимизирован еще больше и сведен к идеальному случаю, когда каждая цепочка содержит 1 фильтр!
12.5. Фильтрация трафика IPv6.
12.5.1. Почему не работают tc-фильтры в IPv6?
Дело в том, что в ядре Linux, модель маршрутизации и адресации IPv4 (замечательные особенности которой описывает этот HOWTO) строилась на основе Базы Политик Маршрутизации (RPDB — Routing Policy Database). К сожалению, модель IPv6 в Linux была реализована совершенно иным образом. Хотя они используют совместно некоторые средства, но основа основ — RPDB, не принимает участия в адресации и маршрутизации IPv6.
Надеюсь, что такое положение дел наверняка изменится, надо только подождать.
FIXME: : Ждем ваших замечаний и предложений по этому поводу, может кто-то работает над этим?
12.5.2. Маркировка пакетов IPv6 средствами ip6tables.
ip6tables имеет возможность пометить пакеты: