Responder na mesma interface que a entrada?


51

Eu tenho um sistema com duas interfaces. Ambas as interfaces estão conectadas à Internet. Um deles é definido como a rota padrão; um efeito colateral disso é que, se um pacote chegar na interface de rota não padrão, a resposta será enviada de volta através da interface de rota padrão. Existe uma maneira de usar o iptables (ou algo mais) para rastrear a conexão e enviar a resposta de volta pela interface de origem?

Respostas:


61
echo 200 isp2 >> /etc/iproute2/rt_tables
ip rule add from <interface_IP> dev <interface> table isp2
ip route add default via <gateway_IP> dev <interface> table isp2

O item acima não requer nenhuma marcação de pacote com o ipfilter. Funciona porque os pacotes de saída (resposta) terão o endereço IP que foi originalmente usado para conectar-se à 2ª interface como o endereço de origem (no) no pacote de saída.


7
Uau, isso é exatamente o que eu estava procurando. Caso alguém esteja procurando, por distros baseadas em RH, você pode colocar os comandos de regra e rota relevantes em arquivos denominados 'rule-eth0' ou 'route-eth0' (por exemplo) que serão adicionados ou removidos em ifup / ifdown. Coloque esses arquivos ao lado do arquivo ifcfg-eth0. Para o IPv6, há a funcionalidade 'route6-eth0' incorporada, mas nenhuma 'regra6-eth0' incorporada (ainda).
precisa

18
Para mim funcionou apenas quando eu deixei de fora o devparam no ip rulecomando, portanto executarip rule add from <interface_IP> table isp2
cdauth

2
Você pode criar esses itens quando a interface for ativada, adicionando up ip rule add from <interface_IP> table isp2e up ip route add default via <gateway_IP> dev ppp0 table isp2ao seu / etc / network / interfaces na interface relevante.
fácil

4
Eu tinha que remover dev <interface>a partir ip rulede obtê-lo a trabalhar na minha caixa. Se estou entendendo direito, dev <interface>estava filtrando pacotes que de alguma forma estavam configurados na interface errada que precisavam ser digitados na interface correta pela rota substituída, mas a regra de filtragem por interface estava impedindo que isso acontecesse.
binki

2
Como a maioria das outras pessoas, tive que remover dev <interface>do ip rulecomando para que isso funcionasse. Atualize a resposta! Exceto por esse detalhe, funcionou como um encanto. Muito obrigado, @ Peter!
MoonSweep

6

Os comandos a seguir criam uma tabela de roteamento alternativa via eth1pacotes com a marca 1 (exceto pacotes para o host local). O ipcomando é do pacote iproute2 (Ubuntu: iproute Instale o iproute http://bit.ly/software-small , iproute-doc Instale o iproute-doc http://bit.ly/software-small ).

ip rule add fwmark 1 table 1
ip route add 127.0.0.0/0 table 1 dev lo
ip route add 0.0.0.0/0 table 1 dev eth1

A outra metade do trabalho é reconhecer pacotes que devem receber a marca 1; use iptables -t mangle -A OUTPUT … -j MARK --set-mark 1esses pacotes para rotear a tabela de roteamento 1. Acho que o seguinte deve ser feito (substitua 1.2.3.4 pelo endereço da interface de rota não padrão):

iptables -t mangle -A OUTPUT -m conntrack --ctorigdst 1.2.3.4 -j MARK --set-mark 1

Não tenho certeza se isso é suficiente, talvez outra regra seja necessária nos pacotes recebidos para dizer ao módulo conntrack para rastreá-los.


Agradável. Eu esqueci tudo sobre marcar. Isso deve me levar até lá.
Shawn J. Goff

5

Eu tive problemas com os pacotes gerados localmente com a solução sugerida por Peter. Descobri que o seguinte corrige isso:

echo 200 isp2 >> /etc/iproute2/rt_tables
ip rule add from <interface_IP> table isp2 priority 900
ip rule add from dev <interface> table isp2 priority 1000
ip route add default via <gateway_IP> dev <interface> table isp2
ip route add <interface_prefix> dev <interface> proto static scope link src <interface_IP> table isp2

NOTA: Você pode ter problemas de sintaxe com a quarta linha acima. Nesses casos, a sintaxe do 4º comando pode ser agora:

ip rule add iif <interface> table isp2 priority 1000

Tentei muito, mas nada funcionou no meu cenário, exceto isso .. muito obrigado.
agaggi

3

Suponho que você esteja executando o Linux e, além disso, que esteja utilizando uma distribuição baseada no RedHat / CentOS. Outras Unix e distribuições exigirão etapas semelhantes - mas os detalhes serão diferentes.


Comece testando (observe que isso é muito semelhante à resposta de @ Peter. Estou assumindo o seguinte:

  • eno0 é isp0 e possui o gateway padrão geral
  • eno1 é isp1 e possui o intervalo IP / 192.168.1.2/24 com gateway 192.168.1.1

Os comandos são os seguintes:

$ echo 200 isp1 >> /etc/iproute2/rt_tables
$ ip rule add from eno1 table isp1
$ ip route add default via 192.168.1.1 dev eno1 table isp1

O firewall não está envolvido de forma alguma. Os pacotes de resposta sempre eram enviados do IP correto - mas anteriormente eram enviados pela interface errada. Agora, esses pacotes do IP correto serão enviados pela interface correta.


Supondo que o procedimento acima funcionou, agora você pode tornar a regra e as alterações de rota permanentes. Isso depende de qual versão do Unix você está usando. Como antes, estou assumindo uma distribuição Linux baseada em RH / CentOS.

$ echo "from eno1 table isp1" > /etc/sysconfig/network-scripts/rule-eno1
$ echo "default via 192.168.1.1 dev eno1 table isp1" > /etc/sysconfig/network-scripts/route-eno1

Teste se a alteração de rede é permanente:

$ ifdown eno1 ; ifup eno1

Se isso não funcionou, nas versões posteriores do RH / CentOS você também precisa seguir uma das duas opções:

  • Não use o NetworkManager.service padrão ; Use network.service . Eu não explorei as etapas exatas necessárias para isso. Eu imagino que envolve os comandos chkconfig ou systemctl padrão para ativar / desativar serviços.
  • Instale o pacote NetworkManager-dispatcher-routing-rules

Pessoalmente, prefiro instalar o pacote de regras, pois é a abordagem mais simples e com suporte:

$ yum install NetworkManager-dispatcher-routing-rules

Outra forte recomendação é habilitar a filtragem arp, pois isso evita outros problemas relacionados às configurações de rede dupla. Com o RH / CentOS, adicione o seguinte conteúdo ao arquivo /etc/sysctl.conf:

net.ipv4.conf.default.arp_filter=1
net.ipv4.conf.all.arp_filter=1
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.