ipt de encaminhamento de porta com SNAT interno

1

Gostaria de encaminhar uma porta externa para uma porta diferente em uma máquina em uma rede privada. No entanto, preciso SNAT o tráfego para parecer ser do IP interno do gateway, uma vez que a máquina de destino tem uma rota de saída totalmente diferente. Estou combinando duas perguntas aqui, mas não tenho certeza se posso mesclar os resultados de perguntar separadamente.

Gateway = 1.2.3.4/192.168.2.5, servidor interno = 192.168.2.10

  1. Encaminhamento para uma porta diferente

Estou acostumado a fazer isso, e parece ser a única resposta que o Google encontra para mim:

iptables -A PREROUTING -t nat -p tcp -d 1.2.3.4 --dport 12345 -j DNAT --to-destination 192.168.2.10:12345
iptables -A FORWARD -p tcp -d 192.168.2.10 --dport 12345 -j ACCEPT
iptables -A POSTROUTING -t nat -d 192.168.2.10 -s 192.168.2.0/24 -p tcp --dport 12345 -j SNAT --to 1.2.3.4

que encaminhará a porta 12345 do meu IP externo de 1.2.3.4 para 192.168.2.10:12345. E se eu quiser encaminhar para a porta 54321? Eu fico confuso sobre qual referência de porta corresponde a qual máquina; Eu resolvi isso por tentativa e erro no passado apenas para descobrir depois que ele não funcionava realmente.

  1. Encaminhamento do endereço da LAN

Esta parte não tenho certeza se é possível. O que eu gostaria de ter é que o tráfego recebido para 192.168.2.10:54321 tenha origem no endereço de LAN da máquina de gateway, e não na Internet. (Estou tentando encaminhar a porta 443 para um servidor ssh, mas esse servidor já está visível externamente em um endereço IP diferente, portanto, o tráfego de resposta tomaria uma rota diferente.)

Eu modifiquei minhas regras padrão acima:

iptables -A PREROUTING -t nat -p tcp -d 1.2.3.4 --dport 12345 -j DNAT --to-destination 192.168.2.10:12345
iptables -A POSTROUTING -t nat -p tcp -d 192.168.2.10 --dport 12345 -j SNAT --to-source 192.168.2.5
iptables -A FORWARD -p tcp -d 192.168.2.10 --dport 12345 -j ACCEPT
iptables -A POSTROUTING -t nat -d 192.168.2.10 -s 192.168.2.0/24 -p tcp --dport 12345 -j SNAT --to 1.2.3.4

O tcpdump me mostra que o tráfego agora é do endereço da LAN do gateway, 192.168.2.5, e o servidor está respondendo, mas não está sendo encaminhado para o endereço externo. Eu estou suspeitando que isso nem é possível, que o tráfego de resposta precisa ter o endereço do cliente como seu destino, mas se o iptables puder redirecionar as respostas corretamente, eu apreciaria uma pista sobre como.

Além disso, se possível, incluindo a sintaxe correta para alterar a porta de destino, como na parte 1.

    
por Iain Brown 17.01.2018 / 21:44

1 resposta

1

Depois de algumas experiências, acho que respondi a minha pergunta, por isso devo publicá-la aqui, caso alguém considere útil. Sim, é possível, e é bastante simples, apenas uma questão de obter a combinação certa de endereços e portas.

Comentários do meu script:

# summary:
# allow forwarding *to* destination ip:port
# allow forwarding *from* destination ip:port
# nat packets identified by arrival at external IP / port to have
#  *destination* internal ip:port
# nat packets identified by arrival at internal IP / port to have
#  *source* internal network IP of gateway machine

Para o exemplo na pergunta:

# allow inbound and outbound forwarding
iptables -A FORWARD -p tcp -d 192.168.2.10 --dport 54321 -j ACCEPT
iptables -A FORWARD -p tcp -s 192.168.2.10 --sport 54321 -j ACCEPT

# route packets arriving at external IP/port to LAN machine
iptables -A PREROUTING -t nat -p tcp -d 1.2.3.4 --dport 12345 -j DNAT --to-destination 192.168.2.10:54321
# rewrite packets going to LAN machine (identified by address/port)
# to originate from gateway's internal address
iptables -A POSTROUTING -t nat -p tcp -d 192.168.2.10 --dport 54321 -j SNAT --to-source 192.168.2.5

O roteiro real, já que isso deve ser mais fácil de aplicar diretamente:

# EXTIP = external IP of gateway (1.2.3.4)
# EPORT = external port (12345)
# DIP   = destination IP in local network (192.168.2.10)
# DPORT = destination port (54321)
# INTIP = internal IP of gateway (192.168.2.5)

iptables -A FORWARD -p tcp -d $DIP --dport $DPORT -j ACCEPT
iptables -A FORWARD -p tcp -s $DIP --sport $DPORT -j ACCEPT

iptables -A PREROUTING -t nat -p tcp -d $EXTIP --dport $EPORT -j DNAT --to-destination $DIP:$DPORT
iptables -A POSTROUTING -t nat -p tcp -d $DIP --dport $DPORT -j SNAT --to-source $INTIP

Espero que a resposta seja útil para outra pessoa e que eu não esteja abarrotando o site com algo que já foi tratado muitas vezes.

    
por 02.02.2018 / 21:35