iptables DNAT + SNAT: нежелательное умножение одной и той же дейтаграммы udp (и сбоя)

пытаясь выяснить мою ошибку в следующем очень простом сценарии:

|peerA|(Aip:Aport) <--> (Bdev:Bip:Bport)|NatNode|(Cdev:Cip:Cport) <--> (Dip:Dport)| peerD 

(peer A испускает дейтаграммы для Bip: Bport, NatNode переводит их как отправленные Cip: Cport и предназначенные для Dip: Dport и наоборот)

то, что я сделал, с пустыми iptables и «ванильной» таблицей маршрутизации:

 iptables -p udp -t nat -A PREROUTING -s Aip -d Bip -i Bdev --destination-port Bport -j DNAT --to-destination Dip:Dport iptables -p udp -t nat -A POSTROUTING -s Aip -d Dip -o Cdev --destination-port Dport -j DNAT --to-source Cip:Cport 

(плюс правила для обратного направления и одна цель LOG для каждого -t nat и -t основных целей фильтра)

то, что я ожидал, было: – правильное переписывание (и это нормально, как показано wirehark) – каждый входящий пакет входит из PREROUTING (решение маршрутизации, возможно, в Cdev), пересекает FORWARD один раз (решение о маршрутизации, возможно, Cdev), затем ПОСТРОЕНИЕ один раз , затем он идет в сеть.

то, что у меня есть (проверка регистрации): 1. первый пакетный траверс PREROUTING один раз, фильтр / FORWARD – тонна раз (yep, тот же идентификатор пакета), затем ПОСТРОЕНИЕ много раз, затем выдается в сеть один раз, а удаленные узлы получают его. 2. со второй датаграммы и далее все, кажется, происходит, но переведенная датаграмма не выбрасывается на устройстве. 3. Если я подожду достаточно (скажем> 15 секунд) и повторюсь, опять же, головная датаграмма новой последовательности ведет себя как 1., начиная с второй, как 2.

Также попытался удалить опции -i и -o, но, похоже, ничего не изменил.

Что я здесь делаю неправильно?

Я не могу определить проблему, мне кажется, что я сделал «как предполагалось», инстинктивно подозреваю, что что-то идет не так в точках решения маршрутизации, и, может быть, пакеты, подобные в 2., не испускаются каким-то защитным поведением Linux tcp / ip stack …

Я почти уверен, что это моя собственная ошибка, но не могу найти, где.

спасибо за помощь!

One Solution collect form web for “iptables DNAT + SNAT: нежелательное умножение одной и той же дейтаграммы udp (и сбоя)”

Если вы хотите сделать классический NAT для Dip и реализовать переадресацию портов для своего Dport, тогда вам не нужны какие-либо специально разработанные правила POSTROUTING, просто добавьте общий -j MASQUERADE.

И .. DNAT в ПОСТРОЕНИИ? Вы сделали опечатку?

Обычно я использую классический NAT (при условии, что установлен блокирующий брандмауэр, а conntrack возвращает все «ответные» пакеты):

iptables -I POSTROUTING -o ppp0 -j MASQUERADE

iptables -I FORWARD -i eth0 -o ppp0 -j ACCEPT

iptables -I PREROUTING -i ppp0 -p tcp --dport 80 -j DNAT --to local_ip:80

Здесь eth0 является локальным iface в той же подсети, что и local_ip, ppp0 – интернет iface.

  • Linux-мосты блокируют пакет UDP из крановых интерфейсов
  • Как мне зарезервировать порты для моего приложения?
  • Многоадресная рассылка UDP после обновления ядра
  • Многоадресный клиент UDP по ipv6
  • Возможно ли перенаправление через UDP-порт?
  • tcpdump захватывает сетевой UDP-трафик, но не TCP
  • Команда для поиска открытых портов
  • Многоадресный UDP не работает
  • TCP-потоки, сосуществующие с UDP при использовании SFQ (стохастическая честная очередь)
  • Ошибка буфера приема UDP
  • Может ли произвольный процесс считывать данные, поступающие в / из сетевого порта? Как?
  • Interesting Posts

    В чем проблема с выходом plink?

    Соединение Wi-Fi на ath9k замерзает при увеличенной нагрузке на интерфейс

    Как выполнить автономное обновление в реальном времени?

    Перемещение с Ubuntu 32bit: Mint 64bit или Mint 32bit?

    Как я могу запустить команду, подождать 2 секунды и вернуть результат, не убив команду?

    ошибка виртуализации: методы установки "не могут быть указаны для гостей контейнера"

    Измените конец нескольких похожих имен файлов

    Не удается получить dropbear jail для работы – похоже, что shell немедленно выходит

    netselect – как его установить на Монетный двор?

    утечка памяти с помощью сценария оболочки и tty

    Устранена проблема с Bpython

    Как написать сценарий оболочки HUSH, который проверяет результат каждой команды?

    Перемещение файлов рекурсивно, если выполняется определенное условие

    hostapd на Debian Linux открывает WLAN Hotspot, но я не могу подключиться к нему

    расширить пространство на диске в VMWare без групп томов

    Linux и Unix - лучшая ОС в мире.