O caminho adequado para isso é vincular () à 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, vou assumir 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 alternate e uma tabela para eth1 chamada main. O principal da tabela de roteamento sempre existe e é a tabela normal usada pelos comandos route
e ip route
. A maioria das pessoas nunca lida com outras tabelas. Para criar a tabela chamada alternada, adicionaremos a seguinte linha a /etc/iproute2/rt_tables
:
10 alternate
O main da tabela tem uma prioridade padrão de 254. As regras para as quais a tabela de roteamento está em vigor são controladas pelo comando ip rule
. Por padrão, esse comando irá imprimir uma lista de regras existentes que devem ser algo como isto:
0: from all lookup local
32766: from all lookup main
32767: from all lookup default
Isso basicamente diz que ele procurará uma rota na tabela local
, que é uma tabela especial mantida pelo kernel para rotas locais, como meu próprio endereço IP. Em seguida, ele tentará o padrão main e table da tabela. O padrão da tabela é normalmente em branco, portanto, se não houver correspondência na principal, não haverá rota para hospedar. Primeiro, vamos preencher tabela alternativa com 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
Normalmente, você deseja que a tabela alternate
seja semelhante à tabela main
. As únicas diferenças são quando o roteamento deve ser diferente. Você pode querer não incluir a segunda linha acima se você quer literalmente que todo o tráfego NFS, HTTP, etc. vá através do gateway padrão na eth0, mesmo que seja destinado à rede na eth1. O próximo passo é adicionar uma regra para quando usar essa 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 tabela de roteamento alternate
em vez da tabela main
normal. O último passo é garantir que todos os clientes que devem usar eth0
se vinculem a ele. Com wget
, por exemplo, defina --bind-address=192.168.0.2
, para o NFS defina a opção clientaddr=192.168.0.2
mount. Se estiver usando LibWWW com Perl, você pode definir a opção localaddr em LWP :: UserAgent para controlar a interface local à qual se liga. Se acontecer de você ter um cliente que você não pode controlar a vinculação e compilar a fonte não é uma opção, você 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.