Existem várias possibilidades, dependendo de como você deseja decidir quais pacotes vão para onde. A maioria deles exigirá alguma compreensão de como a rede TCP / IP funciona no Linux. As principais ferramentas que você precisará saber para fazer coisas complexas são iptables
(Ubuntu: iptables ) e iproute2 ( ip
comando) (Ubuntu: iproute , iproute-doc ).
Se você pode discriminar completamente pelo endereço IP de destino, é simples: direcione os endereços IP de acordo com seus desejos. Por exemplo, os seguintes comandos causarão todos os pacotes para 1.2.3. x e 1.2.4.2 para continuar ppp0
, e outros pacotes para continuar eth0
.
route add -net 1.2.3.4/24 ppp0
route add -host 1.2.4.2 ppp0
route add -net 0.0.0.0/0 eth0
Para requisitos mais complexos, você precisa começar a usar iptables
e ip route
. Por exemplo, os comandos a seguir configuram tabelas de roteamento especiais para que todos os pacotes marcados como 1 saiam via eth0
e todos os pacotes marcados com 2 saem via ppp0
(exceto os pacotes destinados a localhost
permanecer na interface de loopback).
ip rule add fwmark 1 table 1
ip route add 127.0.0.0/0 table 1 dev lo
ip route add 0.0.0.0/0 table 1 dev eth0
ip rule add fwmark 2 table 2
ip route add 127.0.0.0/8 table 2 dev lo
ip route add 0.0.0.0/0 table 2 dev ppp0
Agora você pode usar iptables
para "manipular" pacotes de saída, adicionando uma marca que decidirá qual rota eles seguirão. Por exemplo, veja como enviar todo o tráfego SMTP de saída (porta 25) via eth0
e todo o tráfego originado por um aplicativo em execução como o usuário proxy
via ppp0
.
iptables -t mangle -A OUTPUT -p tcp --dport 25 -j MARK --set-mark 1
iptables -t mangle -A OUTPUT -m owner --uid-owner proxy -j MARK --set-mark 2
Veja também 2 interfaces de rede conectadas à Internet. Escolha aquele a ser usado de acordo com o nome do domínio e vincule o software a diferentes interfaces de rede .
Você precisará providenciar a execução desses comandos quando as duas interfaces estiverem conectadas. Eu recomendo que você escreva um script chamado /etc/network/if-up.d/0justin-routes
que execute os comandos que você deseja. Este script será executado sempre que uma interface de rede for aberta; como o nome começa com a, 0
ele será executado no início desse processo, antes da instalação específica do aplicativo que pode esperar que as rotas estejam no lugar. Existe uma simétrica /etc/network/if-down.d/
caso você também queira fazer coisas quando uma das interfaces cair. (Todas as rotas associadas serão apagadas automaticamente, o que pode deixar alguns pacotes ociosos quando você deseja que eles voltem para a outra interface.)
Os scripts ifup estão documentados no interfaces(5) man page
. A principal coisa a saber é que o nome da interface que está sendo ativada ou desativada está na variável de ambiente IFACE
. Você pode descobrir se a outra interface já está em uso if ifconfig | sed 's/ .*//' | grep -Fqx 'eth0'; then …
.