minha configuração:
# ip route sh
zzz.zzz.zzz.0/24 dev eth3 proto kernel scope link src zzz.zzz.zzz.1
yyy.yyy.yyy.0/24 dev eth1 proto kernel scope link src yyy.yyy.yyy.146
xxx.xxx.xx8.0/23 dev eth4 proto kernel scope link src xxx.xxx.xx9.47
169.254.0.0/16 dev eth3 scope link metric 1002
169.254.0.0/16 dev eth4 scope link metric 1003
169.254.0.0/16 dev eth1 scope link metric 1004
default via xxx.xxx.xxx.1 dev eth4
# ip rule sh
0: from all lookup local
217: from xxx.xxx.xx9.47 lookup table1
219: from yyy.yyy.yyy.146 lookup table2
32766: from all lookup main
32767: from all lookup default
# ip ro sh table table2
zzz.zzz.zzz.0/24 dev eth3 proto kernel scope link src zzz.zzz.zzz.1
yyy.yyy.yyy.0/24 dev eth1 proto kernel scope link src yyy.yyy.yyy.146
default via yyy.yyy.yyy.1 dev eth1
# ip ro sh table table1
zzz.zzz.zzz.0/24 dev eth3 proto kernel scope link src zzz.zzz.zzz.1
xxx.xxx.xx8.0/23 dev eth4 proto kernel scope link src xxx.xxx.xx9.47
default via xxx.xxx.xx8.1 dev eth4
iptables -t nat -L POSTROUTING
MASQUERADE all -- * eth4 0.0.0.0/0 0.0.0.0/0
MASQUERADE all -- * eth1 0.0.0.0/0 0.0.0.0/0
rp_filter é definido como 0 (experimentado com 2, a mesma coisa)
quando eu tento acessar xxx.xxx.xx9.47 ou yyy.yyy.yyy.146 da internet eles funcionam perfeitamente com essa configuração.
da lan (zzz.zzz.zzz.0 / 24) a internet funciona perfeita, o tráfego sai pela rota padrão.
eu encaminhei uma porta para um computador em zzz.zzz.zzz.0 / 24 lan
# iptables -t nat -L PREROUTING -nv
DNAT tcp -- eth4 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:aa to:zzz.zzz.zzz.3:bb
DNAT tcp -- eth1 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:aa to:zzz.zzz.zzz.3:bb
da internet eu posso acessar zzz.zzz.zzz.3 na porta aa somente usando xxx.xxx.xx9.47, o ip da rota padrão.
Eu recebo conexão falhou de yyy.yyy.yyy.146, que não é rota padrão.
O tcpdump na eth1 mostra apenas tráfego de entrada
se eu tcpdump a interface de rota padrão (neste caso, eth4) eu vejo os pacotes tentando deixar a interface com o ip de origem yyy.yyy.yyy.146 bruxa, claro que não funciona
se eu mudar a rota padrão para a eth1, a coisa oposta exata acontecerá.
Eu recebo respostas de yyy.yyy.yyy.146 na porta aa e conexão falhou de xxx.xxx.xx9.47
tcpdump a eth1 vejo os pacotes tentando sair em eth1 com xxx.xxx.xx9.47 ao tentar acessar xxx.xxx.xx9.47 em uma porta
mudou de maquerade com snat
# iptables -t nat -L POSTROUTING
SNAT all -- * eth1 0.0.0.0/0 0.0.0.0/0 to:yyy.yyy.yyy.146
SNAT all -- * eth4 0.0.0.0/0 0.0.0.0/0 to:xxx.xxx.xx9.47
e ainda tcpdump na rota padrão mostra pacotes de resposta com a fonte yyy.yyy.yyy.146 saindo da eth4
então ... trabalho de snat ou masquerade, contrack funciona. Eu realmente não entendo porque ele só tenta responder apenas na interface padrão, mesmo se o ip de origem é da outra interface ... e como é que ele snat em uma interface com ip do outro.
o sistema operacional é centos 6.8.