Apakah ada aplikasi VPN Monitor / Kill Switch untuk Ubuntu?

10

Hai Saya mencari aplikasi Monitor VPN / Kill Switch yang akan memastikan koneksi VPN saya selalu terhubung. Jika koneksi saya yang aman terputus, aplikasi akan menjatuhkan aplikasi yang sedang dipantau untuk mencegah kebocoran data. Saya tahu ada aplikasi semacam itu untuk Windows. Namun, saya belum menemukan alternatif yang cocok untuk Linux.

AsianXL
sumber

Jawaban:

5

Saya memiliki pengaturan yang sama, dan "VPN kill switches" lebih rumit daripada yang diperkirakan orang.

Mengikuti spesifikasi Anda, yang berbunyi "bunuh aplikasi tertentu ketika VPN jatuh", ada solusi sederhana.

Di Ubuntu, monitor jaringan memiliki callback untuk acara jaringan, sehingga Anda dapat menulis skrip untuk mematikan aplikasi yang Anda inginkan. Contoh berikut:

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

#!/usr/bin/env ruby

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

Membuatnya dapat dieksekusi:, chmod 755 /etc/NetworkManager/dispatcher.d/50vpndownkillapps.rbdan nikmati :-)

Skrip ini ada di Ruby (jadi itu membutuhkan ruby), tetapi dapat secara sepele dikonversi menjadi skrip shell.

Ini juga mengasumsikan bahwa adaptor VPN adalah tun0, yang merupakan standar untuk konfigurasi OpenVPN.

Marcus
sumber
1
Untuk alasan yang tidak diketahui, ARGVmemang mulai dengan 'tun0'untuk waktu yang lama, dan tiba-tiba berubah menjadi 'tun1'tanpa pemberitahuan. Jadi, untuk tetap mematikan switch meskipun nilai perubahan yang pertama (tidak berguna) ini, saya harus mengubah tes keif ARGV.last == 'vpn-down'
zezollo
3

Saya memiliki kebutuhan yang sama dan saya mengembangkan solusi saya sendiri karena sepertinya tidak ada alat khusus untuk ini di Linux. Tidak perlu drop / tutup aplikasi yang dibuka! :)

Anda perlu mengatur firewall iptables, sehingga mesin Anda HANYA dapat terhubung ke server VPN tertentu (tidak ada lalu lintas lain yang diizinkan, kecuali lokal, sehingga tidak akan ada "kebocoran"). Berikut ini skrip untuk itu (ditemukan di 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

Anda perlu mengatur tabel servers=(). Cukup tentukan IP dari server VPN favorit Anda.

Periksa juga apakah variabel lain di awal skrip diatur dengan benar, jika tidak maka akan memblokir seluruh koneksi Anda.

Pastikan Anda membuat cadangan iptables dengan:

sudo iptables-save > working.iptables.rules

(pulihkan dengan sudo iptables-restore < working.iptables.rules)

Ini mendukung koneksi TCP dan UDP, jika Anda hanya membutuhkan satu dari itu, hapus dua baris yang tidak diinginkan dari for ()loop. Periksa juga apakah penyedia Anda menggunakan port yang sama - mungkin berbeda.

Jalankan skrip ini dengan fe sudo /home/user/vpn.sh.

Jika Anda ingin memuatnya saat boot (iptables biasanya me-reset setelah boot ulang), tambahkan ke /etc/rc.localbaris file fe seperti bash /home/user/vpn.sh.


Bagian selanjutnya adalah konektor & monitor otomatis VPN. Ini alat saya sendiri untuk ini:

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

Ini akan terhubung secara otomatis saat start dan monitor koneksi Anda dengan interval yang diberikan (interval amount=1010 detik) dan hubungkan kembali koneksi yang hilang. Punya fitur logging dan beberapa opsi lainnya.

Periksa koneksi Anda menggunakan UUID nmcli con showdan tambahkan favorit Anda (cocok dengan IP ditambahkan ke firewall) ke vpn=()tabel. Setiap kali secara acak akan memilih koneksi yang ditentukan dalam tabel ini.

Anda dapat menambahkannya ke auto-start Anda (tidak perlu sudo priviledge). Berikut ini contoh cara memulainya di terminal:

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

... dan berikut tampilannya di terminal:

masukkan deskripsi gambar di sini

... dan inilah tampilan ping anti bocor setelah koneksi VPN Anda turun:

masukkan deskripsi gambar di sini

Nikmati :)

GreggD
sumber
1
Mengenai memuat skrip saat boot, mengapa Anda tidak hanya menggunakan /etc/rc.local?
Andrea Lazzarotto
Ide indah (bekerja seperti pesona!), Terima kasih :)
GreggD
Ini luar biasa, terima kasih banyak. Diverifikasi untuk masih bekerja pada Juli 2017.
Norr
2

Saya sudah bisa mengatur switch VPN kill sederhana dengan UFW. Ini bekerja dengan semua vpn yang saya miliki.

Ini pengaturan ufw saya:

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

Bekerja untuk saya baik-baik saja :)

Reeby
sumber
Terlihat OK, tapi saya kira sudo ufw allow out 443/tcpmemungkinkan kebocoran situs web yang aman ketika VPN tidak terhubung. Tidakkah Anda ingin menghentikan itu? Situs HTTPS dengan AJAX atau WebSockets mungkin terhubung kembali di latar belakangnya sendiri, mungkin melalui penghitung waktu JavaScript.
halfer
0

Saya memecahkan masalah ini dengan mengatur Ufw untuk memblokir semua lalu lintas keluar, dan kemudian memasukkan semua node VPN dengan merujuk masing-masing alamat IP. Ini tidak sesulit kedengarannya: VPN dalam pengalaman saya memungkinkan penggunaan pencarian DNS untuk mendapatkan berbagai alamat IP mereka.

Saya telah menulis program PHP untuk melakukan ini, yang disebut ufw-vpn . Saya telah menggunakannya selama beberapa tahun, dengan berbagai perangkat tambahan kecil yang dibuat seiring waktu. Anda tentu saja perlu menginstal PHP, dan Git jika Anda ingin mengkloningnya daripada mengunduhnya.

Anda juga dapat mengambilnya menggunakan wget:

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

Kemudian jalankan perintah untuk memeriksa tampilannya OK (tanpa parameter hanya membuat pesan sintaks):

php ufw-vpn.php

Sekarang, dengan asumsi VPN Anda mendukungnya, Anda dapat menggunakan domain yang sepenuhnya memenuhi syarat untuk mendapatkan daftar server untuk suatu wilayah (Anda perlu menemukannya di dokumentasi penyedia Anda, atau mungkin dari departemen dukungan mereka):

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

Itu seharusnya memberi Anda daftar besar aturan firewall untuk ditambahkan. Untuk menginstalnya dengan mudah, Anda bisa melakukan ini:

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

Dari waktu ke waktu penyedia VPN akan memperbarui alamat IP mereka, jadi Anda harus memperbarui alamat yang sesuai. Anda dapat melakukannya melalui diff:

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

Untuk perbedaan, ada baiknya memeriksa aturan sebelum menjalankannya, karena akan menghapus apa pun yang bukan milik VPN. Jadi, jika Anda memiliki beberapa aturan khusus, aturan tersebut harus dikeluarkan sebelum dijalankan.

Lebih banyak dokumen tersedia di repo, dan semuanya open source, sehingga Anda dapat memeriksa kode untuk masalah keamanan. Laporan bug dan saran fitur sangat disambut.

halfer
sumber