Existe-t-il une application VPN Monitor / Kill Switch pour Ubuntu?


10

Salut, je recherche une application VPN Monitor / Kill Switch qui garantira que ma connexion VPN est toujours connectée. Si ma connexion sécurisée tombe, l'application supprimera les applications qu'elle surveille pour éviter la fuite de données. Je sais qu'il existe de telles applications pour Windows. Cependant, je n'ai pas encore trouvé d'alternative appropriée pour Linux.

Réponses:


5

J'avais la même configuration, et les "VPN kill switches" sont plus délicats qu'on ne le pense.

Cependant, en suivant votre spécification, qui se lit comme "tuer certaines applications lorsque le VPN tombe", il existe une solution simple.

Sur Ubuntu, le moniteur réseau a des rappels pour les événements réseau, de sorte que vous pouvez écrire un script pour tuer les applications que vous souhaitez. Voici un exemple:

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

#!/usr/bin/env ruby

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

Le rendre exécutable:, chmod 755 /etc/NetworkManager/dispatcher.d/50vpndownkillapps.rbet profitez :-)

Ce script est en Ruby (il nécessite donc Ruby), mais il peut être converti trivialement en script shell.

Il suppose également que l'adaptateur VPN est tun0, ce qui est la norme pour les configurations OpenVPN.


1
Pour une raison inconnue, ARGVcela a commencé 'tun0'pendant longtemps et s'est soudainement transformé en 'tun1'sans préavis. Donc, pour que le kill switch fonctionne malgré cette première (inutile) modification de valeur, j'ai dû changer le test enif ARGV.last == 'vpn-down'
zezollo

3

J'avais ce même besoin et j'ai développé ma propre solution car il ne semble pas y avoir d'outil dédié pour cela sous Linux. Il n'est pas nécessaire de supprimer / fermer les applications ouvertes! :)

Vous devez configurer le pare-feu iptables, afin que votre machine puisse se connecter UNIQUEMENT aux serveurs VPN spécifiés (aucun autre trafic autorisé, sauf local, il n'y aura donc pas de "fuites"). Voici un script pour cela (trouvé sur le 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

Vous devrez configurer la table servers=(). Spécifiez simplement les IP de vos serveurs VPN préférés.

Vérifiez également que les autres variables au début du script sont correctement définies, sinon cela bloquera toute votre connexion.

Assurez-vous de faire une sauvegarde iptables avec:

sudo iptables-save > working.iptables.rules

(restaurer avec sudo iptables-restore < working.iptables.rules)

Il prend en charge les connexions TCP et UDP, si vous n'en avez besoin que d'une, supprimez deux lignes indésirables de la for ()boucle. Vérifiez également si votre fournisseur utilise les mêmes ports - peut être différent.

Exécutez ce script avec fe sudo /home/user/vpn.sh.

Si vous voulez le charger au démarrage (iptables se réinitialise généralement après le redémarrage), ajoutez à votre /etc/rc.localfichier fe comme bash /home/user/vpn.sh.


La partie suivante est le connecteur automatique et le moniteur VPN. Voici mon propre engin pour cela:

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

Il se connectera automatiquement au démarrage et surveillera votre connexion avec un intervalle donné ( amount=10donne un intervalle de 10 secondes) et se reconnectera en cas de perte de connexion. Vous avez une fonction de journalisation et quelques autres options.

Vérifiez vos connexions UUID en utilisant nmcli con showet ajoutez vos favoris (correspondant aux IP ajoutées au pare-feu) au vpn=()tableau. Chaque fois, il sélectionnera au hasard une connexion spécifiée dans ce tableau.

Vous pouvez l'ajouter à votre démarrage automatique (n'a pas besoin du privilège sudo). Voici un exemple comment le démarrer dans le terminal:

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

... et voici à quoi cela ressemble dans le terminal:

entrez la description de l'image ici

... et voici à quoi ressemble un ping étanche après la coupure de votre connexion VPN:

entrez la description de l'image ici

Prendre plaisir :)


1
Concernant le chargement du script au démarrage, pourquoi ne pas simplement utiliser /etc/rc.local?
Andrea Lazzarotto

Belle idée (fonctionne comme du charme!), Merci :)
GreggD

C'est génial, merci beaucoup. Vérifié pour continuer à travailler en juillet 2017.
Norr

2

J'ai pu configurer un simple kill switch VPN avec UFW. Cela fonctionne avec tous les VPN que j'ai.

Voici mes paramètres 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

Fonctionne très bien pour moi :)


Cela semble OK, mais je suppose que cela sudo ufw allow out 443/tcppermet une fuite de site Web sécurisée lorsque le VPN n'est pas connecté. Ne voudriez-vous pas arrêter cela? Un site HTTPS avec AJAX ou WebSockets peut se reconnecter en arrière-plan seul, peut-être via une minuterie JavaScript.
halfer

0

J'ai résolu ce problème en configurant Ufw pour bloquer tout le trafic sortant, puis en mettant en liste blanche tous les nœuds VPN en référençant leurs adresses IP individuelles. Ce n'est pas aussi onéreux que cela puisse paraître: les VPN, selon mon expérience, permettent d'utiliser la recherche DNS pour obtenir leurs différentes adresses IP.

J'ai écrit un programme PHP pour ce faire, appelé ufw-vpn . Je l'utilise depuis quelques années, avec diverses petites améliorations apportées au fil du temps. Vous aurez besoin de PHP installé bien sûr, et de Git si vous souhaitez le cloner plutôt que le télécharger.

Vous pouvez également le saisir à l'aide de wget:

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

Ensuite, exécutez la commande pour vérifier qu'elle semble correcte (sans paramètres, elle affiche simplement un message de syntaxe):

php ufw-vpn.php

Maintenant, en supposant que votre VPN le prend en charge, vous pouvez utiliser un domaine pleinement qualifié pour obtenir une liste de serveurs pour une région (vous devrez le trouver dans la documentation de votre fournisseur, ou peut-être auprès de son service d'assistance):

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

Cela devrait vous donner une grande liste de règles de pare-feu à ajouter. Pour les installer facilement, vous pouvez simplement faire ceci:

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

De temps en temps, les fournisseurs de VPN mettront à jour leurs adresses IP, vous devrez donc mettre à jour les vôtres pour qu'elles correspondent. Vous pouvez le faire via 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

Pour un diff, il vaut la peine de vérifier les règles avant de l'exécuter, car cela supprimera tout ce qui n'appartient pas au VPN. Donc, si vous avez des règles personnalisées, elles devront être supprimées avant d'être exécutées.

Plus de documents sont disponibles au référentiel, et tout est open source, vous pouvez donc vérifier le code pour les problèmes de sécurité. Les rapports de bogues et les suggestions de fonctionnalités sont les bienvenus.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.