Como solucionar problemas de encaminhamento de porta iptable do linux

Como solucionar problemas de encaminhamento de porta iptable do linux

Já existe muita ajuda e guia sobre como fazer isso. Mas, por algum motivo, não consigo fazê-lo funcionar e não sei como solucionar o problema.
Eu tenho uma instância RDS postgres com o IP privado 10.0.122.220. Eu também tenho um host bastião com um IP privado (sim) 10.0.94.67. Consigo me conectar a portas no host bastião, mas não ao RDS. Então, estou tentando encaminhar a porta 5432do host bastião para a porta 5432da instância RDS.
Este é o status do host bastião:

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

Então adicionei duas regras 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

Mas ainda não consigo me conectar à instância RDS com a ajuda do tunelamento 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

O que posso confirmar é que o RDS está funcionando e respondendo, e o bastion host tem acesso a ele, já que com o seguinte túnel SSH posso me conectar ao banco de dados:

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

O que eu perdi? Como posso solucionar isso? Obrigado.

Responder1

Tenho a sensação de que você está complicando demais as coisas. Como você está usando SSH para encaminhar a conexão ao banco de dados, esqueça o iptables e o NAT e apenas use o SSH para encaminhar DIRETAMENTE para o servidor de banco de dados:

Usar:

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

em vez de:

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

Explicação de por que sua solução NÃO funciona: O tráfego gerado localmente NÃO passa pela cadeia PREROUTING da tabela NAT, portanto NÃO é DNATado. Use a tabela OUTPUT para o tráfego DNAT gerado localmente:

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

Mas, como eu disse, isso está complicando demais as coisas. E você também pode querer corresponder o endereço de destino na regra acima, se decidir usá-lo.

informação relacionada