Conexão de rede dupla

9

Eu tenho um modem celular USB e uma conexão LAN doméstica na minha caixa do Ubuntu 10.10.

Ambos trabalham de forma independente.

Quero saber como conectar os dois ao mesmo tempo e poder especificar qual aplicativo usa qual dispositivo conectar-se à Internet.

Alguém sabe como fazer isso?

Justin Alexander
fonte

Respostas:

11

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 Instale o iptables ) e iproute2 ( ipcomando) (Ubuntu: iproute Instale o iproute , iproute-doc Instale o 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 iptablese ip route. Por exemplo, os comandos a seguir configuram tabelas de roteamento especiais para que todos os pacotes marcados como 1 saiam via eth0e todos os pacotes marcados com 2 saem via ppp0(exceto os pacotes destinados a localhostpermanecer 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 iptablespara "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 eth0e todo o tráfego originado por um aplicativo em execução como o usuário proxyvia 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-routesque 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, 0ele 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 ….

Gilles 'SO- parar de ser mau'
fonte
@Justin: Esta não é uma coisa que eu tenho muita experiência com, por isso, dar um feedback do que funcionou, o que não funcionou, o que você não entende, etc.
Gilles 'SO parada sendo maus'
11
Tenho duas adições a serem feitas: Primeiro, isso envia tráfego no ppp0 com o endereço de origem do eth0. Você pode alterar isso usando :, iptables -t nat -A POSTROUTING -o tun0 -j SNAT --to-source ppp_iponde ppp_ipé o endereço IP desse adaptador. Em segundo lugar, você precisará desativar estritamente rp_filterem /proc/sys/net/ipv4/config/ppp0/rp_filter. Ele faz o trabalho quando definir o modo, que é 2. para relaxar
Karalga