มีแอพพลิเคชั่น VPN Monitor / Kill Switch สำหรับ Ubuntu หรือไม่?


10

สวัสดีฉันกำลังมองหาแอพพลิเคชั่น VPN Monitor / Kill Switch ที่จะทำให้การเชื่อมต่อ VPN ของฉันเชื่อมต่ออยู่ตลอดเวลา หากการเชื่อมต่อที่ปลอดภัยของฉันหล่นลงแอปพลิเคชันจะปล่อยแอปพลิเคชันที่ตรวจสอบเพื่อป้องกันการรั่วไหลของข้อมูล ฉันรู้ว่ามีแอพพลิเคชั่นดังกล่าวสำหรับ Windows อย่างไรก็ตามฉันยังไม่พบทางเลือกที่เหมาะสมสำหรับ Linux

คำตอบ:


5

ฉันมีการตั้งค่าเดียวกันและ "สวิตช์การฆ่า VPN" นั้นซับซ้อนกว่าที่คิด

แม้ว่าตามข้อกำหนดของคุณซึ่งอ่านว่า "ฆ่าแอพบางตัวเมื่อ VPN ล่ม" ก็มีวิธีแก้ปัญหาง่ายๆ

บน Ubuntu จอภาพเครือข่ายมีการเรียกกลับสำหรับกิจกรรมเครือข่ายเพื่อให้คุณสามารถเขียนสคริปต์เพื่อฆ่าแอพที่คุณต้องการ ตัวอย่างดังต่อไปนี้:

แก้ไข/etc/NetworkManager/dispatcher.d/50vpndownkillapps.rb:

#!/usr/bin/env ruby

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

ทำให้มันใช้งานได้: chmod 755 /etc/NetworkManager/dispatcher.d/50vpndownkillapps.rbและเพลิดเพลินกับ :-)

สคริปต์นี้อยู่ใน Ruby (ดังนั้นจึงต้องใช้ ruby) แต่สามารถแปลงเป็นสคริปต์เชลล์ได้เล็กน้อย

นอกจากนี้ยังอนุมานว่าอะแดปเตอร์ VPN คือtun0ซึ่งเป็นมาตรฐานสำหรับการกำหนดค่า OpenVPN


1
ด้วยเหตุผลที่ไม่รู้จักARGVเริ่มต้นด้วย'tun0'เวลานานและเปลี่ยนเป็น'tun1'โดยไม่ต้องแจ้งให้ทราบล่วงหน้า ดังนั้นเพื่อให้สวิตช์ฆ่าทำงานแม้ว่าค่าการเปลี่ยนแปลงครั้งแรก (ไร้ประโยชน์) นี้ฉันต้องเปลี่ยนการทดสอบเป็นif ARGV.last == 'vpn-down'
zezollo

3

ฉันมีความต้องการแบบเดียวกันนี้และฉันได้พัฒนาโซลูชันของตัวเองเนื่องจากดูเหมือนว่าจะไม่มีเครื่องมือเฉพาะสำหรับสิ่งนี้บน Linux ไม่จำเป็นต้องเปิด / ปิดแอปพลิเคชั่นที่เปิดอยู่! :)

คุณต้องติดตั้งไฟร์วอลล์ iptables เพื่อให้เครื่องของคุณสามารถเชื่อมต่อกับเซิร์ฟเวอร์ VPN ที่ระบุเท่านั้น (ไม่อนุญาตการรับส่งข้อมูลอื่นยกเว้นภายในเครื่องดังนั้นจะไม่มี "การรั่วไหล") นี่คือสคริปต์สำหรับสิ่งนั้น (พบได้บนเว็บ):

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

servers=()คุณจะต้องติดตั้งตาราง เพียงระบุ IP ของเซิร์ฟเวอร์ VPN ที่คุณชื่นชอบ

ตรวจสอบด้วยว่าตัวแปรอื่น ๆ ที่จุดเริ่มต้นของสคริปต์ถูกตั้งค่าอย่างเหมาะสมมิฉะนั้นจะบล็อกการเชื่อมต่อทั้งหมดของคุณ

อย่าลืมสำรองข้อมูล iptables ด้วย:

sudo iptables-save > working.iptables.rules

(กู้คืนด้วยsudo iptables-restore < working.iptables.rules)

รองรับการเชื่อมต่อ TCP และ UDP หากคุณต้องการเพียงหนึ่งในนั้นให้ลบสองบรรทัดที่ไม่ต้องการออกจากfor ()ลูป ตรวจสอบด้วยว่าผู้ให้บริการของคุณใช้พอร์ตเดียวกัน - อาจแตกต่างกัน

เรียกใช้สคริปต์นี้กับ sudo /home/user/vpn.shfe

หากคุณต้องการที่จะโหลดในการบูต (iptables มักจะตั้งค่าใหม่อีกครั้งหลังจากบูต), เพิ่มที่คุณ/etc/rc.localไฟล์บรรทัด fe bash /home/user/vpn.shเช่น


ส่วนถัดไปคือตัวเชื่อมต่อและตรวจสอบ VPN อัตโนมัติ นี่คือการคุมกำเนิดของฉันสำหรับสิ่งนี้:

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

มันจะเชื่อมต่ออัตโนมัติเมื่อเริ่มต้นและตรวจสอบการเชื่อมต่อของคุณด้วยช่วงเวลาที่กำหนด ( amount=10ให้ช่วงเวลา 10 วินาที) และเชื่อมต่ออีกครั้งเมื่อการเชื่อมต่อขาดหายไป เตรียมพร้อมคุณสมบัติการบันทึกและตัวเลือกอื่น ๆ

ตรวจสอบการเชื่อมต่อของคุณ UUID ใช้nmcli con showและเพิ่มรายการโปรดของคุณ (จับคู่กับ IP ที่เพิ่มเข้ากับไฟร์วอลล์) ลงในvpn=()ตาราง ทุกครั้งที่มีการสุ่มเลือกการเชื่อมต่อที่ระบุในตารางนี้

คุณสามารถเพิ่มลงในการเริ่มอัตโนมัติของคุณ (ไม่ต้องใช้สิทธิ์ sudo) นี่คือตัวอย่างวิธีการเริ่มต้นใน terminal:

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

... และนี่คือลักษณะที่ปรากฏในเทอร์มินัล:

ป้อนคำอธิบายรูปภาพที่นี่

... และนี่คือลักษณะการ ping ที่ป้องกันการรั่วเหมือนหลังจากการเชื่อมต่อ VPN ของคุณลดลง:

ป้อนคำอธิบายรูปภาพที่นี่

สนุก :)


1
เกี่ยวกับการโหลดสคริปต์ที่บูตทำไมจะไม่ให้คุณเพียงแค่ใช้/etc/rc.local?
Andrea Lazzarotto

ความคิดที่สวยงาม (ทำงานได้เหมือนมีเสน่ห์!) ขอบคุณ :)
GreggD

มันยอดเยี่ยมมากขอบคุณมาก ตรวจสอบแล้วว่าจะยังคงใช้งานได้ในเดือนกรกฎาคม 2017
Norr

2

ฉันสามารถตั้งค่าสวิตช์ฆ่า VPN อย่างง่ายด้วย UFW มันทำงานได้กับ vpn ทั้งหมดที่ฉันมี

นี่คือการตั้งค่า 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

ทำงานให้ฉันได้ดี :)


ดูเหมือนว่าจะใช้ได้ แต่ฉันเดาว่าจะsudo ufw allow out 443/tcpอนุญาตให้เว็บไซต์รั่วไหลอย่างปลอดภัยเมื่อไม่ได้เชื่อมต่อ VPN คุณไม่ต้องการที่จะหยุดที่ ไซต์ HTTPS ที่มี AJAX หรือ WebSockets อาจเชื่อมต่ออีกครั้งในพื้นหลังด้วยตนเองอาจผ่านตัวจับเวลา JavaScript
halfer

0

ฉันแก้ไขปัญหานี้ด้วยการตั้งค่า Ufw เพื่อบล็อกทราฟฟิกขาออกทั้งหมดแล้วเพิ่มรายชื่อโหนด VPN ทั้งหมดด้วยการอ้างอิงที่อยู่ IP ของตน นี่ไม่ใช่เรื่องยากอย่างที่คิด: VPN ในประสบการณ์ของฉันอนุญาตให้ใช้การค้นหา DNS เพื่อรับที่อยู่ IP ต่างๆของพวกเขา

ฉันได้เขียนโปรแกรม PHP ในการทำเช่นนี้เรียกว่าufw-VPN ฉันใช้มันมาสองปีแล้วด้วยการปรับปรุงเล็ก ๆ หลายอย่างที่ทำขึ้นตามกาลเวลา คุณจะต้องติดตั้ง PHP แน่นอนและ Git หากคุณต้องการโคลนมากกว่าดาวน์โหลด

คุณยังสามารถคว้ามันได้โดยใช้ wget:

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

จากนั้นรันคำสั่งเพื่อตรวจสอบว่ามันดูเหมือนว่าตกลง (ไม่มีพารามิเตอร์เพียงแค่แสดงข้อความไวยากรณ์):

php ufw-vpn.php

ตอนนี้สมมติว่า VPN ของคุณรองรับคุณสามารถใช้โดเมนที่ผ่านการรับรองเพื่อรับรายการเซิร์ฟเวอร์สำหรับภูมิภาค (คุณจะต้องค้นหาสิ่งนี้ในเอกสารประกอบของผู้ให้บริการของคุณหรืออาจมาจากแผนกสนับสนุนของพวกเขา):

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

นั่นควรให้รายการกฎไฟร์วอลล์จำนวนมากที่คุณควรเพิ่ม หากต้องการติดตั้งอย่างง่ายดายคุณสามารถทำได้:

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

บางครั้งผู้ให้บริการ VPN จะอัปเดตที่อยู่ IP ดังนั้นคุณจะต้องอัปเดตข้อมูลของคุณให้ตรงกัน คุณสามารถทำได้ผ่านทาง diff:

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

สำหรับส่วนต่างมันก็คุ้มค่าที่จะตรวจสอบกฎก่อนที่จะดำเนินการนั้นเพราะมันจะลบสิ่งที่ไม่ได้เป็นของ VPN ดังนั้นหากคุณมีกฎที่กำหนดเองพวกเขาจะต้องดำเนินการก่อนที่จะทำงาน

มีเอกสารเพิ่มเติมที่ repo และเป็นแหล่งเปิดดังนั้นคุณสามารถตรวจสอบรหัสเพื่อดูปัญหาด้านความปลอดภัย รายงานข้อผิดพลาดและคำแนะนำคุณสมบัติยินดีต้อนรับอย่างมาก

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.