Можно ли написать правило nftables, которое фильтрует байтовые значения со смещением в полезной нагрузке UDP? Я могу сделать это, используя очередь netfilter в пользовательском пространстве, но мне интересно, есть ли выражение, которое можно использовать в реальном правиле.
Да, вы можете сделать это, используя необработанные полезные данные nftables, пока он находится в фиксированных местах (вы не получите функции переменного положения iptables ' строка совпадение, ни все iptables ' u32 сопоставить функции, но не его сложность, особенно проще с пакетами TCP, имеющими параметры TCP). На самом деле вы даже можете изменить это с достаточно свежим ядром (> = 4.10). Конечно, размер не может измениться.
Пример: при получении пакетов порта назначения UDP 5555 замените, если они обнаружены в смещениях данных 3-5, 3 байта 0x66 0x6F 0x6F ("foo") на 3 байта в смещениях данных 0-2 в том же пакете. Значения указаны в битах, а не в байтах, а данные UDP - через 64 бита после Заголовок UDP (@th), следовательно, позиция 64 + 3 * 8 = 88, размер 3 * 8 = 24, чтобы заменить на позицию 64 размер 24:
# nft add table inet myfilter
# nft add chain inet myfilter myinputmangle '{ type filter hook input priority 0; policy accept; }'
# nft add rule inet myfilter myinputmangle udp dport 5555 @th,88,24 0x666f6f @th,88,24 set @th,64,24