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).