web-dev-qa-db-fra.com

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

Bonjour, je recherche une application VPN Monitor/Kill Switch qui garantisse que ma connexion VPN est toujours connectée. Si ma connexion sécurisée est abandonnée, l'application abandonnera 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 adaptée à Linux.

10
AsianXL

J'avais la même configuration, et les "switchs VPN" sont plus compliqués qu'on pourrait le penser.

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

Sur Ubuntu, le moniteur de réseau reçoit des rappels pour les événements réseau, ce qui vous permet d'écrire un script pour supprimer les applications souhaitées. Exemple suit:

Éditer /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.rb, et profitez-en :-)

Ce script est dans Ruby (il nécessite donc Ruby), mais il peut être converti de manière triviale en un script Shell.

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

5
Marcus

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

Vous devez configurer le pare-feu iptables afin que votre ordinateur puisse se connecter UNIQUEMENT à des serveurs VPN spécifiés (aucun autre trafic n'est autorisé, à l'exception du trafic 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 adresses 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 la connexion sera bloquée.

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 TCP et les connexions UDP. Si vous n’avez besoin que de l’une de ces connexions, supprimez les deux lignes indésirables de la boucle for (). Vérifiez également si votre fournisseur utilise les mêmes ports - peut être différent.

Exécutez ce script avec f.e. 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-le à votre fichier /etc/rc.local f.e. une ligne comme bash /home/user/vpn.sh.


La partie suivante est un connecteur automatique VPN et un moniteur. 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 connecte automatiquement au démarrage et surveille votre connexion avec un intervalle donné (amount=10 donne un intervalle de 10 secondes) et se reconnecte si la connexion est perdue. Vous avez la fonctionnalité de journalisation et quelques autres options.

Vérifiez vos UUID de connexion à l'aide de nmcli con show et ajoutez vos favoris (en faisant correspondre les adresses IP ajoutées au pare-feu) à la table vpn=(). À chaque fois, il sélectionnera de manière aléatoire une connexion spécifiée dans ce tableau.

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

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

... et voici à quoi ça ressemble en cours d'exécution dans le terminal:

enter image description here

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

enter image description here

Prendre plaisir :)

3
GreggD

J'ai été en mesure de configurer un kill switch VPN simple 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 pour moi très bien :)

2
Reeby

J'ai résolu ce problème en configurant Ufw pour bloquer tout le trafic sortant, puis en inscrivant tous les nœuds VPN en liste blanche en faisant référence à leurs adresses IP individuelles. Ce n’est pas aussi lourd que cela en a l'air: les VPN, selon mon expérience, autorisent l'utilisation de la recherche DNS pour obtenir leurs différentes adresses IP.

J'ai écrit un programme PHP pour le faire, appelé fw-vpn . Je l'utilise depuis quelques années, avec diverses améliorations mineures apportées au fil du temps. Bien entendu, vous aurez besoin de PHP et de Git si vous souhaitez le cloner plutôt que le télécharger.

Vous pouvez aussi le récupérer en utilisant wget:

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

Ensuite, lancez la commande pour vérifier que tout se passe bien (sans paramètres, il ne restitue qu'un message de syntaxe):

php ufw-vpn.php

Maintenant, en supposant que votre VPN le prenne en charge, vous pouvez utiliser un domaine entièrement 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 de support):

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 mettent à jour leurs adresses IP. Vous devrez donc mettre à jour les vôtres pour qu'ils 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, cela vaut la peine de vérifier les règles avant de l'exécuter, car cela effacera 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.

Un plus grand nombre de documents sont disponibles sur le référentiel et sont tous à code source ouvert. Vous pouvez donc vérifier le code pour identifier les problèmes de sécurité. Les rapports de bugs et les suggestions de fonctionnalités sont les bienvenus.

0
halfer