Ubuntu için bir VPN Monitor / Kill Switch uygulaması var mı?


10

Merhaba VPN bağlantımın her zaman bağlı olmasını sağlayacak bir VPN Monitör / Kill Switch uygulaması arıyorum. Güvenli bağlantım kesilirse, uygulama veri sızıntısını önlemek için izlediği uygulamaları bırakacaktır. Windows için böyle uygulamalar olduğunu biliyorum. Ancak, henüz Linux için uygun bir alternatif bulamadım.

Yanıtlar:


5

Aynı kurulumu yaptım ve "VPN kill switch'ler" düşündüğünden daha zor.

Yine de "VPN düştüğünde belirli uygulamaları öldür" olarak belirtilen belirtiminize uygun olarak, basit bir çözüm var.

Ubuntu'da, ağ izleyicisinin ağ olayları için geri çağrıları vardır, böylece istediğiniz uygulamaları öldürmek için bir komut dosyası yazabilirsiniz. Aşağıdaki örnek:

Düzenle /etc/NetworkManager/dispatcher.d/50vpndownkillapps.rb:

#!/usr/bin/env ruby

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

Yürütülebilir hale getirmek:, chmod 755 /etc/NetworkManager/dispatcher.d/50vpndownkillapps.rbve keyfini çıkarın :-)

Bu script Ruby'de (yani ruby ​​gerektirir), ama önemsiz bir şekilde bir kabuk betiğine dönüştürülebilir.

Ayrıca tun0OpenVPN yapılandırmaları için standart olan VPN adaptörünün de olduğunu varsayar .


1
Bilinmeyen bir nedenle ARGVile başladınız 'tun0'uzun süre ve aniden değiştirildi 'tun1'haber vermeden. Bu nedenle, bu ilk (yararsız) değişen değere rağmen kill anahtarını çalışmaya devam etmek için testi şu şekilde değiştirmek zorunda kaldımif ARGV.last == 'vpn-down'
zezollo

3

Aynı ihtiyacım vardı ve Linux'ta bunun için özel bir araç olmadığı için kendi çözümümü geliştirdim. Açılan uygulamaları bırakmaya / kapatmaya gerek yoktur! :)

Iptables güvenlik duvarını ayarlamanız gerekir, böylece makineniz SADECE belirtilen VPN sunucularına bağlanabilir (yerel hariç başka bir trafiğe izin verilmez, bu nedenle "sızıntı" olmayacaktır). Bunun için bir komut dosyası (web'de buldum):

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

Tabloyu ayarlamanız gerekir servers=(). Sadece favori VPN sunucularınızın IP'lerini belirtin.

Ayrıca, komut dosyasının başlangıcındaki diğer değişkenlerin doğru ayarlandığından emin olun, aksi takdirde tüm bağlantınız engellenir.

İptables ile yedekleme yaptığınızdan emin olun:

sudo iptables-save > working.iptables.rules

(ile geri yükle sudo iptables-restore < working.iptables.rules)

TCP ve UDP bağlantılarını destekler, bunlardan yalnızca birine ihtiyacınız varsa, for ()döngüden istenmeyen iki satırı kaldırın . Ayrıca sağlayıcınızın aynı bağlantı noktalarını kullanıp kullanmadığını kontrol edin - farklı olabilir.

Bu komut dosyasını fe ile çalıştırın sudo /home/user/vpn.sh.

Önyüklemeye yüklemek istiyorsanız (iptables genellikle yeniden önyüklemeden sonra sıfırlanır), /etc/rc.localdosya fe satırınıza ekleyin bash /home/user/vpn.sh.


Sonraki bölüm VPN otomatik konektörü ve monitörü. İşte bunun için kendi mekanizmam:

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

Başlangıçta otomatik olarak bağlanır ve verilen aralıkta ( amount=1010 saniye aralık verir) bağlantınızı izler ve bağlantı kesildiğinde yeniden bağlanır. Günlük özelliği ve diğer bazı seçenekler var.

Bağlantı UUID'lerinizi kullanarak kontrol edin nmcli con showve sık kullanılanlarınızı (güvenlik duvarına eklenen IP'lerle eşleşir) vpn=()tabloya ekleyin . Her seferinde bu tabloda belirtilen bir bağlantıyı rastgele seçecektir.

Otomatik başlatmanıza ekleyebilirsiniz (sudo ayrıcalığına gerek yoktur). Terminalde nasıl başlatılacağına dair bir örnek:

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

... ve terminalde şu şekilde çalışıyor:

resim açıklamasını buraya girin

... VPN bağlantınız kesildikten sonra sızdırmaz bir ping şöyle görünür:

resim açıklamasını buraya girin

Zevk almak :)


1
Komut dosyasını önyükleme sırasında yüklerken, neden sadece kullanmıyorsunuz /etc/rc.local?
Andrea Lazzarotto

Güzel fikir (çekicilik gibi çalışır!), Teşekkür ederim :)
GreggD

Bu harika, çok teşekkür ederim. Temmuz 2017 itibariyle hala çalıştığı doğrulandı.
Norr

2

UFW ile basit bir VPN kill switch'i ayarlayabildim. Sahip olduğum tüm vpn's ile çalışır.

İşte benim ufw ayarlarım:

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

Benim için iyi çalışıyor :)


Tamam görünüyor, ancak sanırım sudo ufw allow out 443/tcpVPN bağlı değilken güvenli web sitesi sızıntısına izin veriyor. Bunu durdurmak istemez misin? AJAX veya WebSockets içeren bir HTTPS sitesi, arka planda kendi başına, belki bir JavaScript zamanlayıcı aracılığıyla yeniden bağlanabilir.
halfer

0

Ufw'yi tüm giden trafiği engelleyecek şekilde ayarlayıp ardından tüm IP adreslerini tek tek IP adreslerine başvurarak beyaz listeye ekleyerek bu sorunu çözdüm. Bu göründüğü kadar zahmetli değil: Deneyimlerimdeki VPN'ler, çeşitli IP adreslerini almak için DNS aramasının kullanılmasına izin veriyor.

Bunu yapmak için bir PHP programı yazdım, ufw-vpn . Birkaç yıl boyunca, zaman içinde yapılan çeşitli küçük geliştirmelerle kullandım. Tabii ki PHP yüklü olmalı ve indirmek yerine klonlamak istiyorsanız Git.

Ayrıca wget kullanarak da yakalayabilirsiniz:

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

Ardından, Tamam olup olmadığını kontrol etmek için komutu çalıştırın (parametreler olmadan sadece bir sözdizimi mesajı oluşturur):

php ufw-vpn.php

Şimdi, VPN'nizin desteklediğini varsayarak, bir bölge için sunucuların listesini almak için tam nitelikli bir etki alanı kullanabilirsiniz (bunu sağlayıcınızın belgelerinde veya belki de destek bölümlerinden bulmanız gerekir):

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

Bu size eklenecek güvenlik duvarı kurallarının büyük bir listesini vermelidir. Bunları kolayca kurmak için şunları yapabilirsiniz:

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

VPN sağlayıcıları zaman zaman IP adreslerini güncelleyecektir, bu nedenle eşleşmeleri için kendilerinizi güncellemeniz gerekir. Bunu bir farkla yapabilirsiniz:

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

Bir fark için, VPN'ye ait olmayan herhangi bir şeyi sileceğinden, yürütmeden önce kuralları kontrol etmeye değer. Bu nedenle, bazı özel kurallarınız varsa, çalıştırmadan önce bunların çıkarılması gerekir.

Repo'da daha fazla doküman var ve hepsi açık kaynak kodlu, böylece güvenlik sorunları için kodu kontrol edebilirsiniz. Hata raporları ve özellik önerileri çok açıktır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.