Чи існує програма 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 (тому він вимагає рубіну), але його можна тривіально перетворити на сценарій оболонки.

Він також передбачає, що адаптер 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 ()циклу небажані два рядки . Також перевірте, чи не використовує ваш постачальник один і той же порт - може бути іншим.

Запустіть цей сценарій з fe sudo /home/user/vpn.sh.

Якщо ви хочете завантажити його під час завантаження (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та додайте в vpn=()таблицю вибрані файли (відповідні IP-адресам, доданим до брандмауера) . Щоразу він випадковим чином вибере з'єднання, вказане в цій таблиці.

Ви можете додати його до свого автозапуску (не потребує приватності sudo). Ось приклад, як запустити його в терміналі:

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

... і ось як це виглядає працює в терміналі:

введіть тут опис зображення

... і ось як виглядає герметичний пінг після падіння вашого VPN-з'єднання:

введіть тут опис зображення

Насолоджуйтесь :)


1
Що стосується завантаження сценарію під час завантаження, чому ви просто не використаєте /etc/rc.local?
Андреа Лацаротто

Прекрасна ідея (працює як шарм!), Дякую :)
GreggD

Це приголомшливо, дуже дякую. Перевірено, що все ще працює з липня 2017 року.
Норр

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.
півзахисник

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-адреси, тож вам потрібно буде оновити свої, щоб вони відповідали. Це можна зробити за допомогою різниці:

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

Для відмінності варто перевірити правила, перш ніж виконати це, оскільки воно видалить все, що не належить до VPN. Отже, якщо у вас є власні правила, їх потрібно буде вийняти перед запуском.

Більше документів доступно в репо, і все це з відкритим кодом, тому ви можете перевірити код на предмет безпеки. Звіти про помилки та пропозиції щодо функцій дуже вітаються.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.