Назад | Перейти на главную страницу

UDP NAT не работает

У меня, среди прочего, есть следующие правила NAT iptables на машине с IP-адресами 192.168.1.71 и a.b.c.d, где a.b.c.d представляет собой общедоступный IP-адрес:

 iptables -t nat -A PREROUTING -p udp --dport 20001 -j DNAT --to-destination 192.168.1.72:20000
 iptables -t nat -A POSTROUTING -p udp -s 192.168.1.72 --sport 20000 -j SNAT --to-source a.b.c.d:20001

Когда с помощью STUN я пытаюсь найти общедоступный IP-адрес, назначенный сокету с локальным портом 20000 на локальном компьютере 192.168.1.72, я не получаю 20001, я постоянно получаю 32018. Однако я получаю правильный IP-адрес a.b.c.d. Что мне нужно изменить в моих правилах iptables?

ОБНОВЛЕНИЕ: проблема заключалась в моем вычислении номера порта из ответа STUN. Связанный вопрос: Правило:

   iptables -A INPUT -p udp -j LOG --log-prefix "iptables: "

не регистрирует пакеты для совпадающих пакетов, но регистрирует другие пакеты. Размещение этого правила выше или ниже двух вышеуказанных правил не имело никакого значения.

Если первый пакет всегда отправляется изнутри сети, вам нужно только правило в POSTROUTING. Отслеживание соединений Linux также обрабатывает «ассоциации» UDP, поэтому оно знает, как обрабатывать возвращаемые пакеты.

Например, ответные пакеты DNS через UDP передаются клиентам за NAT с использованием отслеживания соединений Linux.

Ваш LOG Правило помещено в INPUT цепь в filter таблица, которая используется только для пакетов, местом назначения которых является сам маршрутизатор. Пакеты, обрабатываемые PREROUTING / POSTROUTING цепи никогда не идут INPUT цепь.

Ваши правила должны выглядеть так:

iptables -t nat -A POSTROUTING -p udp -j LOG --log-prefix "iptables: "
iptables -t nat -A POSTROUTING -p udp -s 192.168.1.72 --sport 20000 -j SNAT --to-source a.b.c.d:20001

https://upload.wikimedia.org/wikipedia/commons/3/37/Netfilter-packet-flow.svg представляет собой исчерпывающее изображение потока пакетов внутри сетевого стека Linux и различных цепочек / таблиц IPTables.