Я хочу перенаправить все UDP-пакеты, адресованные на порт 1511, полученные на одном интерфейсе (ens1), на другой компьютер (на самом деле это контейнер докеров, но это не должно иметь никакого значения) по IP 172.17.0.6. Я написал этот простой набор правил iptables (просто пример):
#!/bin/bash
iptables --flush
iptables --table nat --flush
iptables --delete-chain
iptables --table nat --delete-chain
echo 1 > /proc/sys/net/ipv4/ip_forward
sysctl net.ipv4.ip_forward=1
modprobe ip_tables
iptables -t nat -A PREROUTING -i ens1 -p udp --dport 1511 -j DNAT --to-destination 172.17.0.6:1511
iptables -A FORWARD -p udp --dport 1511 -j ACCEPT
#iptables -A INPUT -i ens1 -p udp --dport 1511 -j DROP
iptables -A INPUT -j ACCEPT
iptables -A OUTPUT -j ACCEPT
Моя проблема в том, что пакеты не соответствуют правилу PREROUTING и, таким образом, доставляются на локальный хост. Я уверен, что порт UDP правильный, поскольку я запускаю одно и то же приложение на двух машинах, а приложение на локальном хосте регулярно получает пакеты на порт UDP 1511 (в качестве доказательства раскомментируя третье правило снизу, локальное приложение перестает получать данные). Что не так с моим сценарием? Спасибо.
Это скорее взлом, чем решение, но мне подходит следующее:
sudo sysctl -w net.netfilter.nf_conntrack_udp_timeout=0
sudo sysctl -w net.netfilter.nf_conntrack_udp_timeout_stream=0
По сути, он заставляет любой UDP-пакет появляться как первый в новом соединении, обращаясь к поведению NAT, описанному также пользователь2233709