У меня переадресация 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, которые прослушивают эти порты.
Теперь у меня возникла странная проблема с пересылкой на хосте: некоторые пакеты маршрутизируются между интерфейсами, а некоторые - нет, без четкого объяснения причин.
eth0
и vmnet
на хосте и внутри виртуальной машины.eth0
которые не направляются в vmnet
и пакеты vm на vmnet
которые не направляются в eth0
.eth0
, vmnet
и внутри виртуальной машины все в порядке.Что я могу попытаться выяснить, почему пакеты не направляются на другой интерфейс?
Проблема состоит из двух частей:
Сначала libvirt вставила правило брандмауэра с
- j MASQUERADE --to-port 1024-65535
который изменил исходные порты, которые не соответствуют другим правилам и вызывают ошибки в openvpn.
Сложность в том, почему это не сработало. И там таблица conntrack сохраняла информацию об исходном порте. Я предполагаю, что пакеты от однорангового узла, которые все еще пытались повторно подключиться, обновили запись в таблице.
Когда я бежал conntrack -D
(будьте осторожны, это приведет к отключению всех отслеживаемых соединений), пакеты начали иметь правильный порт источника. Обратите внимание, что conntrack не может гарантировать исходный порт, но если он доступен, пытается использовать исходный порт, если нет --to-ports
параметр.