Eu tenho lutado com isso há algum tempo e apesar dos meus esforços e não consigo fazer funcionar.
Desejo encaminhar portas do IP público para um host (host1) na rede corporativa. A coisa é, existem vários "saltos" entre eles. O host está por trás de um firewall que está por trás de um roteador linux definido como um cliente vpn. Todo o tráfego da rede corporativa, em seguida, passa pela VPN para um VPS na nuvem definida como o servidor vpn e depois para a internet (espero que eu esteja claro o suficiente ...)
Aqui está um resumo:
NC1 < == > Internet < == > VPS (servidor VPN) < == > Roteador Linux (cliente VPN) < == > Firewall < == > Rede (host1 com ouvinte de netcast na porta 9000)
Agora, aqui estão as regras do iptables que eu configurei no 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
Com essas regras consegui estabelecer uma conexão da internet para o roteador linux sem problema
Agora estou tentando encaminhar essas mesmas portas do roteador linux para o host do cliente (as regras de redirecionamento apropriadas já estão definidas no firewall):
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 é o IP da WAN do firewall e 10.0.2.100 é o IP da interface enp0s8 do roteador linux conectado ao firewall. 10.8.0.7 é o tun0 IP do roteador linux.
É aqui que as coisas param de funcionar. Quando eu configuro um ouvinte de netcat no host1 e tento conectar-me da Internet (NC1), recebo um erro de tempo limite de conexão.
Aqui está uma saída do tcpdump do computador NC1 tentando se conectar ao ouvinte netcat no 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 da interface tun0 do roteador 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 da interface enp0s8 do roteador 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
Eu também devo mencionar que com o roteador linux conectado diretamente à internet (e, claro, substituindo as interfaces de um IPs nas regras do iptables) a conexão estabelece muito bem.
Isso provavelmente é algo estúpido, mas agora eu não vejo isso.