Я передаю пакеты UDP размером, скажем, 2900 байт. Из-за фрагментации пакет делится на 2 IP-фрагмента. Мой фильтр tc u32 (бит большего количества фрагментов и комбинация IP / PORT) соответствует только первому фрагменту, а второй фрагмент не соответствует.
Как я могу сопоставить последний фрагмент, также используя фильтр. Меня устраивает фильтр tc или iptables rul
Вы не можете. Загрузите файл nf_conntrack_ipv4. Этот модуль дефрагментирует пакеты, после чего ваше правило должно работать.
Вы не можете. Загрузите файл nf_conntrack_ipv4. Этот модуль дефрагментирует пакеты, после чего ваше правило должно работать.
Это неправда.
Когда pkt отправляется локально, nf_conntrack_ipv4 не будет дефрагментировать фрагменты pkt. Потому что ловушка NF_INET_LOCAL_OUT (где вызывает ipv4_conntrack_defrag) находится до того, как произойдет фрагментация.
Если UFO или udp gso включены, tc filter будет соответствовать всему pkt (а не фрагментам). Порт UDP в фильтре tc действителен.
Если отключено, фрагменты совпадают. Порт UDP в большинстве случаев находится в первом фрагменте. Таким образом, вы не можете сопоставить второй фрагмент с портом, вы можете использовать только ip и протокол.
UFO и udp gso зависят от версии вашего ядра и nic (для UFO).
Поддержка ядра UFO удаляется, когда ядро> = 4.14
Udp gso добавляется, когда ядро> = 4.18