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