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

Пересылка UDP не всегда работает

У меня переадресация udp на виртуальную машину с правилом

iptables -t nat -A PREROUTING -i eth0 -p udp -m udp --dport 42000:42020 -j DNAT --to-destination 192.168.1.2
iptables -t nat -A POSTROUTING -s 192.168.1.2/32 -j MASQUERADE
iptables -A FORWARD -d 192.168.1.2 -p udp --dport 42000:42020 -j ACCEPT
iptables -A FORWARD -s 192.168.1.2 -j ACCEPT

В виртуальной машине есть серверы openvpn, которые прослушивают эти порты.

Теперь у меня возникла странная проблема с пересылкой на хосте: некоторые пакеты маршрутизируются между интерфейсами, а некоторые - нет, без четкого объяснения причин.

Что я могу попытаться выяснить, почему пакеты не направляются на другой интерфейс?

Проблема состоит из двух частей:

Сначала libvirt вставила правило брандмауэра с

- j MASQUERADE --to-port 1024-65535

который изменил исходные порты, которые не соответствуют другим правилам и вызывают ошибки в openvpn.

Сложность в том, почему это не сработало. И там таблица conntrack сохраняла информацию об исходном порте. Я предполагаю, что пакеты от однорангового узла, которые все еще пытались повторно подключиться, обновили запись в таблице.

Когда я бежал conntrack -D (будьте осторожны, это приведет к отключению всех отслеживаемых соединений), пакеты начали иметь правильный порт источника. Обратите внимание, что conntrack не может гарантировать исходный порт, но если он доступен, пытается использовать исходный порт, если нет --to-ports параметр.