Уже есть доступный код ядра, способный обрабатывать произвольное совпадение строк, все еще в контексте ядра во время пути пакета, почему бы не использовать его повторно?
iptables никуда не денется. Что может может быть исчезнуть когда-нибудь — это устаревший API ядра для iptables, осталось только iptables-nft вокруг, все еще в состоянии использовать xtables такие модули, как нить соответствовать модуль. С использованием iptables-legacy или же iptables-nft вдоль nftables будет иметь тот же результат ниже.
Можно использовать метки для передачи сообщений по различным сетевым подсистемам на пути пакета, в том числе от nftables к iptables а потом обратно из iptables к nftables.
Этот Приоритет внутри хука таблица может помочь:
Семьи |
Типичные крючки |
ключевое слово |
Стоимость |
Внутренний приоритет Netfilter |
Описание |
[...] |
|
|
|
|
|
инет, ip, ip6 |
все |
калечить |
-150 |
NF_IP_PRI_MANGLE |
Мангл операция |
инет, ip, ip6 |
предварительная маршрутизация |
дстнат |
-100 |
NF_IP_PRI_NAT_DST |
NAT назначения |
инет, ip, ip6, arp, netdev |
все |
фильтр |
0 |
NF_IP_PRI_FILTER |
Операция фильтрации, таблица фильтров |
[...] |
|
|
|
|
|
Просто нужно зарегистрироваться nftables дважды для каждого iptables' встроенная цепочка для участия: один раз с приоритетом непосредственно перед iptables', один раз с приоритетом сразу после iptables'. Например, с цепочкой filter/OUTPUT с iptables приоритет 0, вокруг него можно использовать -5 и 5. Подробнее в эти два Unix/Linux SE Q/A, где я дал ответы.
Искусственный пример (адаптировано из примера в iptables-расширения (8)
) смешение nftables и iptables, где система должна отбрасывать локально инициированные DNS-запросы для определенного DNS-адреса. www.netfilter.org, представленный в порядке приоритета перехвата (предостережение: только UDP, работает только без наличия каких-либо опций/заголовков IPv4 или IPv6 в исходящем пакете из-за фиксированного диапазона, но диапазон может быть ослаблен, чтобы приспособиться к этому):
nft добавить таблицу inet mytable
nft add chain inet mytable outputbefore '{ введите приоритет вывода обработчика фильтра -5; политика принять; }'
nft добавить правило inet mytable outputbefore udp dport 53 meta mark set 1
iptables -I ВЫВОД -m mark --mark 1 -m string --algo bm --from 40 --to 57 --hex-string '|03|www|09|netfilter|03|org|00|' -j MARK --set-mark 2
ip6tables -I ВЫВОД -m mark --mark 1 -m string --algo bm --from 60 --to 77 --hex-string '|03|www|09|netfilter|03|org|00|' -j MARK --set-mark 2
nft add chain inet mytable outputafter '{ type filter hook output priority 5; политика принять; }'
nft добавить правило inet mytable outputafter метаметка 2 drop
Цель здесь состоит в том, чтобы иметь iptables обрабатывать только ту часть, которая не может быть обработана nftables и сделать только минимальную работу: выдать возвращаемое значение через метку, оставив обратно nftables отвечающий за судьбу пакета:
- nftables устанавливает метку пакета на 1, чтобы «спросить» iptables выполнить какую-то работу
- iptables (или же ip6tables) выполняет сопоставление строки только в том случае, если он «получил» отметку 1, чтобы сэкономить ресурсы ЦП, и «отвечает» 2, если строка совпала в таком случае.
- nftables отбрасывает пакет только в том случае, если он «получил» метку со значением 2 (таким образом удаляя iptables rules также отключает эффект)
Примечания:
Предостережение
Механизм связи между nftables и iptables проходит через метки пакетов (или также может проходить через коннтрек коннмарки). Хотя можно записывать и читать только из нескольких битов метки (используя необязательную маску для метки и адекватные побитовые операции), каждый пользователь меток должен затем соблюдать некоторые соглашения о распределении для владения битами в метке. Без этого инструменты будут мешать друг другу при обработке меток. Например брандмауэр использует метки для обработки перенаправлений в правилах, поэтому этот пример может быть несовместим с брандмауэр, даже если он использует свои собственные таблицы при использовании nftables бэкенд.
В некоторых простых случаях можно использовать необработанные полезные нагрузки
Этот конкретный пример выше, с исправлено смещения, могли быть реализованы с nftables. Это когда есть произвольное смещение для поиска данных (лучше всего использовать с iptables). нить match) или сложный метод вычисления такого смещения (лучше всего использовать с iptables). U32 совпадают) что nftables нельзя использовать.
Вот эквивалентная замена всех правил выше одним правилом, использующим необработанные полезные данные. Синтаксис допускает максимум 128 бит, но здесь требуется 19x8 = 152 бита, поэтому его необходимо разделить на две необработанные полезные данные (128 бит + 24 бита). printf
, ххд
и резать
также используются для некоторой помощи:
nft добавить таблицу inet mytable
nft add chain inet mytable output '{ type filter hook output priority 0; политика принять; }'
nft добавить вывод inet mytable udp dport 53 \
@th,160,128 0x$(printf '\3%s\11%s\3%s\0' www netfilter org | xxd -p | cut -c-32) \
@th,288,24 0x$(printf '\3%s\11%s\3%s\0' www netfilter org | xxd -p | cut -c33-) \
уронить
С выходом printf '\3%s\11%s\3%s\0' www netfilter org | ххд -р
существование:
03777777096e657466696c746572036f726700
чтобы получить две необработанные полезные нагрузки:
0x03777777096e657466696c746572036f
0x726700
другие методы, вероятно, доступны
iptables может вызывать объект eBPF (в любом случае только последние ядра позволяют (конечным) циклам легко пытаться реализовать некоторые алгоритмы), nftables не хватает этой функции. Итак, снова с отметкой и iptables.
такой объект eBPF может быть используется с XDP или же тк но это может быть слишком рано в пути пакета (например, нет доступного NAT с отслеживанием состояния) и требует фактического программирования, а не администрирования. В любом случае, это снова общение через метку, если решения должны приниматься с nftables.