Ao proteger um túnel VPN contra vazamentos, é melhor evitar os mecanismos que o cliente VPN tenta gerenciar. Na maioria dos casos, isso significa que você deve recorrer a iptables
ou nft
em vez de ip route
, já que o OpenVPN manipula o último de maneira variável.
O seguinte é um método anti-vazamento que pode bloquear todo o tráfego, exceto qualquer coisa destinada a dispositivos de túnel e o próprio link OpenVPN - independentemente de como as rotas são configuradas.
Primeiro, adicione um grupo especial para ser usado pelo cliente VPN (você pode escolher outro nome de grupo, se desejar, desde que ele não seja usado por outro usuário ou programa em seu sistema):
sudo groupadd -r -f tunnel
Em seguida, as regras de firewall que precisam ser executadas como root
em cada inicialização do sistema ou antes do início da VPN:
#!/bin/sh
iptables -F OUTPUT
iptables -P OUTPUT DROP
iptables -A OUTPUT -p all -m owner --gid-owner tunnel -j ACCEPT
iptables -A OUTPUT -o tun+ -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
Observe que o 'túnel' do ID do grupo é uma condição para o acesso à rede, pois está tendo um dispositivo de tunelamento 'tun +' como saída. Se sua configuração openvpn usa tap
devices, você pode especificar 'tap +' em vez de 'tun +'.
Por fim, você pode executar o cliente VPN com o ID do grupo especial:
sudo sg tunnel -c 'openvpn --config /etc/openvpn/gateway.conf --group tunnel'
O nome do grupo 'tunnel' é especificado duas vezes na linha de comando, porque devemos garantir que o ID do grupo para o processo openvpn seja definido durante sua inicialização inicial e após a conexão ser estabelecida. Se o openvpn estivesse sendo executado a partir de um serviço systemd em vez de uma linha de comando ou script, a designação Group=
seria usada em vez de sg
.
A técnica acima deve protegê-lo de vazamentos para clearnet em todos os momentos que as regras do iptables estão ativas, se o openvpn está em execução ou não. Isso abrange os dados e os pacotes DNS. E a política da cadeia OUTPUT pode ser usada como um interruptor para efetivamente ativar ou desativar as regras (usando DROP ou ACCEPT).