Я борюсь с этим уже некоторое время и, несмотря на мои усилия, не могу заставить это работать. Я хочу перенаправить порты с общедоступного IP-адреса на хост (host1) в корпоративной сети. Дело в том, что между ними есть несколько «прыжков». Хост находится за брандмауэром, который находится за маршрутизатором Linux, установленным в качестве клиента vpn. Затем весь трафик из корпоративной сети проходит через vpn на VPS в облаке, установленном в качестве vpn-сервера, а затем в Интернет (надеюсь, я достаточно ясен ...) Вот приблизительная схема:
NC1 <==> Интернет <==> VPS (VPN-сервер) <==> Linux-маршрутизатор (VPN-клиент) <==> Брандмауэр <==> Сеть (host1 с прослушивателем netcast на порту 9000)
Вот правила iptables, которые я установил на VPS:
iptables -A FORWARD -i ens3 -o tun0 -p tcp --syn --dport 9000 -m conntrack --ctstate NEW -j ACCEPT
iptables -A FORWARD -i ens3 -o tun0 -d 10.8.0.7 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -i tun0 -o ens3 -s 10.8.0.7 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -t nat -A PREROUTING -i ens3 -p tcp --dport 9000 -j DNAT --to-destination 10.8.0.7
iptables -t nat -A POSTROUTING -o tun0 -p tcp --dport 9000 -d 10.8.0.7 -j SNAT --to-source <Public IP>
iptables -t nat -A POSTROUTING -p tcp -o tun0 --dport 9000 -j MASQUERADE
С этими правилами мне удалось без проблем установить соединение из Интернета с Linux-маршрутизатором
Теперь я пытаюсь переслать те же порты от маршрутизатора linux к клиентскому хосту (соответствующие правила перенаправления уже установлены в брандмауэре):
iptables -A FORWARD -i tun0 -o enp0s8 -p tcp --syn --dport 9000 -m conntrack --ctstate NEW -j ACCEPT
iptables -A FORWARD -i tun0 -o enp0s8 -d 10.0.2.11 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -i enp0s8 -o tun0 -s 10.0.2.11 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -t nat -A PREROUTING -i tun0 -p tcp --dport 9000 -j DNAT --to-destination 10.0.2.11
iptables -t nat -A POSTROUTING -o enp0s8 -p tcp --dport 9000 -d 10.0.2.11 -j SNAT --to-source 10.0.2.100
iptables -t nat -A POSTROUTING -p tcp -o enp0s8 --dport 9000 -j MASQUERADE
10.0.2.11 - это WAN IP брандмауэра, а 10.0.2.100 - IP интерфейса enp0s8 Linux роутер подключен к межсетевому экрану. 10.8.0.7 - это IP-адрес tun0 маршрутизатора linux.
Здесь все перестает работать. Когда я настраиваю прослушиватель netcat на host1 и пытаюсь подключиться из Интернета (NC1), я получаю ошибку тайм-аута соединения.
Вот вывод tcpdump от компьютера NC1, пытающегося подключиться к netcat listener на host1:
13:57:05.541009 IP NC1.59820 > xx.xx.xx.xx.9000: Flags [S], seq 681754542, win 29200, options [mss 1460,sackOK,TS val 2294604797 ecr 0,nop,wscale 7], length 0
tcpdump из интерфейса tun0 маршрутизатора linux:
15:53:18.060563 IP 10.8.0.1.59818 > 10.8.0.7.9000: Flags [S], seq 3131331659, win 29200, options [mss 1308,sackOK,TS val 2294404076 ecr 0,nop,wscale 7], length 0
tcpdump из интерфейса enp0s8 маршрутизатора linux:
15:53:18.060619 IP 10.0.2.100.59818 > 10.0.2.11.9000: Flags [S], seq 3131331659, win 29200, options [mss 1308,sackOK,TS val 2294404076 ecr 0,nop,wscale 7], length 0
Я также должен упомянуть, что с маршрутизатором linux, напрямую подключенным к Интернету (и, конечно, заменяя интерфейсы IP в правилах iptables) соединение устанавливается нормально.
Возможно, это что-то глупое, но сейчас я этого не вижу.
Хорошо, наконец-то работает. Оказывается, это какая-то ошибка в брандмауэре. После того, как я установил обновление, которое требовало перезагрузки, я попробовал еще раз, и все прошло без проблем. Возможно, старое правило iptables в брандмауэре было блокирующим ...