Responder na mesma interface como entrada?

44

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 chega na interface de rota não-padrão, a resposta é enviada de volta através da interface de rota padrão. Existe uma maneira de usar o iptables (ou outra coisa) para rastrear a conexão e enviar a resposta de volta através da interface de onde veio?

    
por Shawn J. Goff 29.11.2010 / 23:56

4 respostas

49
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 acima não requer qualquer marcação de pacote com ipfilter. Ele funciona porque os pacotes de saída (resposta) terão o endereço IP que foi originalmente usado para conectar-se à segunda interface como o endereço de origem (de) no pacote de saída.

    
por 26.10.2011 / 21:10
6

Os comandos a seguir criam uma tabela de roteamento alternativa via eth1 para pacotes que possuem a marca 1 (exceto pacotes para localhost). O comando ip é do pacote iproute2 (Ubuntu: proute 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; então use iptables -t mangle -A OUTPUT … -j MARK --set-mark 1 nestes pacotes para que eles sejam roteados através da tabela de roteamento 1. Eu acho que o seguinte deve fazer isso (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 é o suficiente, talvez seja necessária outra regra nos pacotes de entrada para dizer ao módulo conntrack para rastreá-los.

    
por 30.11.2010 / 00:16
3

Estou assumindo que você está executando o Linux e, além disso, que você está utilizando uma distribuição baseada em RedHat / CentOS. Outros Unix e distribuições exigirão etapas semelhantes - mas os detalhes serão diferentes.

Comece por testar (note que isso é muito semelhante à resposta de @ Peter. Estou assumindo o seguinte:

  • eno0 é isp0 e possui o gateway padrão geral
  • eno1 é isp1 e tem o IP / intervalo 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 teriam sido enviados do IP correto - mas anteriormente estavam sendo enviados pela interface errada. Agora, esses pacotes do IP correto serão enviados pela interface correta.

Assumindo que o acima funcionou, agora você pode tornar a regra e rotear as alterações 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 que a mudança de rede é permanente:

$ ifdown eno1 ; ifup eno1

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

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

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

$ yum install NetworkManager-dispatcher-routing-rules

Outra recomendação strong é ativar o filtro arp, pois isso evita outros problemas relacionados com 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
    
por 11.08.2017 / 11:54
3

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 encontrar problemas de sintaxe com a 4ª linha acima. Em tais casos, a sintaxe do quarto comando pode ser agora:

ip rule add iif <interface> table isp2 priority 1000
    
por 23.09.2016 / 09:31