Como rotear um aplicativo fora da rota VPN / padrão?

0

Eu tenho uma máquina Linux que está sempre conectada a uma VPN (interface vpn0), e a rota padrão passa pela interface vpn0. A conexão ao meu roteador é feita através da interface wlan0.

Eu gosto do fato de ele rotear tudo através da VPN, e há razões para manter essa configuração. Mas como a VPN é bastante lenta, gostaria de poder lançar alguns aplicativos específicos com uma rota padrão diferente: uma que passa diretamente por wlan0 em vez de vpn0. Não quero, por exemplo, que meu apt-get update ou streaming de navegador da Web-rádio seja transmitido pela VPN.

Eu pesquisei muito por isso e realmente não encontrei ninguém com o mesmo problema. Uma solução que encontrei exige que eu use eth0: eu conectaria eth0 à rede, criaria um novo namespace de rede e, em seguida, moveria eth0 para esse novo namespace e o usaria normalmente. Então, posso iniciar aplicativos usando ip netns exec nsname command . O grande problema com essa solução é que ela exige que eu conecte ambos através de eth0 e wlan0, e estou procurando uma solução que use apenas wlan0 - já que hoje em dia muitas máquinas nem mesmo possuem ethernet.

Parece que o caminho a seguir seria: criar um novo namespace de rede, criar um par de ethernet virtual (veth0 e veth1), mover veth1 para o novo namespace e fazer alguma mágica para rotear o material do outro namespace de rede para usar wlan0 como um gateway em vez de vpn0.

Como veth1 está no novo NS, e veth0 está no NS padrão, e ambos estão conectados, acho que provavelmente queremos encontrar uma maneira de redirecionar o tráfego veth0 para usar uma rota diferente (ou tabela de roteamento?) o padrão. Parece que eu poderia usar o "roteamento baseado em políticas", mas até agora todas as minhas tentativas falharam. Além disso, como o wlan0 não permite os mesmos recursos interessantes que o eth0 (como anexar pontes), esta solução provavelmente envolveria algum tipo de nat / masquerading.

Alguém pode me dar uma luz aqui? Talvez um patch para o roteiro abaixo?

Nota: a interface wlan0 tem um IP 192.168.1.3 e o roteador sem fio é 192.168.1.1. Além disso, os aplicativos dentro da VPN precisam usar http_proxy e amigos, mas não preciso disso quando não estou na VPN.

Eu tentei muitas coisas diferentes, mas esta é uma lista da maioria dos comandos que tentei:

echo 1 > /proc/sys/net/ipv4/ip_forward

# Create the novpn namespace, the virtual interfaces and configure them
ip netns add novpn
ip link add name veth0 type veth peer name veth1
ip link set veth1 netns novpn
ifconfig veth0 192.168.1.100/24 up
ip netns exec novpn ifconfig veth1 192.168.1.101/24 up

# Route stuff from veth0 to wlan0 using NAT. I don't know if this is
# really what I want because it uses the default routing tables
iptables -t nat -A POSTROUTING -o wlan0 -j MASQUERADE
iptables -A FORWARD -i veth0 -j ACCEPT

# Do some magic to configure the routing tables on the new NS
ip netns exec novpn ip route add default via ?.?.?.? dev veth1

# Maybe try to route some stuff with a new routing table called novpn:
ip rule add iif veth0 lookup novpn
ip route add default dev wlan0 table novpn
ip route ???
ip route flush cache

Também me disseram que talvez eu pudesse usar uma configuração que envolvesse apenas o tráfego "interno" através da VPN, mas realmente não quero isso.

    
por pzanoni 16.09.2014 / 21:35

1 resposta

1

É realmente mais fácil do que isso.

O que você precisa fazer é configurar o roteamento de políticas para que você tenha duas tabelas de roteamento distintas e uma regra que informe ao seu PC quando usar qualquer uma delas.

Você inicia seu vpn, e vamos supor que você tenha uma interface tap0 / tun0 com o endereço IP 10.0.0.71 e uma interface wlan0 com o endereço 192.168.0.5.

Agora, precisamos configurar o roteamento de políticas:

 echo 201 novpn >> /etc/iproute2/rt_tables
 ip route add 192.168.0.0/24 dev wlan0 src 192.168.0.5 table novpn
 ip route add default via 192.168.0.1 table novpn
 ip rule add from 192.168.0.5 table novpn
 ip rule add from 10.0.0.71 table main

e agora você está feito. Você terá que vincular aplicativos específicos para qualquer interface, dependendo se você deseja usar ou não a VPN. Ligar uma aplicação a uma interface é geralmente fácil, exceto pelo notoriamente pegajoso Firefox, para o qual você pode querer ler esta página da Web .

Lembre-se de que você tem permissão para um único conjunto de servidores DNS, conforme especificado em /etc/resolv.conf. Você deve se certificar de que pelo menos um deles esteja acessível para qualquer uma das interfaces: se a VPN especificar que ambas estejam dentro da LAN remota, a resolução de nomes para a segunda interface não-VPN não funcionará.

    
por 17.09.2014 / 18:27