Я ищу утилиту Linux, которая может изменять полезные нагрузки сетевых пакетов на основе набора правил. В идеале, я бы использовал iptables
и модуль ядра netfilter
, но они не поддерживают универсальное распределение полезной нагрузки: iptables
изменяет различные поля заголовка (адреса, порты, TOS и т.д.) И может совпадать с произвольным байт в пакете, но, очевидно, он не может изменить произвольные данные в пакете.
Модуль ядра был бы большим плюсом, так как эффективность является проблемой, но я рад изучить любые другие варианты, которые могли бы выполнить работу.
Спасибо за ваши идеи!
Долгожданное обновление:
Мы решили использовать модуль NFQUEUE
, который является последней реализацией модулей QUEUE, предложенных Робертом Гэмблом. Выглядело это довольно просто, с бонусом за безопасность, позволяющим запускать наш код в пространстве пользователя, а не ядра.
Реализация была бы почти тривиальной, если бы мы просто хотели изменить полезную нагрузку без изменения ее размера. В этом случае мы определим правило iptables
, чтобы выбрать для нас "интересные" пакеты и отправить им цель NFQUEUE
. Мы напишем функцию обратного вызова, которая будет проверять пакеты из NFQUEUE
, изменять данные по мере необходимости и пересчитывать контрольные суммы в их заголовках TCP и IP.
Тем не менее, наш вариант использования включает в себя добавление дополнительных символов в поток данных. Это имеет несколько очевидный побочный эффект увеличения соответствующих номеров SEQ/ACK в потоке TCP, и не столь очевидный побочный эффект - достаточно запутывает модуль conntrack
, что он полностью нарушает NAT, После многих исследований, расчесывания голов и экспериментов наиболее целесообразным решением было отключить отслеживание соединений для этих конкретных пакетов (с целью NOTRACK
в таблице raw
) и обработать это в нашем обратном вызове. Сохрани свои помидоры и ненавидь почту; Я нисколько не горжусь тем, что позволил вам скрыться, но это был единственный способ доставить покупателю надежный продукт до следующего ледникового периода. И это хорошая история. Но я искренне ценю и разделяю ваши искренние чувства.
Версия 2 будет использовать наше новое просвещение, заменив наш обратный вызов и несколько правил iptables
на собственный NAT и/или conntrack
помощник. Мы уверены, что данное упражнение дало нам достаточно опыта для создания модуля ядра, который органично вписался бы в архитектуру сетевого фильтра для решения проблем, с которыми мы столкнулись.