Существует ли приложение для мониторинга / выключения VPN-мониторинга для Ubuntu?

10

Привет! Я ищу приложение VPN Monitor / Kill Switch, которое обеспечит постоянное подключение моего VPN-соединения. Если мое защищенное соединение прервется, приложение удалит приложения, которые оно отслеживает, чтобы предотвратить утечку данных. Я знаю, что есть такие приложения для Windows. Однако мне еще предстоит найти подходящую альтернативу для Linux.

AsianXL
источник

Ответы:

5

У меня была такая же настройка, и «VPN kill switch» хитрее, чем можно было бы подумать.

Однако, следуя вашей спецификации, которая гласит «убивать определенные приложения при падении 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'без уведомления. Поэтому, чтобы выключатель kill работал, несмотря на это первое (бесполезное) изменение значения, мне пришлось изменить тест на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файл, например, строку 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=1010 секунд) и повторно подключаться при потере соединения. Есть функция регистрации и некоторые другие опции.

Проверьте UUID вашего соединения nmcli con showи добавьте ваши любимые (в соответствии с IP, добавленными в брандмауэр) в vpn=()таблицу. Каждый раз он будет случайным образом выбирать соединение, указанное в этой таблице.

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

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

... и вот как это работает в терминале:

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

... и вот как выглядит проверка на утечку после разрыва вашего VPN-соединения:

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

Наслаждаться :)

GreggD
источник
1
Что касается загрузки скрипта при загрузке, почему бы вам просто не использовать /etc/rc.local?
Андреа Лаззаротто
Прекрасная идея (работает как шарм!), Спасибо :)
GreggD
Это потрясающе, спасибо большое. Проверено, все еще работает по состоянию на июль 2017 года.
Норр
2

Мне удалось настроить простой VPN kill-переключатель с 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

У меня работает просто отлично :)

Reeby
источник
Выглядит хорошо, но я предполагаю, что 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. Так что, если у вас есть некоторые пользовательские правила, их нужно будет удалить перед запуском.

В репозитории доступно больше документов, и все они с открытым исходным кодом, так что вы можете проверить код на наличие проблем безопасности. Отчеты об ошибках и пожелания приветствуются.

halfer
источник