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

Правило предварительной маршрутизации iptables не выполнено

Я хочу перенаправить все 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