NFQUEUE: не отправляются измененные пакеты
По правилу iptables пакеты ставятся в очередь NFQUEUE. Перехват на raw
PREROUTING
пакетов, где IP-адрес назначения присвоен данной машине.
В юзерспейсе работает программа, получающая пакеты из NFQUEUE. Она заменяет IP-адрес источника на IP интерфейса данной машины, а IP-адрес назначения - на IP удаленного сервера. Контрольная сумма пересчитывается. Присваивается вердикт NF_ACCEPT
.
Ожидаемое поведение: модифицированные пакеты отправляются на удаленный сервер как исходящие от данной машины.
Фактическое поведение: пакеты видно в callback'е NFQUEUE, они модифицируются корректно, но не отправляются, теряются.
Гипотеза:
пакеты после модификации отбрасываются, т.к. адрес источника принадлежит локальной машине, а пакет находится в INPUT
. Пакет нужно отбросить (NF_DROP
), сохранив буфер, и отправить через сокет, а не просто дальше пускать по пути обработки через NF_ACCEPT
.
Может, есть способ проще?
UPD: Проверил гипотезу с RAW сокетом, такое решение работает. Но верный ли это способ?