Czy jest dostępna aplikacja VPN Monitor / Kill Switch dla Ubuntu?

10

Cześć Szukam aplikacji VPN Monitor / Kill Switch, która zapewni, że moje połączenie VPN będzie zawsze połączone. Jeśli moje bezpieczne połączenie zostanie przerwane, aplikacja usunie monitorowane aplikacje, aby zapobiec wyciekom danych. Wiem, że istnieją takie aplikacje dla systemu Windows. Muszę jednak znaleźć odpowiednią alternatywę dla systemu Linux.

AsianXL
źródło

Odpowiedzi:

5

Miałem taką samą konfigurację, a „przełączniki zabijania VPN” są trudniejsze, niż mogłoby się wydawać.

Jednak zgodnie ze specyfikacją, która brzmi „zabijanie niektórych aplikacji, gdy spadnie VPN”, istnieje proste rozwiązanie.

W systemie Ubuntu monitor sieci ma wywołania zwrotne dla zdarzeń sieciowych, dzięki czemu można napisać skrypt, aby zabić żądane aplikacje. Przykład poniżej:

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

#!/usr/bin/env ruby

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

Spraw, aby był wykonywalny: chmod 755 /etc/NetworkManager/dispatcher.d/50vpndownkillapps.rbi ciesz się :-)

Ten skrypt jest w języku Ruby (więc wymaga Ruby), ale można go w prosty sposób przekonwertować na skrypt powłoki.

Zakłada się również, że karta VPN tun0jest standardem dla konfiguracji OpenVPN.

Marcus
źródło
1
Z nieznanego powodu ARGVzacząłem od 'tun0'dłuższego czasu i nagle zmieniłem na 'tun1'bez powiadomienia. Tak więc, aby utrzymać przełącznik kill działający pomimo tej pierwszej (bezużytecznej) zmiany wartości, musiałem zmienić test naif ARGV.last == 'vpn-down'
zezollo
3

Miałem tę samą potrzebę i opracowałem własne rozwiązanie, ponieważ wydaje się, że nie ma dedykowanego narzędzia do tego w systemie Linux. Nie ma potrzeby upuszczania / zamykania otwartych aplikacji! :)

Musisz skonfigurować zaporę iptables, aby urządzenie mogło łączyć się TYLKO z określonymi serwerami VPN (nie zezwala na żaden inny ruch, z wyjątkiem lokalnego, więc nie będzie „wycieków”). Oto skrypt do tego (znalazł go w Internecie):

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

Musisz skonfigurować tabelę servers=(). Wystarczy podać adresy IP swoich ulubionych serwerów VPN.

Sprawdź także, czy inne zmienne na początku skryptu są ustawione poprawnie, w przeciwnym razie zablokuje całe twoje połączenie.

Należy wykonać kopię zapasową iptables za pomocą:

sudo iptables-save > working.iptables.rules

(przywróć za pomocą sudo iptables-restore < working.iptables.rules)

Obsługuje połączenia TCP i UDP, jeśli potrzebujesz tylko jednego z nich, usuń niechciane dwie linie z for ()pętli. Sprawdź także, czy twój dostawca używa tych samych portów - może być inny.

Uruchom ten skrypt za pomocą fe sudo /home/user/vpn.sh.

Jeśli chcesz załadować go podczas rozruchu (iptables zwykle resetuje się po ponownym uruchomieniu), dodaj do /etc/rc.localpliku np. Linię bash /home/user/vpn.sh.


Następna część to automatyczne złącze VPN i monitor. Oto mój własny sprzęt do tego:

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

Automatycznie połączy się przy starcie i monitoruje twoje połączenie w danym interwale ( amount=10daje 10 sekundowy interwał) i ponownie łączy się po utracie połączenia. Mam funkcję logowania i kilka innych opcji.

Sprawdź UUID połączeń nmcli con showi dodaj do vpn=()tabeli ulubione (pasujące do adresów IP dodanych do zapory) . Za każdym razem losowo wybierze połączenie określone w tej tabeli.

Możesz dodać go do automatycznego uruchamiania (nie wymaga przywileju sudo). Oto przykład, jak uruchomić go w terminalu:

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

... a oto jak to wygląda w terminalu:

wprowadź opis zdjęcia tutaj

... a oto, jak wygląda szczelny ping po zerwaniu połączenia VPN:

wprowadź opis zdjęcia tutaj

Cieszyć się :)

GreggD
źródło
1
Jeśli chodzi o ładowanie skryptu podczas rozruchu, dlaczego po prostu go nie użyjesz /etc/rc.local?
Andrea Lazzarotto,
Piękny pomysł (działa jak urok!), Dziękuję :)
GreggD
To jest niesamowite, dziękuję bardzo. Zweryfikowano, że nadal działa od lipca 2017 r.
Norr
2

Udało mi się skonfigurować prosty przełącznik zabijania VPN z UFW. Działa ze wszystkimi VPNami, które mam.

Oto moje ustawienia 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

Działa dla mnie dobrze :)

Reeby
źródło
Wygląda OK, ale chyba sudo ufw allow out 443/tcppozwala na bezpieczny wyciek z witryny, gdy VPN nie jest podłączony. Nie chciałbyś tego zatrzymać? Witryna HTTPS z AJAX lub WebSockets może ponownie łączyć się w tle samodzielnie, być może za pomocą timera JavaScript.
halfer
0

Rozwiązałem ten problem, konfigurując Ufw do blokowania całego ruchu wychodzącego, a następnie dodając do białej listy wszystkie węzły VPN, odwołując się do ich indywidualnych adresów IP. Nie jest to tak uciążliwe, jak się wydaje: sieci VPN z mojego doświadczenia pozwalają na wyszukiwanie DNS w celu uzyskania różnych adresów IP.

Napisałem do tego program PHP o nazwie ufw-vpn . Używam go od kilku lat, z różnymi drobnymi ulepszeniami wprowadzonymi z czasem. Musisz oczywiście zainstalować PHP, a Git, jeśli chcesz go sklonować, a nie pobrać.

Możesz go również pobrać za pomocą wget:

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

Następnie uruchom polecenie, aby sprawdzić, czy wygląda OK (bez parametrów renderuje tylko komunikat składniowy):

php ufw-vpn.php

Teraz, zakładając, że twoja sieć VPN obsługuje tę funkcję, możesz użyć w pełni kwalifikowanej domeny, aby uzyskać listę serwerów dla regionu (musisz to znaleźć w dokumentacji dostawcy lub w dziale wsparcia):

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

To powinno dać ci dużą listę reguł zapory do dodania. Aby je łatwo zainstalować, możesz po prostu to zrobić:

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

Od czasu do czasu dostawcy VPN aktualizują swoje adresy IP, więc musisz zaktualizować swoje, aby pasowały. Możesz to zrobić przez diff:

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

W przypadku różnic warto sprawdzić reguły przed ich wykonaniem, ponieważ spowoduje to usunięcie wszystkiego, co nie należy do sieci VPN. Tak więc, jeśli masz jakieś niestandardowe reguły, będą musiały zostać usunięte przed uruchomieniem.

Więcej dokumentów jest dostępnych w repozytorium, a wszystko to jest open source, więc możesz sprawdzić kod pod kątem problemów z bezpieczeństwem. Zgłoszenia błędów i propozycje funkcji są bardzo mile widziane.

halfer
źródło