Cómo redirigir/reenviar un puerto localmente

Cómo redirigir/reenviar un puerto localmente

Quiero reenviar el puerto 500 al puerto 2500 dentro del mismo host y lo siguiente funcionaba en Lubuntu 16.04, pero después de reiniciar y volver a ejecutar los comandos de iptables, no puedo hacerlo 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

donde 192.168.1.10 es la IP de mi host local.
Para probar en una sesión ejecuto netcat:

nc -u 192.168.1.10:500

y en una segunda sesión ejecutada:

nc -l -u 500

y en una tercera sesión ejecutada:

nc -l -u 2500

Entonces, quiero que los datos que ingreso en la sesión 1 se reciban en la sesión 3, no en la sesión 2, que sí funcionó, pero no puedo hacer que vuelva a funcionar.

También probé:

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

pero los paquetes todavía se reciben en el puerto 500, no en el 2500.

ufw está deshabilitado y para asegurarme de que iptables esté funcionando, probé:

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

y luego los paquetes no se recibieron en el puerto 500 o 2500 como se esperaba. El reenvío de puertos está habilitado:

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

Salida de la sesión a continuación:

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 

La razón por la que quiero reenviar puertos es que quiero configurar una VPN entre un servidor externo y un invitado que se ejecuta en Virtual Box. El invitado de Vbox está usando la red "NAT", por lo que Vbox tiene su propio reenvío de puertos para reenviar puertos a la VM que tiene IP 10.0.2.15, por lo que en Vbox las reglas de reenvío de puertos son:

  1. Host TCP 2222 al invitado 22 de Vbox
  2. Host UDP 4500 a invitado Vbox 4500
  3. Host UDP 2500 a invitado Vbox 500

El primero significa que puedo enviar ssh al invitado usando "ssh -p 2222[correo electrónico protegido]"

El segundo significa que puedo enviar paquetes UDP en 4500, por lo que puedo enviar paquetes usando "nc -u 192.168.1.10 4500" desde el host y puedo ver cómo se reciben en el invitado de Vbox usando "nc -l -u 4500" (los paquetes NO se ven si ejecuta "nc -l -u 4500" en el host)

La tercera es que Vbox NO reenviará puertos reservados bajo 1024, por lo que no puedo reenviar el puerto 500, por lo que con esta regla puedo usar "nc -u 192.168.1.10 2500" en el host y recibir paquetes UDP en el invitado de Vbox usando "nc -l - 500".

Entonces, quiero reenviar puertos en UDP 500 en el host al puerto 2500 para que Vbox los reenvíe al puerto 500 en el invitado y esto estaba funcionando, pero después de reiniciar y volver a ejecutar los comandos de iptables no funcionó y después de varias horas de trabajo. Sobre esto no puedo entender qué he hecho diferente.

Intenté configurar iptables (y Vbox) con reenvío TCP y esto tampoco funciona y probé ufw e intenté reenviar puertos locales con y sin Vbox ejecutándose y los puertos nunca se reenvían.

También intenté reenviar el puerto a una 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

Entonces, aquí la IP 192.168.1.30 no existe, pero si ejecuto "nc -u 192.168.1.10 500" en una sesión, aún puedo recibir paquetes escuchando en el host (IP de 192.168.1.10).

Intenté reenviar el puerto TCP 3222 al puerto 22 para poder realizar la prueba sin netcat, pero esto no 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# 

Así que aquí puedo acceder al puerto ssh directamente usando el puerto 22, pero no puedo a través del 3222, por lo que el reenvío no funciona.

Respuesta1

Las reglas de Iptables no son persistentes durante el reinicio. es posible que tengas que volver a agregar las reglas después de reiniciar o usar iptables-save/iptables-persistent. Consulte este enlace. ¿Cómo puedo hacer permanente un conjunto específico de reglas de iptables?

Respuesta2

Tenía la misma necesidad y lo hice funcionar con esos dos comandos. Necesitaba redirigir solo las llamadas locales, pero 127.0.0.1puedo reemplazarlas por la IP externa.

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

información relacionada