Como redirecionar/encaminhar uma porta localmente

Como redirecionar/encaminhar uma porta localmente

Quero encaminhar a porta 500 para a porta 2500 dentro do mesmo host e o seguinte estava funcionando no Lubuntu 16.04, mas depois de reiniciar e executar novamente os comandos iptables, não consigo fazê-lo funcionar:

iptables -t nat -A PREROUTING -p udp -d 192.168.1.10 –dport 500 -j DNAT –to-destination 192.168.1.10:2500
iptables -A FORWARD -p udp -d 192.168.1.10 –dport 2500 -j ACCEPT

onde 192.168.1.10 é o IP do meu host local.
Para testar em uma sessão eu executo o netcat:

nc -u 192.168.1.10:500

e em uma 2ª sessão executada:

nc -l -u 500

e em uma 3ª sessão execute:

nc -l -u 2500

Portanto, quero que os dados inseridos na sessão 1 sejam recebidos na sessão 3, não na sessão 2, que estava funcionando, mas não consigo fazê-la funcionar novamente.

Eu também tentei:

iptables -t nat -A PREROUTING -p udp --dport 500 -j REDIRECT --to-port 2500

mas os pacotes ainda estão sendo recebidos na porta 500, não na 2500.

ufw está desabilitado e para ter certeza de que o iptables está funcionando, tentei:

iptables -A INPUT -p udp --dport 500 -j DROP

e os pacotes não foram recebidos na porta 500 ou 2500 conforme esperado. O encaminhamento de porta está habilitado:

# cat /proc/sys/net/ipv4/ip_forward
1

Saída da sessão abaixo:

root@mike-TravelMate-8371:~/nat/out# iptables -t nat -S;iptables  -S
-P PREROUTING ACCEPT
-P INPUT ACCEPT
-P OUTPUT ACCEPT
-P POSTROUTING ACCEPT
-A PREROUTING -d 192.168.1.10/32 -p udp -m udp --dport 500 -j DNAT --to-destination 192.168.1.10:2500
-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
-A FORWARD -d 192.168.1.10/32 -p udp -m udp --dport 2500 -j ACCEPT
root@mike-TravelMate-8371:~/nat/out# nohup nc -l -u 2500 > nc_2500.out &
[1] 29806
root@mike-TravelMate-8371:~/nat/out# nohup: ignoring input and redirecting stderr to stdout

root@mike-TravelMate-8371:~/nat/out# nohup nc -l -u 500 > nc_500.out &
[2] 29810
root@mike-TravelMate-8371:~/nat/out# nohup: ignoring input and redirecting stderr to stdout

root@mike-TravelMate-8371:~/nat/out# jobs
[1]-  Running                 nohup nc -l -u 2500 > nc_2500.out &
[2]+  Running                 nohup nc -l -u 500 > nc_500.out &
root@mike-TravelMate-8371:~/nat/out# nc -u 192.168.1.10 500
test forwarding UDP port 500 to 2500
^C
[2]+  Done                    nohup nc -l -u 500 > nc_500.out
root@mike-TravelMate-8371:~/nat/out# head nc*.out
==> nc_2500.out <==

==> nc_500.out <==
test forwarding UDP port 500 to 2500
root@mike-TravelMate-8371:~/nat/out# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: enp2s0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast state DOWN group default qlen 1000
    link/ether 00:1e:33:24:98:86 brd ff:ff:ff:ff:ff:ff
3: wlp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:22:fb:64:bd:42 brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.10/24 brd 192.168.1.255 scope global dynamic wlp1s0
       valid_lft 85651sec preferred_lft 85651sec
    inet6 fd58:7f66:569d:5300:c5df:415:6c56:50d6/64 scope global temporary dynamic 
       valid_lft 6788sec preferred_lft 3188sec
    inet6 fd58:7f66:569d:5300:75d:bbe9:652e:6587/64 scope global mngtmpaddr noprefixroute dynamic 
       valid_lft 6788sec preferred_lft 3188sec
    inet6 fe80::e214:14f8:d95c:73a7/64 scope link 
       valid_lft forever preferred_lft forever
4: vboxnet0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast state DOWN group default qlen 1000
    link/ether 0a:00:27:00:00:00 brd ff:ff:ff:ff:ff:ff
    inet 192.168.56.1/24 brd 192.168.56.255 scope global vboxnet0
       valid_lft forever preferred_lft forever
    inet6 fe80::800:27ff:fe00:0/64 scope link 
       valid_lft forever preferred_lft forever
root@mike-TravelMate-8371:~/nat/out# ip route
default via 192.168.1.1 dev wlp1s0  proto static  metric 600 
192.168.1.0/24 dev wlp1s0  proto kernel  scope link  src 192.168.1.10  metric 600 
192.168.56.0/24 dev vboxnet0  proto kernel  scope link  src 192.168.56.1 linkdown 

O motivo pelo qual desejo encaminhar portas é que desejo configurar a VPN entre um servidor externo e um convidado em execução na caixa virtual. O convidado do Vbox está usando a rede "NAT", então o Vbox tem seu próprio encaminhamento de porta para encaminhar portas para a VM que possui IP 10.0.2.15, portanto no Vbox as regras de encaminhamento de porta são:

  1. Host TCP 2222 para convidado Vbox 22
  2. Host UDP 4500 para convidado Vbox 4500
  3. Host UDP 2500 para convidado Vbox 500

O primeiro significa que posso fazer ssh para convidado usando "ssh -p 2222[e-mail protegido]"

O segundo significa que posso enviar pacotes UDP em 4500, então posso enviar pacotes usando "nc -u 192.168.1.10 4500" do host e posso vê-los sendo recebidos no convidado Vbox usando "nc -l -u 4500" (os pacotes NÃO são vistos se você executar "nc -l -u 4500" no host)

A terceira é porque o Vbox NÃO encaminhará portas reservadas abaixo de 1024, então não posso encaminhar a porta 500, então com esta regra posso usar "nc -u 192.168.1.10 2500" no host e receber pacotes UDP no convidado do Vbox usando "nc -l - você 500".

Então eu quero encaminhar portas em UDP 500 no host para a porta 2500 para que elas sejam encaminhadas pelo Vbox para a porta 500 no convidado e isso estava funcionando, mas depois de reiniciar e executar novamente os comandos do iptables não funcionou e depois de várias horas de trabalho nisso não consigo descobrir o que fiz de diferente.

Eu tentei configurar o iptables (e o Vbox) com o encaminhamento de TCP e isso também não funciona e eu tentei o ufw e tentei encaminhar portas locais com e sem o Vbox em execução e as portas nunca são encaminhadas.

Também tentei encaminhar a porta para um IP inexistente:

iptables -t nat -A PREROUTING -p udp -d 192.168.1.10 --dport 500 -j DNAT --to-destination 192.168.1.30:500
iptables -A FORWARD -p udp -d 192.168.1.30 --dport 500 -j ACCEPT

Então aqui o IP 192.168.1.30 não existe, mas se eu executar "nc -u 192.168.1.10 500" em uma sessão, ainda poderei receber pacotes escutando no host (IP de 192.168.1.10).

Eu tentei encaminhar a porta TCP 3222 para a porta 22 para poder testar sem o netcat, mas isso não funciona

root@mike-TravelMate-8371:~/nat# iptables -t nat -S;iptables  -S 
-P PREROUTING ACCEPT
-P INPUT ACCEPT
-P OUTPUT ACCEPT
-P POSTROUTING ACCEPT
-A PREROUTING -d 192.168.1.10/32 -p tcp -m tcp --dport 3222 -j DNAT --to-destination 192.168.1.10:22
-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
-A FORWARD -d 192.168.1.10/32 -p tcp -m tcp --dport 22 -j ACCEPT
root@mike-TravelMate-8371:~/nat# telnet 192.168.1.10 22
Trying 192.168.1.10...
Connected to 192.168.1.10.
Escape character is '^]'.
SSH-2.0-OpenSSH_7.2p2 Ubuntu-4ubuntu2.4
^C
Connection closed by foreign host.
root@mike-TravelMate-8371:~/nat# telnet 192.168.1.10 3222
Trying 192.168.1.10...
telnet: Unable to connect to remote host: Connection refused
root@mike-TravelMate-8371:~/nat# 

Então aqui posso acessar a porta ssh diretamente usando a porta 22, mas não consigo via 3222, então o encaminhamento não está funcionando.

Responder1

As regras do Iptables não são persistentes durante a reinicialização. talvez seja necessário adicionar as regras novamente após a reinicialização ou usar iptables-save / iptables-persistent. Consulte este link. Como posso tornar permanente um conjunto específico de regras do iptables?

Responder2

Tive a mesma necessidade e consegui funcionar com esses dois comandos. Eu precisava redirecionar apenas chamadas locais, mas 127.0.0.1podem ser substituídas pelo IP externo

sudo iptables -t nat -A PREROUTING -s 127.0.0.1 -p tcp --dport 1234 -j REDIRECT --to 1235
sudo iptables -t nat -A OUTPUT -s 127.0.0.1 -p tcp --dport 1234 -j REDIRECT --to 1235

informação relacionada