Existem várias possibilidades, dependendo de como você deseja decidir quais pacotes vão para onde. A maioria deles exigirá algum entendimento de como a rede TCP / IP funciona no Linux. As principais ferramentas que você precisa saber para fazer coisas complexas são iptables
(Ubuntu: iptables ) e iproute2 (comando ip
) (Ubuntu: iproute ,
Se você puder discriminar totalmente pelo endereço IP de destino, é simples: rotear os endereços IP de acordo com seus desejos. Por exemplo, os seguintes comandos farão com que todos os pacotes para 1.2.3. x e 1.2.4.2 passem por ppp0
, e outros pacotes passem por 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 seguintes comandos configuram tabelas de roteamento especiais para que todos os pacotes marcados com 1 saiam por eth0
e todos os pacotes marcados com 2 saiam por ppp0
(exceto que os pacotes destinados a localhost
permanecem 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 "mangle" pacotes de saída, adicionando uma marca que decidirá qual rota tomar. Por exemplo, aqui está 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 o que usar de acordo com o nome de domínio e ligue o software a diferentes interfaces de rede .
Você precisará organizar esses comandos para serem executados quando as duas interfaces estiverem conectadas. Eu recomendo que você escreva um script chamado /etc/network/if-up.d/0justin-routes
que executa os comandos que você quer. Este script será executado sempre que uma interface de rede for ativada; como seu nome começa com 0
, ele será executado no início desse processo, antes da configuração específica do aplicativo, que pode esperar que as rotas estejam no lugar. Há um /etc/network/if-down.d/
simétrico caso você também queira fazer alguma coisa quando uma das interfaces é desativada. (Todas as rotas associadas serão automaticamente apagadas, o que pode deixar alguns pacotes retidos quando você quiser que eles voltem para a outra interface.)
Os scripts do 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á com if ifconfig | sed 's/ .*//' | grep -Fqx 'eth0'; then …
.