Cómo solucionar problemas de reenvío de puertos iptable de Linux

Cómo solucionar problemas de reenvío de puertos iptable de Linux

Ya hay toneladas de ayuda y guías sobre cómo hacer esto. Pero por alguna razón no puedo hacerlo funcionar y no estoy seguro de cómo solucionarlo.
Tengo una instancia de RDS postgres con la IP privada 10.0.122.220. También tengo un host bastión con (sí) IP privada 10.0.94.67. Puedo conectarme a los puertos del host bastión, pero no al RDS. Así que estoy intentando reenviar el puerto 5432del host bastión al puerto 5432de la instancia de RDS.
Este es el estado del host bastión:

bastion$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    inet 127.0.0.1/8 scope host lo
...
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9001 qdisc mq state UP group default qlen 1000
    inet 10.0.94.67/19 brd 10.0.95.255 scope global dynamic eth0
...

bastion$ ip route show | grep default
default via 10.0.64.1 dev eth0

bastion$ cat /proc/sys/net/ipv4/ip_forward
1

Luego agregué dos reglas NAT:

bastion# iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 5432 -j DNAT --to-destination 10.0.122.220

bastion# iptables -t nat -A POSTROUTING -o eth0 -p tcp --dport 5432 -d 10.0.122.220 -j SNAT --to-source 10.0.94.67

bastion# iptables -v -t nat -L -n
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination
    0     0 DNAT       tcp  --  eth0   *       0.0.0.0/0            0.0.0.0/0            tcp dpt:5432 to:10.0.122.220

Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination

Chain OUTPUT (policy ACCEPT 443 packets, 32660 bytes)
 pkts bytes target     prot opt in     out     source               destination

Chain POSTROUTING (policy ACCEPT 443 packets, 32660 bytes)
 pkts bytes target     prot opt in     out     source               destination
    0     0 SNAT       tcp  --  *      eth0    0.0.0.0/0            10.0.122.220         tcp dpt:5432 to:10.0.94.67

Pero todavía no puedo conectarme a la instancia RDS con la ayuda del túnel SSH:

my-machine$ ssh -v -NL 5432:10.0.94.67:5432 -i my-key [email protected]
debug1: Connection to port 5432 forwarding to 10.0.94.67 port 5432 requested.
debug1: channel 2: new [direct-tcpip]
channel 2: open failed: connect failed: Connection refused
debug1: channel 2: free: direct-tcpip: listening port 5432 for 10.0.94.67 port 5432, connect from 127.0.0.1 port 57447 to 127.0.0.1 port 5432, nchannels 3
debug1: Connection to port 5432 forwarding to 10.0.94.67 port 5432 requested.
debug1: channel 2: new [direct-tcpip]
channel 2: open failed: connect failed: Connection refused
debug1: channel 2: free: direct-tcpip: listening port 5432 for 10.0.94.67 port 5432, connect from 127.0.0.1 port 57448 to 127.0.0.1 port 5432, nchannels 3
... keeps repeating the above

Lo que puedo confirmar es que RDS está funcionando, funcionando y respondiendo, y el host bastión tiene acceso a él, ya que con el siguiente túnel SSH puedo conectarme a la base de datos:

my-machine$ ssh -v -NL 5432:10.0.122.220:5432 -i my-key [email protected]

¿Qué me perdí? ¿Cómo puedo solucionarlo? Gracias.

Respuesta1

Tengo la sensación de que estás complicando demasiado las cosas. Como usa SSH para reenviar la conexión a la base de datos, olvídese de iptables y NAT y simplemente use SSH para reenviar DIRECTAMENTE al servidor de la base de datos:

Usar:

my-machine$ ssh -v -NL 5432:10.0.122.220:5432 -i my-key [email protected]

en lugar de:

my-machine$ ssh -v -NL 5432:10.0.94.67:5432 -i my-key [email protected]

Explicación de por qué su solución NO funciona: el tráfico generado localmente NO pasa por la cadena PREROUTING de la tabla NAT, por lo que NO está DNAT. Utilice la tabla OUTPUT para el tráfico generado localmente DNAT:

bastion# iptables -t nat -A OUTPUT -p tcp --dport 5432 -j DNAT --to-destination 10.0.122.220

Pero como dije, esto complica demasiado las cosas. Y es posible que también desee hacer coincidir la dirección de destino en la regla anterior si decide utilizarla.

información relacionada