12.5.3. Использование селектора u32 для пакетов IPv6.
Для передачи по сетям IPv4, трафик IPv6 обычно инкапсулируется в SIT–туннель. За дополнительной информацией по созданию такого рода туннелей, обращайтесь к разделу Тоннелирование IPv6. Это позволяет выполнять фильтрацию IPv4-пакетов, которые, в качестве полезной нагрузки, несут пакеты IPv6.
Следующий фильтр отберет все пакеты IPv6, инкапсулированные в IPv4:
># tc filter add dev $DEV parent 10:0 protocol ip prio 10 u32 \
> match ip protocol 41 0xff flowid 42:42
Продолжим в том же духе. Предположим, что пакеты IPv6 передаются по сети IPv4, и не имеют набора опций. Тогда, для обнаружения пакетов ICMPv6 можно использовать следующий фильтр. 0x3a (58) — Next-Header для ICMPv6.
># tc filter add dev $DEV parent 10:0 protocol ip prio 10 u32 \
> match ip protocol 41 0xff \
> match u8 0x05 0x0f at 0 \
> match u8 0x3a 0xff at 26 \
> flowid 42:42
Фильтрация по адресу получателя потребует от нас дополнительных усилий. Например, следующий фильтр отбирает пакеты с адресом получателя 3ffe:202c:ffff:32:230:4fff:fe08:358d:
># tc filter add dev $DEV parent 10:0 protocol ip prio 10 u32 \
> match ip protocol 41 0xff \
> match u8 0x05 0x0f at 0 \
> match u8 0x3f 0xff at 44 \
> match u8 0xfe 0xff at 45 \
> match u8 0x20 0xff at 46 \
> match u8 0x2c 0xff at 47 \
> match u8 0xff 0xff at 48 \
> match u8 0xff 0xff at 49 \
> match u8 0x00 0xff at 50 \
> match u8 0x32 0xff at 51 \
> match u8 0x02 0xff at 52 \
> match u8 0x30 0xff at 53 \
> match u8 0x4f 0xff at 54 \
> match u8 0xff 0xff at 55 \
> match u8 0xfe 0xff at 56 \
> match u8 0x08 0xff at 57 \
> match u8 0x35 0xff at 58 \
> match u8 0x8d 0xff at 59 \
> flowid 10:13
Эту же методику можно использовать для отбора по адресу подсети, например 2001:
># tc filter add dev $DEV parent 10:0 protocol ip prio 10 u32 \
> match ip protocol 41 0xff \
> match u8 0x05 0x0f at 0 \
> match u8 0x20 0xff at 28 \
> match u8 0x01 0xff at 29 \
> flowid 10:13