Page cover

Contornando VPN local

Às vezes, você precisa executar uma aplicação usando a internet do seu provedor local, de modo que ela não seja afetada pelas rotas de um cliente de VPN. Em casos assim, o que fazer?

Usar um outro computador? Subir uma máquina virtual? Desconectar da VPN, acessar o que quer acessar e conectar novamente na VPN?

Nesta documentação vamos ver como executar aplicações por fora da VPN usando network e mount namespace, regra de roteamento (ip rule) e SNAT. A aplicação, neste caso, será o navegador Google Chrome.

Crie o namespace de rede chamado "navegador":

sudo ip netns add navegador

Crie um par de interfaces de rede do tipo "veth" e vincule a veth1 ao namespace "navegador":

sudo ip link add veth0 type veth peer name veth1
sudo ip link set veth1 netns navegador

Atribue endereços IP as interfaces veth, habilite roteamento e ajuste as rotas e SNAT:

sudo ip addr add 10.0.0.1/24 dev veth0
sudo ip link set veth0 up
sudo ip netns exec navegador ip addr add 10.0.0.2/24 dev veth1
sudo ip netns exec navegador ip link set veth1 up
sudo ip netns exec navegador ip route add default via 10.0.0.1
sudo sysctl -w net.ipv4.ip_forward=1
sudo iptables -t nat -A POSTROUTING -s 10.0.0.0/24 -j MASQUERADE

Crie uma tabela de roteamento chamada "bypassvpn" e insira a rota default da rede local (wlp0s20f3 é a minha interface de rede):

sudo bash -c 'echo -e "252\tbypassvpn" >> /etc/iproute2/rt_tables'
sudo ip route add default via 192.168.0.1 dev wlp0s20f3 proto dhcp metric 600 table bypassvpn
sudo ip rule add from 10.0.0.0/24 table bypassvpn

Execute o bash no namespace de rede "navegador", em seguida execute um novo bash com o namespace de mount ativo, e sobrescreva a configuração de DNS (caso esteja usando um DNS interno da infra da VPN):

sudo ip netns exec navegador bash
unshare --mount /bin/bash
echo -e "nameserver 8.8.8.8" > ./resolv.conf
mount --bind resolv.conf /etc/resolv.conf
mount -t cgroup2 cgroup2 /sys/fs/cgroup
mount -t securityfs securityfs /sys/kernel/security/

E execute o navegador neste novo ambiente:

export PULSE_SERVER=unix:/run/user/1001/pulse/native
runuser -u vitalino google-chrome

Com isso, é esperado que o Google Chrome navegue na internet usando o IP público do seu provedor local e outro navegador (como o Firefox) use o IP público do seu provedor de VPN.

Last updated