Esiste un'applicazione VPN Monitor / Kill Switch per Ubuntu?


10

Ciao, sto cercando un'applicazione VPN Monitor / Kill Switch che assicuri che la mia connessione VPN sia sempre connessa. Se la mia connessione protetta dovesse cadere, l'applicazione eliminerà le applicazioni che sta monitorando per evitare la perdita di dati. So che ci sono tali applicazioni per Windows. Tuttavia, devo ancora trovare un'alternativa adatta per Linux.

Risposte:


5

Avevo la stessa configurazione e "VPN kill switch" sono più complicati di quanto si possa pensare.

Seguendo le tue specifiche, che si legge come "uccidi determinate app quando cade la VPN", c'è una soluzione semplice.

Su Ubuntu, il monitor di rete ha richiamate per eventi di rete, in modo che tu possa scrivere uno script per uccidere le app che desideri. L'esempio segue:

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

#!/usr/bin/env ruby

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

Lo rendono eseguibile:, chmod 755 /etc/NetworkManager/dispatcher.d/50vpndownkillapps.rbe divertiti :-)

Questo script è in Ruby (quindi richiede ruby), ma può essere banalmente convertito in uno script di shell.

Presuppone anche che sia l'adattatore VPN tun0, che è lo standard per le configurazioni OpenVPN.


1
Per una ragione sconosciuta, ARGVè iniziato da 'tun0'molto tempo e all'improvviso è cambiato in 'tun1'senza preavviso. Quindi, per mantenere il kill switch funzionante nonostante questo primo (inutile) cambio di valore, ho dovuto cambiare il test inif ARGV.last == 'vpn-down'
zezollo

3

Avevo lo stesso bisogno e ho sviluppato la mia soluzione in quanto non sembra esserci uno strumento dedicato per questo su Linux. Non è necessario eliminare / chiudere le applicazioni aperte! :)

È necessario configurare il firewall iptables, in modo che la macchina possa connettersi SOLO a server VPN specificati (nessun altro traffico consentito, tranne locale, quindi non ci saranno "perdite"). Ecco uno script per quello (trovato sul 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

Sarà necessario impostare la tabella servers=(). Basta specificare lì gli IP dei tuoi server VPN preferiti.

Controlla anche che le altre variabili all'inizio dello script siano impostate correttamente, altrimenti bloccherà l'intera connessione.

Assicurati di fare il backup di iptables con:

sudo iptables-save > working.iptables.rules

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

Supporta connessioni TCP e UDP, se ne hai bisogno solo una, rimuovi dal for ()loop due linee indesiderate . Controlla anche se il tuo provider utilizza le stesse porte - potrebbe essere diverso.

Esegui questo script con fe sudo /home/user/vpn.sh.

Se vuoi caricarlo all'avvio (di solito iptables si reimposta dopo il riavvio), aggiungi al tuo /etc/rc.localfile la linea come bash /home/user/vpn.sh.


La parte successiva è il connettore automatico e il monitoraggio VPN. Ecco il mio aggeggio per questo:

#!/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

Si connetterà automaticamente all'avvio e monitorerà la tua connessione con un determinato intervallo ( amount=10dà un intervallo di 10 secondi) e riconnetterà in caso di perdita della connessione. Ha la funzione di registrazione e alcune altre opzioni.

Controlla le UUID delle tue connessioni utilizzando nmcli con showe aggiungi i tuoi preferiti (corrispondenti agli IP aggiunti al firewall) alla vpn=()tabella. Ogni volta selezionerà casualmente una connessione specificata in questa tabella.

Puoi aggiungerlo all'avvio automatico (non è necessario il privilegio sudo). Ecco un esempio su come avviarlo nel terminale:

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

... ed ecco come appare in esecuzione nel terminale:

inserisci qui la descrizione dell'immagine

... ed ecco come appare un ping a prova di perdite dopo la caduta della connessione VPN:

inserisci qui la descrizione dell'immagine

Godere :)


1
Per quanto riguarda il caricamento dello script all'avvio, perché non lo usi semplicemente /etc/rc.local?
Andrea Lazzarotto,

Bella idea (funziona come un incantesimo!), Grazie :)
GreggD,

È fantastico, grazie mille. Verificato che funzionerà ancora a partire da luglio 2017.
Norr

2

Sono stato in grado di configurare un semplice kill switch VPN con UFW. Funziona con tutti i VPN che ho.

Ecco le mie impostazioni 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

Funziona per me bene :)


Sembra OK, ma suppongo che sudo ufw allow out 443/tcppermetta una perdita sicura del sito Web quando la VPN non è connessa. Non vorresti fermarlo? Un sito HTTPS con AJAX o WebSocket potrebbe riconnettersi da solo in background, magari tramite un timer JavaScript.
Halfer

0

Ho risolto questo problema configurando Ufw per bloccare tutto il traffico in uscita e quindi autorizzando tutti i nodi VPN facendo riferimento ai loro singoli indirizzi IP. Questo non è così oneroso come sembra: le VPN nella mia esperienza consentono l'uso della ricerca DNS per ottenere i loro vari indirizzi IP.

Ho scritto un programma PHP per farlo, chiamato ufw-vpn . L'ho usato per un paio d'anni, con vari piccoli miglioramenti apportati nel tempo. Ovviamente avrai bisogno di PHP installato e di Git se desideri clonarlo anziché scaricarlo.

Puoi anche afferrarlo usando wget:

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

Quindi eseguire il comando per verificare che appaia OK (senza parametri viene visualizzato un messaggio di sintassi):

php ufw-vpn.php

Ora, supponendo che la tua VPN lo supporti, puoi utilizzare un dominio completo per ottenere un elenco di server per una regione (dovrai trovarlo nella documentazione del tuo provider, o forse dal loro dipartimento di supporto):

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

Questo dovrebbe darti un grande elenco di regole del firewall da aggiungere. Per installarli facilmente, puoi semplicemente fare questo:

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

Di tanto in tanto i provider VPN aggiorneranno i loro indirizzi IP, quindi dovrai aggiornare i tuoi per abbinarli. Puoi farlo tramite 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

Per un diff, vale la pena controllare le regole prima di eseguirlo, poiché eliminerà tutto ciò che non appartiene alla VPN. Pertanto, se si dispone di alcune regole personalizzate, dovranno essere eliminate prima dell'esecuzione.

Altri documenti sono disponibili nel repository, ed è tutto open source, quindi è possibile controllare il codice per problemi di sicurezza. Segnalazioni di bug e suggerimenti di funzionalità sono i benvenuti.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.