Linux TCP payload filter

Я использую nftables, но у него нет ничего похожего на iptables's string или u32 match, поэтому он не может надежно собирать смещение полезной нагрузки. Если не использовать nftables, то как я могу эффективно анализировать полезную нагрузку TCP без каких-либо узких мест в пространстве пользователя? (nfqueue не подходит по соображениям производительности)

Есть ли методы такой фильтрации на уровне ядра? Мне достаточно даже маркировки подходящих пакетов - все остальное можно легко сделать на уровне брандмауэра.

3
задан 21 August 2021 в 12:03
1 ответ

Уже доступен код ядра, способный обрабатывать произвольное совпадение строк, все еще в контексте ядра во время пути пакета, почему бы не использовать его повторно? iptables никуда не денется. Что может возможно когда-нибудь исчезнуть, так это устаревший API ядра для iptables, оставив только iptables-nft , который по-прежнему может использовать модули xtables. например string match module. Использование iptables-legacy или iptables-nft вместе с nftables даст тот же результат, что и ниже.

Можно использовать метки для передачи сообщений по различным сетевым подсистемам на пути пакета, в том числе от nftables до iptables, а затем обратно от iptables до nftables.

Эта таблица Приоритет в хуке может помочь:

Семейства nftables Типичные хуки Ключевое слово nft Значение Внутренний приоритет Netfilter Описание
[...]
inet, ip, ip6 все mangle -150 NF_IP_PRI_MANGLE операция Mangle
inet, ip, ip6 prerouting dstnat -100 NF_IP_PRI_NAT_DST NAT назначения
inet, 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-extensions(8)) смешивания nftables и iptables, где система должна отбрасывать локально инициированные DNS-запросы для конкретного DNS-адреса www.netfilter.org, представленный в порядке приоритета перехвата (предостережение: только UDP, работает только без наличия каких-либо опций/заголовков IPv4 или IPv6 в исходящем пакете из-за фиксированного диапазона, но диапазон может быть ослаблен, чтобы приспособиться к этому) :

nft add table inet mytable
nft add chain inet mytable outputbefore '{ type filter hook output priority -5; policy accept; }'
nft add rule inet mytable outputbefore udp dport 53 meta mark set 1

iptables -I OUTPUT -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 OUTPUT -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; policy accept; }'
nft add rule inet mytable outputafter meta mark 2 drop

Цель здесь состоит в том, чтобы iptables обрабатывал только ту часть, которая не может быть обработана nftables, и выполнял только минимальную работу: выдавал возвращаемое значение через метку, оставляя nftables ответственным за судьбу пакета:

  • nftables устанавливает метку пакета в 1, чтобы «попросить» iptables выполнить некоторую работу
  • iptables (или ip6tables) выполняет сопоставление строк, только если он «получил» отметку 1, чтобы сэкономить ресурсы ЦП, и «отвечает» 2, если строка совпала в таком случае
  • nftables отбрасывает пакет только в том случае, если он «получил» отметку со значением 2 (таким образом, удаление правил iptables также отключает эффект)

Примечания:

  • Предостережение

    Механизм связи между nftables и iptables осуществляется с помощью меток пакетов (или также может быть с помощью меток conntrack). Хотя можно записывать и читать только из нескольких битов метки (используя необязательную маску для метки и адекватные побитовые операции), каждый пользователь меток должен затем соблюдать некоторые соглашения о распределении для владения битами в метке. Без этого инструменты будут мешать друг другу при обработке меток.Например, firewalld использует метки для обработки перенаправлений в правилах, поэтому этот пример может быть несовместим с firewalld, даже если он использует свои собственные таблицы при использовании nftables. бэкенд.

  • В некоторых простых случаях могут использоваться необработанные полезные данные

    Этот конкретный пример выше, с фиксированными смещениями, мог быть реализован с nftables. Это когда есть произвольное смещение для поиска данных (лучше всего использовать с совпадением string iptables) или сложный метод для вычисления такого смещения (лучше всего использовать с совпадением iptables u32), что nftables использовать нельзя.

    Это равносильно замене всех вышеперечисленных правил одним правилом, использующим необработанные полезные данные. Синтаксис допускает максимум 128 бит, но здесь требуется 19x8 = 152 бита, поэтому его необходимо разделить на две необработанные полезные данные (128 бит + 24 бита). printf, xxd и cut также используются для некоторой помощи:

    nft add table 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 | ххд -р | вырезать -c33-) \
    уронить
    

    С выводом printf '\3%s\11%s\3%s\0' www netfilter org | xxd -p равно:

     03777777096e657466696c746572036f726700
    

    чтобы получить две необработанные полезные нагрузки:

     0x03777777096e657466696c746572036f
    0x726700
    
  • Вероятно, доступны и другие методы

    • iptables может вызывать объект eBPF (в любом случае, только последние версии ядер позволяют использовать (конечные) циклы для простой реализации некоторых алгоритмов), nftables не имеет этой функции. Итак, снова с отметкой и iptables.

    • такой объект eBPF можно использовать с XDP или tc, но он может находиться слишком рано в пути пакета (например, NAT с отслеживанием состояния недоступен) и требует фактического программирования а не администрации. В любом случае это снова связь через метку, если решения должны обрабатываться с помощью nftables.

0
ответ дан 21 August 2021 в 21:13

Теги

Похожие вопросы