A maneira correta de fazer isso é ligar () à interface que você deseja usar para pacotes de saída. Desde então, você pode configurar rotas com os comandos ip route
e ip rule
para controlar como os pacotes são roteados com base em sua interface de saída. Para o meu exemplo, assumirei a seguinte rede:
- eth0:
- Endereço: 192.168.0.2/24
- Gateway Padrão: 192.168.0.1
- eth1:
- Endereço: 192.168.1.2/24
- Gateway Padrão: 192.168.1.1
Vou criar duas tabelas de roteamento, uma para o tráfego de saída para eth0 chamado alternativo e uma tabela para eth1 chamada main. A tabela de roteamento main sempre existe e é a tabela normal usada pelos comandos route
e ip route
. A maioria das pessoas nunca lida com outras mesas. Para criar a tabela chamada alternativa, adicionaremos a seguinte linha ao/etc/iproute2/rt_tables
:
10 alternate
A tabela principal tem uma prioridade padrão de 254. As regras para as quais a tabela de roteamento está em vigor são controladas pelo ip rule
comando. Por padrão, esse comando imprimirá uma lista de regras existentes que devem se parecer com isso:
0: from all lookup local
32766: from all lookup main
32767: from all lookup default
Isso basicamente diz que procurará uma rota na tabela, local
que é uma tabela especial mantida pelo kernel para rotas locais, como meu próprio endereço IP. Ele tentará a tabela principal e a tabela padrão. O padrão da tabela normalmente está em branco; portanto, se não houver correspondência principal, não haverá rota para o host. Primeiro, vamos preencher a tabela alternadamente com as regras para eth0.
sudo ip route add table alternate 192.168.0.0/24 dev eth0
sudo ip route add table alternate 192.168.1.0/24 dev eth1
sudo ip route add table alternate default via 192.168.0.1
Você normalmente deseja que a alternate
tabela seja semelhante àmain
tabela. As únicas diferenças são quando o roteamento deve ser diferente. Você pode não querer incluir a segunda linha acima, se desejar literalmente que todo o tráfego NFS, HTTP etc. seja transmitido pelo gateway padrão no eth0, mesmo que seja destinado à rede no eth1. O próximo passo é adicionar uma regra para quando usar esta tabela de roteamento alternativa:
sudo ip rule add from 192.168.0.0/24 pref 10 table alternate
Esta regra diz que qualquer tráfego proveniente de um endereço na rede 192.168.0 usará a alternate
tabela de roteamento em vez da main
tabela normal . A última etapa é garantir que todos os clientes que devem usar se eth0
liguem a ele. Com wget
, por exemplo, definido --bind-address=192.168.0.2
, para NFS defina oclientaddr=192.168.0.2
opção de montagem. Se você estiver usando o LibWWW com Perl, poderá definir a opção localaddr em LWP :: UserAgent para controlar a interface local à qual se liga. Se você possui um cliente, não pode controlar a fonte de ligação e compilação não é uma opção, poderá usar uma regra iptables para modificar seu endereço, mas isso é mais um hack e pode não funcionar. Você precisaria de uma regra SNAT configurada na cadeia PREROUTING da tabela nat ou da tabela mangle. Você ainda precisará das tabelas de roteamento modificadas fornecidas acima para que isso funcione.
iftop
e cada uma mostra o tipo certo de tráfego. Muito obrigado.