Balanceamento de carga: pacotes de resposta não roteados - iptables

2

Eu tenho um problema com o iptables. Estou tentando configurar um balanceador de carga entre dois uplinks. Eu posso marcar pacotes e conexões, usar regra ip para escolher a tabela de roteamento (mudando assim o gateway). Mas, quando eu defino a marca para rotear os pacotes através de um gw diferente do gw padrão do roteador, o pacote de resposta não é roteado apropriadamente.

Exemplo durante o ping 8.8.8.8:

17:41:48.061404 IP x.x.x.x > google-public-dns-a.google.com: ICMP echo request, id 2622, seq 1, length 64
17:41:48.079664 IP google-public-dns-a.google.com > x.x.x.x: ICMP echo reply, id 2622, seq 1, length 64

Eu tenho isso usando o tcpdump no roteador. Os segundos pacotes chegam ao roteador, mas nunca obtém o roteador corretamente para o cliente que está solicitando. Isso acontece com todos os pacotes.

Configuração:

  • copiou a tabela principal para wan_one e wan_two sem padrão gw.
  • a tabela principal possui um roteador gw padrão via GW 1
  • aplicava diferentes tabelas def gws a wan_x (GW 1 e GW 2).
  • # Match the packets
    ip rule add fwmark 1 lookup wan_one prio 1024
    ip rule add fwmark 2 lookup wan_two prio 1025
    
  • # Packets from router 1 or 2 gets routed through correct table
    ip rule add from [ROUTER IP FOR GW 1] table wan_one prio 1026
    ip rule add from [ROUTER IP FOR GW 2] table wan_two prio 1027
    
  • iptables -t mangle -A PREROUTING -j CONNMARK --restore-mark
    iptables -t mangle -A PREROUTING --match mark --mark 1 -j ACCEPT
    iptables -t mangle -A PREROUTING --match mark --mark 2 -j ACCEPT
    iptables -t mangle -A PREROUTING -i eth0 -m state --state NEW -m mark --mark 0 -j MARK --set-mark 1
    iptables -t mangle -A PREROUTING -i eth1 -m state --state NEW -m mark --mark 0 -j MARK --set-mark 2
    iptables -t mangle -A PREROUTING -m state --state NEW -m mark --mark 0 -i eth2 -j MARK --set-mark 2
    iptables -t mangle -A PREROUTING -j CONNMARK --save-mark
    

Vamos supor que o link 1 esteja em eth0, o link 2 esteja em eth1 e a LAN esteja em eth2.

Como posso fazê-lo funcionar?

    
por Francesco Zanini 28.10.2012 / 20:59

0 respostas