Рейтинг:3

Фильтр полезной нагрузки Linux TCP

флаг ve

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

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

Рейтинг:0
флаг cl
A.B

Уже есть доступный код ядра, способный обрабатывать произвольное совпадение строк, все еще в контексте ядра во время пути пакета, почему бы не использовать его повторно? 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.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.