Сап, лор.
Есть необходимость модифицировать входящие/исходящие пакеты ip по некоторой логике (не NAT и прочее). Интернеты говорят, что для этого можно использовать nf queue или match-модуль для iptables. Для последнего нашлось несколько тестовых/примерных реализаций, напр, https://github.com/vt-alt/tripso. Этот проект оперирует достаточно сложными (в данном случае) вещами - метки безопасности, у них какой-то там формат и прочее, поэтому я сильно упростил код, чтобы просто понять, как оно работает. А оно не работает. Подробнее:
- Исходящие пакеты:
- Правим код, убираем проверки на наличие security options в заголовке ip и просто в
ip_hdr->check
пишем0
. Добавляем отладочный вывод, чтобы убедиться, что код отрабатывает. - Подключаем-запускаем
# iptables -t security -I OUTPUT -j TRIPSO --to-astra
- Сеть не фунциклирует, понятно.
# tcpdump -w ~/dump.pcap
, видим все исходящие пакеты сchecksum == 0
Т.е. для исходящих пакетов все работает.
- Входящие пакеты:
- Ребутим (не получилось корректно выгрузить, неважно), запускаем для входящих
# iptables -t security -I INPUT -j TRIPSO --to-cipso
- Сеть жива. tcpdump показывает, что все КС на месте, никаких нулей. dmesg показывает, что код модуля работает.
Т.е. для входящих пакетов код обработки вызывается, модифицирует пакет, а пакет волшебным образом идет дальше по стеку в первозданном виде.
Вариант # iptables -t raw -A PREROUTING -j TRIPSO --to-astra
счастья тоже не принес. Игры с -A и -I тоже.
TL;DR match-модуль для iptables модифицирует исходящие пакеты, но не входящие. Как модифицировать входящие пакеты? Ну или что я не так делаю? nf queue не предлагать.