Desabilite o acesso à internet somente se for acessado via VPN no Ubuntu 17

2

Existe uma maneira de impedir que meu sistema use a Internet normal e restrinja-a a usar uma VPN apenas no Ubuntu 17? FYI, eu já configuro o protonvpn através dos arquivos .ovpn e atualmente apenas conecto a ele ativando-o com a lista suspensa no menu.

Eu quero forçar todas as conexões a usar somente VPN, e se a VPN não estiver acessível, ela deve impedir todos os tipos de conexões com a Internet.

Eu sei que tem algo a ver com a configuração das rotas na seção IPv4, mas não sei ao certo.

    
por Patoshi パトシ 05.03.2018 / 16:25

3 respostas

5

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:

  1. Modifique o arquivo criado anteriormente (em nosso exemplo /root/iptables.vpn), substituindo [VPN_IP] por $ route_vpn_gateway e [VPN_PORT] com $ remote_port
  2. 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 )

  1. 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

    
por LilloX 12.03.2018 / 12:03
1

Muitas maneiras, mas isso depende de qual software VPN específico você está usando.

Você pode impedir que o sistema acesse a rede quando não estiver na VPN editando a configuração da interface, em /etc/network/interfaces ou (mais provavelmente, se você estiver usando um sistema de desktop) pelo NetworkManager. Abra o NM, selecione "configurar redes" ou algo assim e edite as opções de como cada interface obtém seu endereço para ter rotas estáticas que não incluem uma rota padrão (ou adicionar uma rota padrão para blackhole). Em seguida, configure sua VPN para fornecer uma rota padrão por meio dela quando aparecer.

Sem mais detalhes sobre sua configuração, isso é o máximo que posso dizer.

    
por JayEye 05.03.2018 / 18:17
0

Sim. Use ufw .

Quando você se conecta à VPN, ele cria um dispositivo virtual. Supondo que o seu nome de ethernet é enp3s0 e seu servidor VPN escuta a porta 1194, use esses comandos.

# Default policies
 ufw default deny incoming
 ufw default deny outgoing

 # Openvpn interface (adjust interface accordingly to your configuration)
 ufw allow in on tun0
 ufw allow out on tun0

 # Local Network (adjust ip accordingly to your configuration)
 ufw allow in on enp3s0 from 192.168.1.0/24
 ufw allow out on enp3s0 to 192.168.1.0/24

 # Openvpn (adjust port accordingly to your configuration)
 ufw allow in on enp3s0 from any port 1194
 ufw allow out on enp3s0 to any port 1194

Se você conectar servidor por nome, não por endereço IP, é necessário permitir o vazamento de DNS fora da VPN. Adicione os commamds:

 # DNS
 ufw allow in from any to any port 53
 ufw allow out from any to any port 53

Em seguida, use ufw enable para ativar essas regras. ufw disable se algo der errado ou se você quiser acesso direto.

Cortesia de ArchWiki.

    
por Barafu Albino 15.03.2018 / 13:39