Có ứng dụng VPN Monitor / Kill Switch cho Ubuntu không?


10

Xin chào Tôi đang tìm kiếm một ứng dụng VPN Monitor / Kill Switch sẽ đảm bảo kết nối VPN của tôi luôn được kết nối. Nếu kết nối bảo mật của tôi bị rớt, ứng dụng sẽ bỏ các ứng dụng đang theo dõi để tránh rò rỉ dữ liệu. Tôi biết có những ứng dụng như vậy cho Windows. Tuy nhiên, tôi vẫn chưa tìm thấy một sự thay thế phù hợp cho Linux.

Câu trả lời:


5

Tôi đã có cùng một thiết lập và "VPN kill switch" khó hơn người ta tưởng.

Theo thông số kỹ thuật của bạn, mặc dù đọc là "tiêu diệt một số ứng dụng khi VPN sụp đổ", có một giải pháp đơn giản.

Trên Ubuntu, trình giám sát mạng có các cuộc gọi lại cho các sự kiện mạng, để bạn có thể viết một tập lệnh để tắt các ứng dụng bạn muốn. Ví dụ sau:

Chỉnh sửa /etc/NetworkManager/dispatcher.d/50vpndownkillapps.rb:

#!/usr/bin/env ruby

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

Làm cho nó thực thi: chmod 755 /etc/NetworkManager/dispatcher.d/50vpndownkillapps.rbvà tận hưởng :-)

Kịch bản này có trong Ruby (vì vậy nó yêu cầu ruby), nhưng nó có thể được chuyển đổi một cách tầm thường thành kịch bản shell.

Nó cũng giả định rằng bộ điều hợp VPN tun0là tiêu chuẩn cho cấu hình OpenVPN.


1
Vì một lý do không rõ, ARGVđã bắt đầu 'tun0'trong một thời gian dài, và đột nhiên thay đổi thành 'tun1'không báo trước. Vì vậy, để giữ cho khóa chuyển đổi hoạt động mặc dù giá trị thay đổi đầu tiên (vô dụng) này, tôi đã phải thay đổi thử nghiệm thànhif ARGV.last == 'vpn-down'
zezoche

3

Tôi có cùng nhu cầu này và tôi đã phát triển giải pháp của riêng mình vì dường như không có công cụ dành riêng cho việc này trên Linux. Không cần phải thả / đóng các ứng dụng đã mở! :)

Bạn cần thiết lập tường lửa iptables, để máy của bạn có thể kết nối CHỈ với các máy chủ VPN được chỉ định (không cho phép lưu lượng truy cập khác, ngoại trừ cục bộ, do đó sẽ không có "rò rỉ"). Đây là một kịch bản cho điều đó (tìm thấy nó trên 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

Bạn sẽ cần phải thiết lập bảng servers=(). Chỉ cần xác định IP của máy chủ VPN yêu thích của bạn.

Đồng thời kiểm tra xem các biến khác ở đầu tập lệnh có được đặt đúng không, nếu không nó sẽ chặn toàn bộ kết nối của bạn.

Hãy chắc chắn để tạo bản sao lưu iptables với:

sudo iptables-save > working.iptables.rules

(khôi phục với sudo iptables-restore < working.iptables.rules)

Nó hỗ trợ các kết nối TCP và UDP, nếu bạn chỉ cần một trong số đó, loại bỏ hai dòng không mong muốn khỏi for ()vòng lặp. Đồng thời kiểm tra xem nhà cung cấp của bạn có sử dụng cùng một cổng không - có thể khác.

Chạy kịch bản này với fe sudo /home/user/vpn.sh.

Nếu bạn muốn tải nó khi khởi động (iptables thường đặt lại sau khi khởi động lại), hãy thêm vào /etc/rc.localdòng tệp của bạn như thế nào bash /home/user/vpn.sh.


Phần tiếp theo là kết nối và màn hình tự động VPN. Đây là ý tưởng riêng của tôi cho việc này:

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

Nó sẽ tự động kết nối khi bắt đầu và theo dõi kết nối của bạn với khoảng thời gian nhất định ( amount=10cho khoảng thời gian 10 giây) và kết nối lại khi mất kết nối. Có tính năng đăng nhập và một số tùy chọn khác.

Kiểm tra các kết nối của bạn bằng cách sử dụng nmcli con showvà thêm các mục yêu thích của bạn (khớp với IP được thêm vào tường lửa) vào vpn=()bảng. Mỗi lần nó sẽ chọn ngẫu nhiên một kết nối được chỉ định trong bảng này.

Bạn có thể thêm nó vào tự động bắt đầu (không cần sudo privateiledge). Dưới đây là một ví dụ về cách khởi động nó trong terminal:

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

... Và đây là cách nó chạy trong thiết bị đầu cuối:

nhập mô tả hình ảnh ở đây

... Và đây là cách ping chống rò rỉ trông như thế nào sau khi kết nối VPN của bạn bị rớt:

nhập mô tả hình ảnh ở đây

Thưởng thức :)


1
Về việc tải tập lệnh khi khởi động, tại sao bạn không sử dụng /etc/rc.local?
Andrea Lazzarotto

Ý tưởng tuyệt vời (hoạt động như sự quyến rũ!), Cảm ơn bạn :)
GreggD

Điều này thật tuyệt vời, cảm ơn bạn rất nhiều. Được xác minh là vẫn hoạt động kể từ tháng 7 năm 2017.
Norr

2

Tôi đã có thể thiết lập một công cụ tiêu diệt VPN đơn giản với UFW. Nó hoạt động với tất cả các vpn tôi có.

Đây là cài đặt ufw của tôi:

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

Làm việc cho tôi tốt thôi :)


Có vẻ ổn, nhưng tôi đoán sudo ufw allow out 443/tcpcho phép rò rỉ trang web an toàn khi VPN không được kết nối. Bạn có muốn ngăn chặn điều đó không? Trang web HTTPS với AJAX hoặc WebSockets có thể tự kết nối lại trong nền, có thể thông qua bộ đếm thời gian JavaScript.
giảm tốc

0

Tôi đã giải quyết vấn đề này bằng cách thiết lập Ufw để chặn tất cả lưu lượng đi, và sau đó liệt kê tất cả các nút VPN bằng cách tham chiếu các địa chỉ IP riêng lẻ của chúng. Đây không phải là vấn đề như nó có vẻ như: VPN theo kinh nghiệm của tôi cho phép sử dụng tra cứu DNS để có được các địa chỉ IP khác nhau của họ.

Tôi đã viết một chương trình PHP để làm điều này, được gọi là ufw-vpn . Tôi đã sử dụng nó trong một vài năm, với nhiều cải tiến nhỏ được thực hiện theo thời gian. Tất nhiên bạn sẽ cần cài đặt PHP và Git nếu bạn muốn sao chép nó thay vì tải xuống.

Bạn cũng có thể lấy nó bằng wget:

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

Sau đó chạy lệnh để kiểm tra xem nó có ổn không (không có tham số chỉ hiển thị thông báo cú pháp):

php ufw-vpn.php

Bây giờ, giả sử VPN của bạn hỗ trợ nó, bạn có thể sử dụng tên miền đủ điều kiện để nhận danh sách máy chủ cho một khu vực (bạn sẽ cần tìm thấy điều này trong tài liệu của nhà cung cấp hoặc có thể từ bộ phận hỗ trợ của họ):

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

Điều đó sẽ cung cấp cho bạn một danh sách lớn các quy tắc tường lửa để thêm. Để cài đặt chúng dễ dàng, bạn chỉ cần làm điều này:

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

Thỉnh thoảng các nhà cung cấp VPN sẽ cập nhật địa chỉ IP của họ, vì vậy bạn sẽ cần cập nhật địa chỉ của mình để phù hợp. Bạn có thể làm như vậy thông qua một khác biệt:

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

Đối với một khác biệt, đáng để kiểm tra các quy tắc trước khi thực hiện điều đó, vì nó sẽ xóa bất cứ thứ gì không thuộc về VPN. Vì vậy, nếu bạn có một số quy tắc tùy chỉnh, chúng sẽ cần được gỡ bỏ trước khi chạy.

Nhiều tài liệu có sẵn tại repo và tất cả đều là nguồn mở, vì vậy bạn có thể kiểm tra mã về các vấn đề bảo mật. Báo cáo lỗi và đề xuất tính năng rất được hoan nghênh.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.