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.