Desculpe, não posso fornecer um exemplo prático, mas o que você precisa deve ser possível usando do netfilter CONNTRACK alvo. Que diferença isso da MARK normal é que o CONNTRACK marca todo o tráfego em uma conexão, enquanto o MARK só marca pacotes. Então, a ideia seria:
- Marque as conexões de entrada em cada interface com números diferentes (por exemplo, "1" para gw1, "2" para gw2)
- Use "ip rule add fwmark 1 lookup 101" e "ip rule add fwmark 2 lookup 102" para tornar o tráfego com a marca 1 e a marca 2 para diferentes tabelas de rotas
- Crie uma rota padrão diferente para cada tabela: "ip route add default via 192.168.0.1 dev eth1 tabela 101" para gw1 e "ip route add default via 192.168.0.1 dev eth2 tabela 102" para gw2
As conexões provenientes da eth1 seriam CONNMARK com o fwmark 1, que seria mantido para todos os pacotes (entrada e saída); o mesmo aconteceria para as conexões provenientes da eth2, com o fwmark 2. Assim, o firewall sempre saberá qual interface usar nas respostas. As conexões iniciadas a partir do firewall ou dos hosts por trás dele passariam por qualquer interface / gateway que você escolhesse como seu principal.
Talvez você possa fazer isso mais facilmente usando um software de firewall pré-fabricado, como o Shorewall . Ele tem suporte multi-ISP, embora eu não saiba se ele usa CONNTRACK ou apenas MARK.