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:
# 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?