iptables nat mesma porta, vários provedores

1

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.

    
por Paul 27.05.2016 / 18:34

2 respostas

0

Quando os pacotes chegam pela interface X e são respondidos imediatamente pela mesma máquina, sua regra de roteamento baseada na origem pode capturar a resposta porque seu endereço IP de origem corresponderá necessariamente à regra.

Quando estes pacotes são subsequentemente encaminhados através da interface Y para outro IP, essa primeira parte da comunicação funcionará. Mas assim que o primeiro pacote de resposta chegar desse outro IP, ele entrará no analisador de regras de roteamento com seu próprio endereço IP de origem, não no roteador. Ele perderá as regras de roteamento baseadas na origem e, em vez disso, corresponderá à pesquisa padrão, que será baseada no destino como de costume.

O que você precisa fazer é marcar os pacotes conforme eles chegam na interface X, com esta marca persistindo no encaminhamento e, em seguida, combinar essa marca nas regras de roteamento para que uma tabela de roteamento de saída diferente seja usada.

    
por 27.05.2016 / 21:04
0

obrigado por explicações. Eu pensei que precisava ser feito com marcação de pacotes.

eu descobri usando mangle %código% basicamente eu marquei as conexões de entrada em cada interface e restaurei o marcador nas conexões rastreadas. então uma conexão marcada como a partir de eth1 sempre irá para regra fwmark 211 (0xd3) e eth4 via regra fwmark 200 (0xc8)

obrigado novamente :)

    
por 27.05.2016 / 21:24