¿Existe una aplicación VPN Monitor / Kill Switch para Ubuntu?

10

Hola, estoy buscando una aplicación VPN Monitor / Kill Switch que garantice que mi conexión VPN esté siempre conectada. En caso de que mi conexión segura se caiga, la aplicación eliminará las aplicaciones que está monitoreando para evitar la fuga de datos. Sé que existen tales aplicaciones para Windows. Sin embargo, todavía tengo que encontrar una alternativa adecuada para Linux.

AsianXL
fuente

Respuestas:

5

Tenía la misma configuración, y los "interruptores de eliminación de VPN" son más complicados de lo que uno pensaría.

Sin embargo, siguiendo su especificación, que se lee como "matar ciertas aplicaciones cuando cae la VPN", hay una solución simple.

En Ubuntu, el monitor de red tiene devoluciones de llamada para eventos de red, por lo que puede escribir un script para eliminar las aplicaciones que desee. El siguiente ejemplo:

Editar /etc/NetworkManager/dispatcher.d/50vpndownkillapps.rb:

#!/usr/bin/env ruby

if ARGV == [ 'tun0', 'vpn-down' ]
  `pkill -f transmission`
  `pkill -f deluge`
end

Lo hacen ejecutable: chmod 755 /etc/NetworkManager/dispatcher.d/50vpndownkillapps.rby disfrutan :-)

Este script está en Ruby (por lo que requiere ruby), pero se puede convertir trivialmente en un script de shell.

También supone que el adaptador VPN es tun0, que es el estándar para las configuraciones de OpenVPN.

Marcus
fuente
1
Por una razón desconocida, ARGVcomencé 'tun0'durante mucho tiempo y de repente cambió a 'tun1'sin previo aviso. Entonces, para mantener el interruptor de matar funcionando a pesar de este primer valor de cambio (inútil), tuve que cambiar la prueba aif ARGV.last == 'vpn-down'
zezollo
3

Tenía esta misma necesidad y desarrollé mi propia solución, ya que parece que no hay una herramienta dedicada para esto en Linux. ¡No hay necesidad de soltar / cerrar aplicaciones abiertas! :)

Debe configurar el firewall de iptables, para que su máquina pueda conectarse SOLAMENTE a servidores VPN especificados (no se permite otro tráfico, excepto el local, por lo que no habrá "fugas"). Aquí hay un script para eso (lo encontré en la web):

#!/bin/bash

# iptables setup on a local pc
# dropping all traffic not going trough vpn
# allowes traffic in local area network
# special rules for UPNP and Multicast discovery

FW="/sbin/iptables"
LCL="192.168.1.0/24"
VPN="10.0.0.0/12"
local_interface="eno1"
virtual_interface="tun0"

# VPN Servers
servers=(
123.123.123.123
124.124.124.124
)

#---------------------------------------------------------------
# Remove old rules and tables
#---------------------------------------------------------------
echo "Deleting old iptables rules..."
iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X
iptables -t mangle -F
iptables -t mangle -X

echo "Setting up new rules..."

#---------------------------------------------------------------
# Default Policy - Drop anything!
#---------------------------------------------------------------
$FW -P INPUT DROP
$FW -P FORWARD DROP
$FW -P OUTPUT DROP

#---------------------------------------------------------------
# Allow all local connections via loopback.
#---------------------------------------------------------------
$FW -A INPUT  -i lo  -j ACCEPT
$FW -A OUTPUT -o lo  -j ACCEPT

#---------------------------------------------------------------
# Allow Multicast for local network.
#---------------------------------------------------------------
$FW -A INPUT  -j ACCEPT -p igmp -s $LCL -d 224.0.0.0/4 -i $local_interface
$FW -A OUTPUT -j ACCEPT -p igmp -s $LCL -d 224.0.0.0/4 -o $local_interface

#---------------------------------------------------------------
# UPnP uses IGMP multicast to find media servers.
# Accept IGMP broadcast packets.
# Send SSDP Packets.
#---------------------------------------------------------------
$FW -A INPUT  -j ACCEPT -p igmp -s $LCL -d 239.0.0.0/8  -i $local_interface
$FW -A OUTPUT -j ACCEPT -p udp  -s $LCL -d 239.255.255.250 --dport 1900  -o $local_interface

#---------------------------------------------------------------
# Allow all bidirectional traffic from your firewall to the
# local area network
#---------------------------------------------------------------
$FW -A INPUT  -j ACCEPT -s $LCL -i $local_interface
$FW -A OUTPUT -j ACCEPT -d $LCL -o $local_interface

#---------------------------------------------------------------
# Allow all bidirectional traffic from your firewall to the
# virtual privat network
#---------------------------------------------------------------

$FW -A INPUT  -j ACCEPT -i $virtual_interface
$FW -A OUTPUT -j ACCEPT -o $virtual_interface

#---------------------------------------------------------------
# Connection to VPN servers (UDP 443)
#---------------------------------------------------------------
server_count=${#servers[@]}
for (( c = 0; c < $server_count; c++ ))
do
    $FW -A INPUT  -j ACCEPT -p udp -s ${servers[c]} --sport 1194 -i $local_interface
    $FW -A OUTPUT -j ACCEPT -p udp -d ${servers[c]} --dport 1194 -o $local_interface
    $FW -A INPUT  -j ACCEPT -p tcp -s ${servers[c]} --sport 443 -i $local_interface
    $FW -A OUTPUT -j ACCEPT -p tcp -d ${servers[c]} --dport 443 -o $local_interface
done

#---------------------------------------------------------------
# Log all dropped packages, debug only.
# View in /var/log/syslog or /var/log/messages
#---------------------------------------------------------------
#iptables -N logging
#iptables -A INPUT -j logging
#iptables -A OUTPUT -j logging
#iptables -A logging -m limit --limit 2/min -j LOG --log-prefix "IPTables general: " --log-level 7
#iptables -A logging -j DROP


# Disable internet for "no-internet" user
#iptables -A OUTPUT -m owner --gid-owner no-internet -j DROP

Necesitará configurar la tabla servers=(). Simplemente especifique las direcciones IP de sus servidores VPN favoritos.

También verifique que otras variables al comienzo del script estén configuradas correctamente, de lo contrario, bloqueará toda su conexión.

Asegúrese de hacer una copia de seguridad de iptables con:

sudo iptables-save > working.iptables.rules

(restaurar con sudo iptables-restore < working.iptables.rules)

Admite conexiones TCP y UDP, si solo necesita una de ellas, elimine dos líneas no deseadas del for ()bucle. También verifique si su proveedor está utilizando los mismos puertos; puede ser diferente.

Ejecute este script con fe sudo /home/user/vpn.sh.

Si desea cargarlo en el arranque (iptables generalmente se restablece después del reinicio), agregue a su /etc/rc.locallínea de archivo como bash /home/user/vpn.sh.


La siguiente parte es el conector y VPN de VPN. Aquí está mi propio artilugio para esto:

#!/bin/bash

# CONNECTIONS
# Those values can be checked by running `nmcli con show`

vpn=(
85e60352-9e93-4be4-8b80-f6aae28d3c94
)

# NUMBER OF CONNECTIONS
total=${#vpn[@]}

# SLEEP
amount=10 # number of seconds to wait after each connection checking cycle
countdown=true # enable/disable animated countdown
skip=1 # how many seconds to substract between each animated countdown iteration

# LOGS
dir='/home/user/logs-vpn' # directory for storing logs
name='vpn' # prefix/name for a log file
seperate=true # create a seperate log file for each init session or log to single file
init=false # log init event (with logging setup)
start=false # log vpn start event
yes=false # log connected events
no=false # log disconnected events

# STYLE
clean='\e[1A\033[K' # clean & move to previous line
default='\e[0m' # default
blink='\e[5m' # blinking (works only in couple terminals, e.g. XTerm or tty)
dim='\e[2m' # dim/half-bright
disconnected='\e[91m' # light red
connected='\e[92m' # light green
count='\e[94m' # light blue
reconnecting='\e[96m' # light cyan
initializing='\e[93m' # light yellow
connection='\e[1m\e[91m' # bold light red

# SETUP
time=$(date +"%Y-%m-%d_%H-%M-%S")
if $separate; then
    file="$dir/$time.log"
else
    file="$dir/$name.log"
fi

# RESET
reset # reset screen
tput civis -- invisible # disable cursor

# RE-TIME
time=$(date +"%Y.%m.%d %H:%M:%S")

# INITIALIZATION
if $init; then
    printf "$time INIT" >> $file
    if $yes; then
        printf " -y" >> $file
    fi
    if $no; then
        printf " -n" >> $file
    fi
    printf "\n" >> $file
fi

# START CONNECTION
con=$(nmcli con show --active | grep "  vpn")
if [[ $con == '' ]]; then

    if $start; then
        printf "$time START\n" >> $file
    fi

    time=$(date +"%H:%M:%S")
    echo -e "${dim}[$time]${default} ${initializing}INITIALIZING...${default}"
    echo ""
    echo ""

    random=$(((RANDOM % $total)-1))
    try=${vpn[$random]}

    (sleep 1s && nmcli con up uuid $try) >& /dev/null
    sleep 10s
fi

# LOOP
while [ "true" ]; do
        time=$(date +"%H:%M:%S")

        # CLEAN AFTER COUNTDOWN
        if $countdown; then
            echo -en $clean
            echo -en $clean
        fi

        # CHECK CONNECTION
        con=$(nmcli con show --active | grep "  vpn" | cut -f1 -d " ")

        if [[ $con == '' ]]; then
                if $no; then
                    printf "$time NO\n" >> $file
                fi
                echo -e "${dim}[$time]${default} ${disconnected}DISCONNECTED !!${default}"
                echo -e "${blink}${reconnecting}re-connecting ...${default}"

                random=$(((RANDOM % $total)-1))
                try=${vpn[$random]}

                (sleep 1s && nmcli con up uuid $try) >& /dev/null
        else
                if $yes; then
                    printf "$time YES\n" >> $file
                fi

                arr=(${con//./ })

                echo -en $clean
                echo -e "${dim}[$time]${default} ${connected}CONNECTED${default} (${connection}${arr[0]^^}${default})"
        fi

        # SLEEP
        if $countdown; then
            echo -e "${count}$amount${default}"
            for (( c=$amount; c>=1; c=c-$skip )); do
                echo -en $clean
                echo -e "${count}$c${default}"
                sleep $skip
            done
            echo -e "${count}0${default}"
        else
            sleep $amount
        fi
done

Se conectará automáticamente al inicio y monitoreará su conexión con un intervalo determinado ( amount=10da un intervalo de 10 segundos) y se volverá a conectar cuando se pierda la conexión. Tiene la función de registro y algunas otras opciones.

Verifique las conexiones que usan los UUID nmcli con showy agregue sus favoritos (que coincidan con las IP agregadas al firewall) a la vpn=()tabla. Cada vez seleccionará aleatoriamente una conexión especificada en esta tabla.

Puede agregarlo a su inicio automático (no necesita privilegio sudo). Aquí hay un ejemplo de cómo iniciarlo en la terminal:

mate-terminal --command="/home/user/vpn-reconnect.sh"

... y así es como se ve corriendo en la terminal:

ingrese la descripción de la imagen aquí

... y así es como se ve un ping a prueba de fugas después de que su conexión VPN caiga:

ingrese la descripción de la imagen aquí

Disfruta :)

GreggD
fuente
1
Con respecto a cargar el script en el arranque, ¿por qué no lo usarás simplemente /etc/rc.local?
Andrea Lazzarotto
Hermosa idea (funciona como un encanto!), Gracias :)
GreggD
Esto es increíble, muchas gracias. Verificado para seguir funcionando a partir de julio de 2017.
Norr
2

He podido configurar un simple interruptor de eliminación de VPN con UFW. Funciona con todos los VPN que tengo.

Aquí está mi configuración de ufw:

sudo ufw default deny outgoing
sudo ufw default deny incoming`
sudo ufw allow out 443/tcp
sudo ufw allow out 1194/udp
sudo ufw allow out on tun0 from any to any port 80
sudo ufw allow out on tun0 from any to any port 53
sudo ufw allow out on tun0 from any to any port 67
sudo ufw allow out on tun0 from any to any port 68

Funciona para mí bien :)

Reeby
fuente
Parece estar bien, pero supongo que sudo ufw allow out 443/tcppermite una fuga segura del sitio web cuando la VPN no está conectada. ¿No quieres detener eso? Un sitio HTTPS con AJAX o WebSockets puede volver a conectarse por sí solo en segundo plano, tal vez a través de un temporizador de JavaScript.
halfer
0

Resolví este problema configurando Ufw para bloquear todo el tráfico saliente y luego colocando en la lista blanca todos los nodos VPN haciendo referencia a sus direcciones IP individuales. Esto no es tan oneroso como parece: en mi experiencia, las VPN permiten el uso de la búsqueda de DNS para obtener sus diversas direcciones IP.

He escrito un programa PHP para hacer esto, llamado ufw-vpn . Lo he usado durante un par de años, con varias pequeñas mejoras realizadas con el tiempo. Necesitará PHP instalado, por supuesto, y Git si desea clonarlo en lugar de descargarlo.

También puedes tomarlo usando wget:

cd /path/to/a/folder
wget https://github.com/halfer/ufw-vpn/archive/master.zip
unzip master.zip
cd ufw-vpn-master

Luego ejecute el comando para verificar que se ve bien (sin parámetros solo muestra un mensaje de sintaxis):

php ufw-vpn.php

Ahora, suponiendo que su VPN lo admita, puede usar un dominio totalmente calificado para obtener una lista de servidores para una región (necesitará encontrar esto en la documentación de su proveedor, o tal vez de su departamento de soporte):

php ufw-vpn.php earth.all.vpn.example.org add

Eso debería darle una gran lista de reglas de firewall para agregar. Para instalarlos fácilmente, puede hacer esto:

php ufw-vpn.php earth.all.vpn.example.org add > add-rules.sh
chmod u+x add-rules.sh && sudo add-rules.sh

De vez en cuando, los proveedores de VPN actualizarán sus direcciones IP, por lo que deberá actualizar las suyas para que coincidan. Puede hacerlo a través de un diff:

php ufw-vpn.php earth.all.vpn.example.org diff > diff-rules.sh
chmod u+x diff-rules.sh && sudo diff-rules.sh

Para una diferencia, vale la pena verificar las reglas antes de ejecutar eso, ya que eliminará todo lo que no pertenezca a la VPN. Por lo tanto, si tiene algunas reglas personalizadas, deberá eliminarlas antes de ejecutarlas.

Hay más documentos disponibles en el repositorio, y todo es de código abierto, por lo que puede consultar el código por problemas de seguridad. Informes de errores y sugerencias de características son bienvenidos.

halfer
fuente