Я создаю небольшой CTF (соревнование хакеров) и имею машину, на которой размещаются виртуальные машины. Одна из этих виртуальных машин будет целью.
К хост-машине нельзя подключиться через Интернет, поэтому я настроил машину Digital Ocean в качестве сервера OpenVPN, а хост виртуальной машины - в качестве клиента. На следующей диаграмме показана установка:
Моя конфигурация OpenVPN допускает трафик между клиентами, и маршрут к сети виртуальных машин (виртуальная сеть) был продвинут. Эта часть работает, и хост Jump может подключиться к машине 192.168.160.12.
На хосте Jump я добавил следующие правила брандмауэра:
iptables -A FORWARD -d 192.168.160.12 -p tcp --dport 11000 -j ACCEPT
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 11000 -j DNAT --to-destination 192.168.160.12:11000
На машине VMHost я сделал так:
iptables -I FORWARD -o tun1 -j ACCEPT
iptables -I FORWARD -i tun1 -j ACCEPT
Я считаю, что этого должно быть достаточно для маршрутизации трафика из Интернета на виртуальную машину 192.168.160.12, однако это не так.
Он достигает машины VMHost, но не пересылается на виртуальную машину. При выполнении netcat с хоста Jump (nc 192.168.160.12 11000
) все нормально работает. Виртуальная машина достигнута, и она отвечает, но когда я делаю то же самое через Интернет (nc 178.62.XXX.YYY 11000
с машины Me) трафик достигает хоста Jump, перенаправляется на VMHost, достигает VMHost на интерфейсе tun1, но не перенаправляется на интерфейс virbr0, как это было, когда хост Jump был инициатором.
Почему такая разница?