A solução é usar o iptables para negar todo o tráfego de saída, exceto quando o tráfego passa pelo túnel.
Se o túnel estiver quebrado, o acesso à Internet não será mais possível até que o túnel seja estabelecido novamente.
Suponho que você esteja usando o roteamento baseado em TUN para se conectar ao servidor OpenVPN e que esteja usando a opção de cliente OpenVPN do gateway de redirecionamento.
Crie um arquivo em qualquer lugar (por exemplo, /root/iptables.vpn), você precisa alterar [VPN_IP] e [VPN_PORT] com o ip: port da vpn servidor
*mangle
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
COMMIT
*nat
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
COMMIT
# Set a default DROP policy.
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT DROP [0:0]
# Allow basic INPUT traffic.
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p icmp --icmp-type 8 -m conntrack --ctstate NEW -j ACCEPT
# Allow basic OUTPUT traffic.
-A OUTPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A OUTPUT -o lo -j ACCEPT
-A OUTPUT -p icmp -j ACCEPT
# Allow traffic to the OpenVPN server and via the tunnel.
-A OUTPUT -o tun+ -j ACCEPT
-A OUTPUT -p udp -m udp -d [VPN_IP] --dport [VPN_PORT] -j ACCEPT
# Reject everything else.
-A INPUT -m conntrack --ctstate INVALID -j DROP
-A INPUT -j REJECT --reject-with icmp-port-unreachable
-A FORWARD -j REJECT --reject-with icmp-port-unreachable
-A OUTPUT -j REJECT --reject-with icmp-port-unreachable
COMMIT
Após a conexão com o servidor vpn ser estabelecida, você deve habilitar as regras:
iptables-restore < /root/iptables.vpn
Todo o tráfego agora será encaminhado pelo túnel.
EDITAR Como o autor escreve, ele executa a conexão usando uma abordagem semelhante à do gerenciador de rede, então o problema é que ele não conhece o ip remoto do servidor, pois ele é capturado de um pool. Eu acho (mas por enquanto não tenho tempo para testar esta solução) que uma abordagem pode ser:
- Modifique o arquivo criado anteriormente (em nosso exemplo /root/iptables.vpn), substituindo [VPN_IP] por $ route_vpn_gateway e [VPN_PORT] com $ remote_port
- Crie um script (por exemplo, /etc/openvpn/route.sh):
while read line do eval "echo ${line}" done < /root/iptables.vpn | /sbin/iptables-restore -v
( link )
- Modifique (e recarregue) seu arquivo .openvpn anexando:
script-security 2
/etc/openvpn/route.sh
( Como faço para executar um script? depois que o OpenVPN se conectou com sucesso? )
O script será executado toda vez que a conexão com a VPN for estabelecida.
Como mencionado, não testei isso ...
Lembre-se de descarregar seus iptables depois de fechar a conexão vpn