Gibt es eine VPN Monitor / Kill Switch-Anwendung für Ubuntu?


10

Hallo, ich suche eine VPN Monitor / Kill Switch-Anwendung, die sicherstellt, dass meine VPN-Verbindung immer verbunden ist. Sollte meine gesicherte Verbindung unterbrochen werden, löscht die Anwendung die von ihr überwachten Anwendungen, um Datenlecks zu vermeiden. Ich weiß, dass es solche Anwendungen für Windows gibt. Ich habe jedoch noch keine geeignete Alternative für Linux gefunden.

Antworten:


5

Ich hatte das gleiche Setup und "VPN Kill Switches" sind schwieriger als man denkt.

Nach Ihrer Spezifikation, die lautet "Bestimmte Apps beenden, wenn das VPN ausfällt", gibt es eine einfache Lösung.

Unter Ubuntu verfügt der Netzwerkmonitor über Rückrufe für Netzwerkereignisse, sodass Sie ein Skript schreiben können, um die gewünschten Apps zu beenden. Beispiel folgt:

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

#!/usr/bin/env ruby

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

Die machen es ausführbar: chmod 755 /etc/NetworkManager/dispatcher.d/50vpndownkillapps.rbund genießen :-)

Dieses Skript befindet sich in Ruby (daher ist Ruby erforderlich), kann jedoch trivial in ein Shell-Skript konvertiert werden.

Es wird auch davon ausgegangen, dass der VPN-Adapter tun0der Standard für OpenVPN-Konfigurationen ist.


1
Aus einem unbekannten Grund ARGVbegann mit 'tun0'für eine lange Zeit und wechselte plötzlich zu 'tun1'ohne Vorankündigung. if ARGV.last == 'vpn-down'
Um

3

Ich hatte das gleiche Bedürfnis und entwickelte meine eigene Lösung, da es unter Linux anscheinend kein spezielles Tool dafür gibt. Geöffnete Anwendungen müssen nicht gelöscht / geschlossen werden! :) :)

Sie müssen die iptables-Firewall einrichten, damit Ihr Computer NUR eine Verbindung zu bestimmten VPN-Servern herstellen kann (außer lokalem Datenverkehr ist kein anderer Datenverkehr zulässig, sodass keine "Lecks" auftreten). Hier ist ein Skript dafür (im Web gefunden):

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

Sie müssen die Tabelle einrichten servers=(). Geben Sie einfach die IP-Adressen Ihrer bevorzugten VPN-Server an.

Überprüfen Sie auch, ob andere Variablen am Anfang des Skripts richtig eingestellt sind, da sonst Ihre gesamte Verbindung blockiert wird.

Stellen Sie sicher, dass iptables gesichert wird mit:

sudo iptables-save > working.iptables.rules

(wiederherstellen mit sudo iptables-restore < working.iptables.rules)

Es unterstützt TCP- und UDP-Verbindungen. Wenn Sie nur eine dieser Verbindungen benötigen, entfernen Sie unerwünschte zwei Leitungen aus der for ()Schleife. Überprüfen Sie auch, ob Ihr Provider dieselben Ports verwendet - möglicherweise unterschiedlich.

Führen Sie dieses Skript mit z sudo /home/user/vpn.sh.

Wenn Sie es beim Booten laden möchten (iptables wird normalerweise nach dem Neustart zurückgesetzt), fügen Sie Ihrer /etc/rc.localDatei zB Zeile wie hinzu bash /home/user/vpn.sh.


Der nächste Teil ist VPN Auto-Connector & Monitor. Hier ist meine eigene Erfindung dafür:

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

Es stellt beim Start eine automatische Verbindung her und überwacht Ihre Verbindung mit einem bestimmten Intervall ( amount=10gibt ein Intervall von 10 Sekunden an) und stellt bei einem Verbindungsverlust wieder eine Verbindung her. Ich habe eine Protokollierungsfunktion und einige andere Optionen.

Überprüfen Sie die Verwendung Ihrer Verbindungs-UUIDs nmcli con showund fügen Sie Ihre Favoriten (die mit den der Firewall hinzugefügten IP-Adressen übereinstimmen) zur vpn=()Tabelle hinzu. Jedes Mal wird zufällig eine in dieser Tabelle angegebene Verbindung ausgewählt.

Sie können es zu Ihrem Autostart hinzufügen (benötigt kein Sudo-Privileg). Hier ist ein Beispiel, wie man es im Terminal startet:

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

... und so sieht es im Terminal aus:

Geben Sie hier die Bildbeschreibung ein

... und so sieht ein auslaufsicherer Ping aus, nachdem Ihre VPN-Verbindung unterbrochen wurde:

Geben Sie hier die Bildbeschreibung ein

Genießen :)


1
Warum verwenden Sie das Laden des Skripts beim Booten nicht einfach /etc/rc.local?
Andrea Lazzarotto

Schöne Idee (funktioniert wie Charme!), Danke :)
GreggD

Das ist großartig, vielen Dank. Verifiziert, um ab Juli 2017 noch zu arbeiten.
Norr

2

Ich konnte mit UFW einen einfachen VPN-Kill-Switch einrichten. Es funktioniert mit allen VPNs, die ich habe.

Hier sind meine UFW-Einstellungen:

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

Funktioniert bei mir ganz gut :)


Sieht in Ordnung aus, sudo ufw allow out 443/tcperlaubt aber sicheres Durchsickern der Website, wenn das VPN nicht verbunden ist. Möchtest du das nicht aufhalten? Eine HTTPS-Site mit AJAX oder WebSockets stellt möglicherweise selbst eine Verbindung im Hintergrund her, möglicherweise über einen JavaScript-Timer.
Halfer

0

Ich habe dieses Problem gelöst, indem ich Ufw so eingerichtet habe, dass der gesamte ausgehende Datenverkehr blockiert wird, und dann alle VPN-Knoten auf die Whitelist gesetzt habe, indem ich auf ihre individuellen IP-Adressen verwiesen habe. Dies ist nicht so lästig, wie es sich anhört: VPNs ermöglichen meiner Erfahrung nach die Verwendung der DNS-Suche, um ihre verschiedenen IP-Adressen abzurufen.

Ich habe dazu ein PHP-Programm namens ufw-vpn geschrieben . Ich habe es für ein paar Jahre benutzt, mit verschiedenen kleinen Verbesserungen im Laufe der Zeit. Sie müssen natürlich PHP und Git installiert haben, wenn Sie es klonen möchten, anstatt es herunterzuladen.

Sie können es auch mit wget abrufen:

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

Führen Sie dann den Befehl aus, um zu überprüfen, ob er in Ordnung ist (ohne Parameter wird nur eine Syntaxnachricht gerendert):

php ufw-vpn.php

Vorausgesetzt, Ihr VPN unterstützt dies, können Sie eine vollqualifizierte Domäne verwenden, um eine Liste der Server für eine Region abzurufen (diese finden Sie in der Dokumentation Ihres Anbieters oder möglicherweise in der Supportabteilung):

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

Das sollte Ihnen eine große Liste von Firewall-Regeln geben, die Sie hinzufügen müssen. Um sie einfach zu installieren, können Sie einfach Folgendes tun:

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

Von Zeit zu Zeit aktualisieren VPN-Anbieter ihre IP-Adressen, daher müssen Sie Ihre IP-Adressen entsprechend aktualisieren. Sie können dies über ein Diff tun:

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

Für einen Unterschied lohnt es sich, die Regeln zu überprüfen, bevor Sie dies ausführen, da dadurch alles gelöscht wird, was nicht zum VPN gehört. Wenn Sie also benutzerdefinierte Regeln haben, müssen diese vor dem Ausführen entfernt werden.

Weitere Dokumente sind im Repo verfügbar, und alles ist Open Source, sodass Sie den Code auf Sicherheitsprobleme überprüfen können. Fehlerberichte und Funktionsvorschläge sind sehr willkommen.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.