iptables encaminhamento de pacotes para um dos dois gateways, dependendo da origem

2

Dada a seguinte instalação:

old router  192.168.1.1     with NAT forward of tcp port 80 to 192.168.1.10:80
new router  192.168.1.2     with NAT forward of tcp port 80 to 192.168.1.10:80
web server  192.168.1.10    with default gateway 192.168.1.1

Atualmente, a entrada DNS do meu serviço aponta para o endereço externo do roteador antigo. O roteador faz um encaminhamento de porta do tráfego para o servidor da web que retorna a resposta de volta ao gateway antigo.

Para uma migração perfeita para um novo roteador (com outro IP externo), primeiro configurarei um novo roteador, testarei tudo com as duas conexões ativas e alterarei o IP do DNS para o novo endereço externo.

Agora, com a configuração acima, o roteador antigo ainda funciona. Mas as conexões tcp que são endereçadas ao novo roteador, também são respondidas ao roteador antigo que não pode manipulá-las.

Eu pensei em usar o nat com o masquerading, mas todo o tráfego endereçado ao novo roteador será parecido com o tráfego local. Isso engana filtros e logs baseados em ip do servidor.

Agora, meu plano é usar um PC auxiliar com o Debian e o iptables para uma solução temporária:

old router  192.168.1.1     with NAT forward of tcp port 80 to 192.168.1.10:80
new router  192.168.1.2     with NAT forward of tcp port 80 to 192.168.1.20:80
web server  192.168.1.10    with default gateway 192.168.1.20
helper pc   192.168.1.20

o pc auxiliar agora é responsável por encontrar o gateway correto:

  • manter o estado das conexões que foram encaminhadas por 192.168.1.2 e encaminhá-las sem modificar para 192.168.1.10 (eu penso em identificá-las pelo seu endereço mac de origem e SYN)
  • encaminhar pacotes de conexões rastreadas para 192.168.1.2
  • encaminhar pacotes de conexões não rastreadas para 192.168.1.1

Encontrei muitas informações na Internet, especialmente no serverfault.com ( especialmente este , mas todos eles cobrem apenas uma parte deste problema. Eu acho que precisa de uma combinação de regras de filtro baseadas no endereço MAC -m mac --mac-source <mac> , NAT, states e rt_tables --set-mark / ip rule add fwmark (--gw não parece ser suportado pelo Debian).

    
por Daniel Alder 15.01.2014 / 18:10

2 respostas

3

Existem duas soluções eficazes, dependendo do cenário.

Solução 1: O servidor web é Linux e totalmente sob seu controle.

Primeiro, verifique se /etc/iproute2/rt_tables contém as seguintes linhas:

201     gw1
202     gw2

Em segundo lugar, preencha as tabelas

ip route add table gw1 default via $GW1_IP dev $ETH metric 100
ip route add table gw2 default via $GW2_IP dev $ETH metric 100

Em terceiro lugar, crie duas regras iproute2 para "desviar" o processamento para essas tabelas personalizadas:

ip rule add prio 100 from all fwmark 1 lookup gw1
ip rule add prio 110 from all fwmark 2 lookup gw2

Finalmente, crie o conjunto de comandos iptables para marcar os pacotes correspondentes corretamente:

# Make sure mark exists before routing happens
#   The first handles incoming packets
-t mangle -A PREROUTING -j CONNMARK --restore-mark
#   The second handles outgoing packets
-t mangle -A OUTPUT     -j CONNMARK --restore-mark

# Mark packets and save the mark    
-t mangle -A INPUT -m mac --mac-source $GW1_MAC -j MARK --set-mark 1
-t mangle -A INPUT -m mac --mac-source $GW2_MAC -j MARK --set-mark 2
-t mangle -A INPUT -j CONNMARK --save-mark

Solução 2: O servidor web não é Linux e / ou não está totalmente sob seu controle

Esta solução é muito semelhante à solução anterior. A diferença está no conjunto de regras do iptables:

# Make sure mark exists before routing happens
-t mangle -A PREROUTING -j CONNMARK --restore-mark

# Mark packets and save the mark    
-t mangle -A FORWARD -m mac --mac-source $GW1_MAC -j MARK --set-mark 1
-t mangle -A FORWARD -m mac --mac-source $GW2_MAC -j MARK --set-mark 2

-t mangle -A POSTROUTING -j CONNMARK --save-mark

Editar: Solução Modificada 2

Ainda é o mesmo que o acima, mas adicione:

ip rule add prio 10 to 192.168.1.0/24 lookup main

isso garante que os pacotes destinados à rede local (suponho que 192.168.1.0/24 ) não serão manipulados pelos gateways.

Além disso, adicione outra regra iptables :

-t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 192.168.1.10

Por fim, os ambos gateways encaminham a porta 80 para o 'helper pc'; Ele irá poupar bastante dor de cabeça ao tentar solucionar problemas de conexões "semiabertas" (porque, no seu plano atual, o "pc auxiliar" só pode ver o tráfego proveniente do servidor da Web, em vez de o tráfego ser feito de maneira simultânea).

    
por 22.01.2014 / 14:57
0

Se for para um teste local, você poderá usar a opção -s do iptables para informar ao seu antigo roteador que, se o tráfego se originar desse IP de origem, encaminhá-lo para o novo roteador. Em seguida, o novo roteador encaminhará sua solicitação ao servidor da Web (com base na configuração fornecida).

Mesmo se você estiver testando de fora de sua configuração, ainda será possível filtrar seu endereço de origem ip com -s.

Exemplo:

iptables -I PREROUTING -i eth0 -s x.x.x.x -p tcp -m tcp --dport 80 -j DNAT --to-destination 192.168.1.2:80
    
por 15.01.2014 / 20:12