Я уже некоторое время борюсь с этим и, несмотря на мои усилия, не могу заставить это работать. Я хочу перенаправить порты с общедоступного 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 на 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 в брандмауэре блокировало ...