Configuração de teste: Dois namespaces de rede ns0
(seu servidor de e-mail externo), ns1
(seu HOST). O namespace principal da rede (seu NAT) faz o encaminhamento e o nat. Dois pares de vet conectando namespaces:
ns0 ---> <------ main ns -----> <--- ns1
veth0b --- veth0a veth1a --- veth1b
10.0.0.1 10.0.0.254 10.0.1.254 10.0.1.1
tcpdump
em veth0a e veth1a. nc -k -l -p 9999
escuta na porta 9999 em ns0
como "servidor de email". Cliente através de vários comandos nc
em ns1
. Conexão normal, sem nat, porta de origem aleatória por padrão:
$ echo foo | nc 10.0.0.1 9999 -q0
veth*a: IP 10.0.1.1.60560 > 10.0.0.1.9999
veth*a: IP 10.0.0.1.9999 > 10.0.1.1.60560
Corresponder na porta de origem (adicionei -s
a todas as correspondências para evitar surpresas, mas também funciona sem -s
):
# iptables -t nat -A POSTROUTING -o veth0a -s 10.0.1.1/32 -p tcp --sport 8001 -j SNAT --to 10.0.1.81:9900
$ echo foo | nc 10.0.0.1 -p 8001 9999 -q0
veth1a: IP 10.0.1.1.8001 > 10.0.0.1.9999
veth0a: IP 10.0.1.81.9900 > 10.0.0.1.9999
veth0a: IP 10.0.0.1.9999 > 10.0.1.81.9900
veth1a: IP 10.0.0.1.9999 > 10.0.1.1.8001
Corresponde à porta de destino (não alcança "servidor" porque as regras não podem reescrever a porta de destino):
# iptables -t nat -A POSTROUTING -o veth0a -s 10.0.1.1/32 -p tcp --dport 7002 -j SNAT --to 10.0.1.82:9900
$ echo bar | nc 10.0.0.1 7002 -q0
veth1a: IP 10.0.1.1.38614 > 10.0.0.1.7002
veth0a: IP 10.0.1.82.9900 > 10.0.0.1.7002
veth0a: IP 10.0.0.1.7002 > 10.0.1.82.9900
veth1a: IP 10.0.0.1.7002 > 10.0.1.1.38614
Como você pode ver, o endereço de origem e a porta de origem são traduzidos corretamente. No S NAT (fonte nat), você só pode traduzir o endereço e a porta source , é o que o S significa, e é isso que a documentação que você vinculou diz. Por outro lado, no DNAT, você pode traduzir o endereço destionation e a porta. SNAT acontece em POSTROUTING (deve estar em veth0a
nesta configuração), DNAT em PREROUTING (deve estar em veth1a
nesta configuração). Então você não pode combinar ambos em uma regra, e você não pode fazer um DNAT após SNAT, porque PREROUTING acontece antes de POSTROUTING.
Estou com a impressão de que o que você realmente quer fazer é acessar vários servidores de e-mail, mas controlar o endereço source ao qual você vê substituindo a porta canônica 25 por outro destino portas. Por exemplo, mail.xxx.com:26
deve entrar em contato com mail.xxx.com:25
vindo de um endereço e mail.xxx.com:27
deve entrar em contato com mail.xxx.com:25
vindo de outro endereço. (Eu realmente espero que isso não esteja ligado ao envio de email de spam ...) Portanto, a porta de origem não importa, a porta de destino determinada determina o endereço de origem e a porta de destino deve ser alterada de volta para 25. Isso está correto? Se sim, isso não pode ser feito facilmente no Linux devido ao modo como o nat funciona.
E se você conseguir convencê-lo de que não precisa dele para o spam, posso pensar em duas opções melhores (dependendo do que seu software MTA pode fazer).