Vraag Is er een VPN Monitor / Kill Switch-applicatie voor Ubuntu?


Hallo, ik ben op zoek naar een VPN-monitor / Kill Switch-toepassing die ervoor zorgt dat mijn VPN-verbinding altijd is verbonden. Als mijn beveiligde verbinding wegvalt, zal de toepassing de toepassingen die worden bewaakt, laten vallen om gegevenslekken te voorkomen. Ik weet dat er dergelijke applicaties voor Windows zijn. Ik moet echter nog een geschikt alternatief vinden voor Linux.


9
2018-02-24 20:31


oorsprong




antwoorden:


Ik had dezelfde setup en "VPN kill-switches" zijn lastiger dan je zou denken.

Volgens uw specificaties, die luidt als "bepaalde apps doden wanneer de VPN valt", is er een eenvoudige oplossing.

Op Ubuntu heeft de netwerkmonitor callbacks voor netwerkgebeurtenissen, zodat u een script kunt schrijven om de gewenste apps te doden. Voorbeeld volgt:

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

#!/usr/bin/env ruby

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

Het maakt het uitvoerbaar: chmod 755 /etc/NetworkManager/dispatcher.d/50vpndownkillapps.rb, en geniet :-)

Dit script is in Ruby (dus het vereist robijn), maar het kan triviaal worden omgezet in een shellscript.

Het gaat er ook van uit dat de VPN-adapter dat is tun0, wat de standaard is voor OpenVPN-configuraties.


5
2017-10-01 11:13



Om een ​​onbekende reden, ARGV begon met 'tun0' voor een lange tijd, en plotseling veranderd in 'tun1' zonder kennisgeving. Dus om de kill-schakelaar te laten werken ondanks deze eerste (nutteloze) veranderende waarde, moest ik de test wijzigen naar if ARGV.last == 'vpn-down' - zezollo


Ik had dezelfde behoefte en ik heb mijn eigen oplossing ontwikkeld, omdat er op Linux geen speciale tool hiervoor lijkt te zijn. Het is niet nodig om geopende applicaties te laten vallen / sluiten! :)

U moet iptables firewall instellen, zodat uw machine ALLEEN verbinding kan maken met opgegeven VPN-servers (geen ander verkeer toegestaan, behalve lokaal, dus er zullen geen "lekken" zijn). Hier is een script voor (gevonden op het 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

U moet de tabel instellen servers=(). Specificeer daar uw IP-adressen van uw favoriete VPN-servers.

Controleer ook of andere variabelen aan het begin van het script correct zijn ingesteld, anders blokkeert het uw volledige verbinding.

Maak een back-up van iptables met:

sudo iptables-save > working.iptables.rules

(herstel met sudo iptables-restore < working.iptables.rules)

Het ondersteunt TCP- en UDP-verbindingen, als je er slechts één nodig hebt, verwijder dan de ongewenste twee regels for () lus. Controleer ook of uw provider dezelfde poorten gebruikt - kan anders zijn.

Voer dit script uit met f.e. sudo /home/user/vpn.sh.

Als je het bij het opstarten wilt laden (iptables worden gewoonlijk opnieuw ingesteld na opnieuw opstarten), voeg je toe aan je /etc/rc.local bestand f.e. lijn als bash /home/user/vpn.sh.


Het volgende onderdeel is VPN auto-connector & monitor. Hier is mijn eigen ding voor:

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

Het maakt automatisch verbinding bij het opstarten en bewaakt uw verbinding met een bepaald interval (amount=10 geeft 10 seconden interval) en opnieuw verbinding maken op verloren verbinding. Heb je een logfunctie en enkele andere opties.

Controleer de verbindingen van uw UUID's nmcli con show en voeg je favorieten (matching met IP's toegevoegd aan firewall) toe aan vpn=() tafel. Telkens zal het willekeurig een verbinding kiezen die in deze tabel is gespecificeerd.

Je kunt het toevoegen aan je auto-start (sudo priviledge is niet nodig). Hier is een voorbeeld hoe het in terminal te starten:

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

... en zo ziet het eruit in de terminal:

enter image description here

... en zo ziet een lekvrije ping eruit nadat uw VPN-verbinding is verwijderd:

enter image description here

Genieten :)


4
2017-12-28 09:58



Wat betreft het laden van het script bij het opstarten, waarom zou u het niet gewoon gebruiken? /etc/rc.local? - Andrea Lazzarotto
Mooi idee (werkt als charme!), Bedankt :) - GreggD
Dit is geweldig, heel erg bedankt. Geverifieerd om nog te werken vanaf juli 2017. - Norr


Ik heb een eenvoudige VPN-kill-schakelaar kunnen instellen met UFW. Het werkt met alle vpn's die ik heb.

Hier zijn mijn ufw-instellingen:

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

Werkt prima voor mij :)


2
2017-09-15 16:30



Ziet er goed uit, maar ik denk het wel sudo ufw allow out 443/tcp zorgt voor veilige website-lekkage wanneer de VPN niet is aangesloten. Zou je dat niet willen stoppen? Een HTTPS-site met AJAX of WebSockets kan zichzelf op de achtergrond opnieuw verbinden, misschien via een JavaScript-timer. - halfer


Ik loste dit probleem op door Ufw in te stellen om al het uitgaande verkeer te blokkeren en vervolgens alle VPN-knooppunten op de witte lijst te zetten door naar hun individuele IP-adressen te verwijzen. Dit is niet zo belastend als het klinkt: VPN's in mijn ervaring laten het gebruik van DNS-lookup toe om hun verschillende IP-adressen te krijgen.

Ik heb een PHP-programma geschreven om dit te doen, genaamd UFW-vpn. Ik heb het een paar jaar gebruikt, met verschillende kleine verbeteringen in de loop van de tijd. Je hebt natuurlijk PHP nodig, en Git als je het wilt klonen in plaats van het te downloaden.

Je kunt het ook pakken met wget:

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

Voer vervolgens de opdracht uit om te controleren of het er goed uitziet (zonder parameters wordt een syntaxisbericht weergegeven):

php ufw-vpn.php

Nu, ervan uitgaande dat uw VPN dit ondersteunt, kunt u een volledig gekwalificeerd domein gebruiken om een ​​lijst met servers voor een regio te krijgen (u zult dit moeten vinden in de documentatie van uw provider of misschien van hun supportafdeling):

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

Dat zou u een grote lijst van firewallregels moeten geven om toe te voegen. Om ze eenvoudig te installeren, kunt u dit gewoon doen:

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

Van tijd tot tijd updaten VPN-providers hun IP-adressen, dus u moet de uwe-adressen bijwerken om overeen te komen. U kunt dit doen via een diff:

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

Voor een diff is het de moeite waard om de regels te controleren voordat je die uitvoert, omdat hiermee alles dat niet bij de VPN hoort wordt verwijderd. Dus als u enkele aangepaste regels heeft, moeten deze worden verwijderd voordat ze worden uitgevoerd.

Meer documenten zijn beschikbaar op de repo en het is allemaal open source, dus u kunt de code controleren op beveiligingsproblemen. Foutrapporten en suggesties voor suggesties zijn zeer welkom.


0
2017-12-11 11:53