Тот же эффект на многих серверах с разными версиями ядра.
Существует несколько правил DNAT Iptables:
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 12345 -j DNAT --to-destination 10.20.30.40:5678
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 23456 -j DNAT --to-destination 10.11.12.13:5789
....
iptables -t nat -A PREROUTING -i eth0 -p udp --dport 34567 -j LOG --log-prefix 'natudp: '
iptables -t nat -A PREROUTING -i eth0 -p udp --dport 34567 -j DNAT --to-destination 10.55.66.77:34567
Проблема: правила UDP не работают для входящих запросов от eth0.
Счетчики пакетов и байтов для них имеют нулевые значения.
Упрощение (удаление dport) не дает никакого эффекта.
В результате запросы передаются в цепочку filter / INPUT вместо FORWARD.
Для пакетов с виртуальных интерфейсов (tap, veth) такой проблемы нет - они перехватываются правилами предварительной маршрутизации.
Для TCP такой проблемы нет.
Для UDP такой проблемы нет ответы.
Но входящие UDP-запросы от eth0 вообще игнорируются правилами предварительной маршрутизации:
# iptables -t nat -nvL PREROUTING
Chain PREROUTING (policy ACCEPT 3 packets, 174 bytes)
pkts bytes target prot opt in out source destination
(testing rules)
2 126 LOG udp -- * * 0.0.0.0/0 0.0.0.0/0 LOG flags 0 level 4 prefix "prerouting-udp: "
0 0 udp -- * * 1.2.3.4 0.0.0.0/0
0 0 udp -- * * 1.2.3.4 0.0.0.0/0 udp dpt:25826
0 0 udp -- eth0 * 0.0.0.0/0 0.0.0.0/0 udp dpt:25826
0 0 udp -- eth0 * 1.2.3.4 0.0.0.0/0
0 0 udp -- eth0 * 1.2.3.4 0.0.0.0/0 udp dpt:25826
(production rules)
7 412 DNAT tcp -- eth0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:12345 to:10.20.30.40:8080
63 3804 DNAT tcp -- eth0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:56789 to:10.30.40.50:8000
0 0 DNAT udp -- eth0 * 1.2.3.4 0.0.0.0/0 udp dpt:25826 to:10.40.50.60:25826
Любые идеи?