LINUX.ORG.RU

Модификация заголовков входящих IPv4 пакетов через iptables

 ,


1

1

Сап, лор.

Есть необходимость модифицировать входящие/исходящие пакеты ip по некоторой логике (не NAT и прочее). Интернеты говорят, что для этого можно использовать nf queue или match-модуль для iptables. Для последнего нашлось несколько тестовых/примерных реализаций, напр, https://github.com/vt-alt/tripso. Этот проект оперирует достаточно сложными (в данном случае) вещами - метки безопасности, у них какой-то там формат и прочее, поэтому я сильно упростил код, чтобы просто понять, как оно работает. А оно не работает. Подробнее:

  1. Исходящие пакеты:
  • Правим код, убираем проверки на наличие security options в заголовке ip и просто в ip_hdr->check пишем 0. Добавляем отладочный вывод, чтобы убедиться, что код отрабатывает.
  • Подключаем-запускаем # iptables -t security -I OUTPUT -j TRIPSO --to-astra
  • Сеть не фунциклирует, понятно. # tcpdump -w ~/dump.pcap, видим все исходящие пакеты с checksum == 0

Т.е. для исходящих пакетов все работает.

  1. Входящие пакеты:
  • Ребутим (не получилось корректно выгрузить, неважно), запускаем для входящих # 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 не предлагать.



Последнее исправление: leet27 (всего исправлений: 1)

IMHO Для модификации пакетов можно воспользоваться двумя способами:

  • iproute2 tc filter (см. CONFIG_NET_ACT_PEDIT)

  • iptables table mangle (см. как пример CONFIG_NETFILTER_XT_TARGET_DSCP)

match-extension не должен модифицировать пакет! target-extension может.

Учти, что tcpdump обычно получает доступ к пакетам через AF_PACKET который на схеме в 2-х местах. Входящие пакеты tcpdump видит до того как они попали в iptables.

IMHO Транзитные пакеты (если не использовать «tcpdump -ni any») tcpdump видит только 1 раз на входе.

Если воспользоваться "-j NFLOG --nflog-group X" + «tcpdump -ni nflog:X», то можно посмотреть пакет в любом месте.

PS пакет может быть не линейным и модификация его не так проста.

vel ★★★★★
()
Последнее исправление: vel (всего исправлений: 3)
Ответ на: комментарий от vel

IMHO Для модификации пакетов можно воспользоваться двумя способами:

А как же netfilter hook? И вообще, какой из способов сейчас самый православный? (вопросы, возможно, дурацкие, но я ядерный разработчик ненастоящий, маску на стройке нашел).

Учти, что tcpdump обычно получает доступ к пакетам через AF_PACKET который на схеме в 2-х местах. Входящие пакеты tcpdump видит до того как они попали в iptables.

Дело было именно в этом. На SO кто-то когда-то разбирал вопрос, жаль я раньше не нагуглил. Для входящих пакетов tcpdump стоит в цепочке раньше netfilter, поэтому без дополнительных приседаний он видит пакеты с nic, а уже потом я их порчу в target-extension, поэтому в дампах нет результатов работы extension.

Если воспользоваться «-j NFLOG –nflog-group X» + «tcpdump -ni nflog:X», то можно посмотреть пакет в любом месте.

И это в точку. В моем случае правильная (ну или один из правильных вариантов) последовательность действий для просмотра модифицированных входящих пакетов:

# iptables -t mangle -A PREROUTING -j TRIPSO --to-astra
# iptables -I INPUT -j NFLOG --nflog-group 1
# tcpdump -ni nflog:1 -w ~/dump.pcap
leet27
() автор топика
Последнее исправление: leet27 (всего исправлений: 1)

Я как-то хотел кастомный VPN написать, там TUN/TAP устройства обычно используются, возможно стоит посмотреть на имплементацию Wireguard как оно само автоподключает такое устройство, а дальше небольшой код написать для модификации пакетов. Собственно в такой конфигурации iptables просто роутит.

ac130kz ★★
()