OpenVPN CLI para killswitch ou prevenção de fallback de conexão

6

Estou usando o OpenVPN via linha de comando para conectar-me à minha VPN na distribuição atual do Linux, já que não há GUI disponível (que tinha uma caixa de seleção killswitch).

O meu problema é que não consigo encontrar uma maneira de adicionar um killswitch ou evitar um fallback na minha conexão padrão quando a VPN se apaga.

Aqui está o comando que eu uso atualmente para se conectar:

openvpn --config /etc/openvpn/gateway.conf

Basicamente, eu quero encontrar um método simples para impedir minha VPN de retornar à conexão padrão se ela for desativada. Só quero que minha conexão esteja inativa até que a conexão VPN seja restaurada.

gateway.conf

client
dev tun
proto udp
remote us-california.privateinternetaccess.com 1194
resolv-retry infinite
nobind
persist-key
persist-tun
ca /etc/openvpn/ca.crt
tls-client
remote-cert-tls server
auth-user-pass /etc/openvpn/login.conf
comp-lzo
verb 1
reneg-sec 0
crl-verify /etc/openvpn/crl.pem


auth-nocache
script-security 2
up /etc/openvpn/update-resolv-conf.sh
down /etc/openvpn/update-resolv-conf.sh

Arquivos de origem: link

    
por Archery 13.03.2015 / 08:17

2 respostas

1

Você poderia fazer isso definindo regras de blackhole com métrica mais alta: para cada regra de roteamento, você deseja adicionar uma rota duplicada com prioridade mais baixa (métrica mais alta) que permanecerá no lugar quando o roteamento do OpenVPN estiver rasgado baixa. Esta rota adicional é uma rota blackhole , prohibit ou unreachable .

Você deve poder fazer isso com algo como:

#!/bin/sh
set -e
ip route replace blackhole "$ifconfig_local/$ifconfig_netmask"

i=1
while true; do
  route_network_i="$(eval echo \$route_network_$i)"
  route_netmask_i="$(eval echo \$route_netmask_$i)"
  route_metric_i="$(eval echo \$route_metric_$i)"
  if [ -z "$route_network_i" ]; then
    break
  fi
  ip route replace blackhole "$route_network_i"/"$route_netmask_i" metric $(( $route_metric_i + 1 ))
  i=$(( $i + 1 )
done
    
por 13.03.2015 / 09:55
0

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

    
por 30.07.2018 / 01:34