Есть ли VPN-коммутатор для Linux для OpenVPN? [dубликат]

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

9
задан 25 February 2015 в 00:31

15 ответов

У меня была такая же потребность, и я разработал свое собственное решение, поскольку, похоже, в 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 (). Также проверьте, использует ли ваш провайдер одни и те же порты.

Запустите этот скрипт с f.e. sudo /home/user/vpn.sh.

Если вы хотите загрузить его при загрузке (iptables обычно сбрасывается после перезагрузки), добавьте в свой /etc/rc.local файл f.e. как bash /home/user/vpn.sh.

Следующая часть - это VPN-коннектор и amp; монитор. Вот мое собственное приспособление для этого:

#!/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 priviledge). Вот пример, как запустить его в терминале:

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

... и вот как он выглядит в терминале:

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

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

5
ответ дан 18 July 2018 в 06:50

Я решил эту проблему, настроив 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

Для diff вам стоит проверить правила перед выполнением этого, так как он удалит все, что не принадлежит VPN. Итак, если у вас есть какие-то пользовательские правила, их нужно будет вынуть перед запуском.

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

0
ответ дан 18 July 2018 в 06:50

У меня была такая же настройка, и «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 и наслаждаться: -)

Этот скрипт находится в

Он также предполагает, что адаптер VPN является tun0, который является стандартом для конфигураций OpenVPN.

5
ответ дан 18 July 2018 в 06:50

Мне удалось настроить простой VPN-шлюз с UFW.

Вот мои настройки 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

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

1
ответ дан 18 July 2018 в 06:50

У меня была такая же потребность, и я разработал свое собственное решение, поскольку, похоже, в 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 (). Также проверьте, использует ли ваш провайдер одни и те же порты.

Запустите этот скрипт с f.e. sudo /home/user/vpn.sh.

Если вы хотите загрузить его при загрузке (iptables обычно сбрасывается после перезагрузки), добавьте в свой /etc/rc.local файл f.e. как bash /home/user/vpn.sh.

Следующая часть - это VPN-коннектор и amp; монитор. Вот мое собственное приспособление для этого:

#!/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 priviledge). Вот пример, как запустить его в терминале:

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

... и вот как он выглядит в терминале:

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

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

5
ответ дан 24 July 2018 в 18:41
  • 1
    Что касается загрузки скрипта при загрузке, почему бы вам просто не использовать /etc/rc.local? – Andrea Lazzarotto 28 December 2016 в 14:47
  • 2
    Прекрасная идея (работает как шарм!), Спасибо :) – GreggD 28 December 2016 в 14:56
  • 3
    Это потрясающе, спасибо вам большое. Подтверждено, что он по-прежнему работает с июля 2017 года. – Norr 15 July 2017 в 05:13

Я решил эту проблему, настроив 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

Для diff вам стоит проверить правила перед выполнением этого, так как он удалит все, что не принадлежит VPN. Итак, если у вас есть какие-то пользовательские правила, их нужно будет вынуть перед запуском.

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

0
ответ дан 24 July 2018 в 18:41

У меня была такая же настройка, и «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 и наслаждаться: -)

Этот скрипт находится в

Он также предполагает, что адаптер VPN является tun0, который является стандартом для конфигураций OpenVPN.

5
ответ дан 24 July 2018 в 18:41
  • 1
    По неизвестной причине ARGV долгое время начинался с 'tun0' и внезапно менялся на 'tun1' без предупреждения. Таким образом, чтобы поддерживать работу выключателя kill несмотря на это первое (бесполезное) изменение значения, мне пришлось сменить тест на if ARGV.last == 'vpn-down' – zezollo 22 May 2018 в 20:19

Мне удалось настроить простой VPN-шлюз с UFW.

Вот мои настройки 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

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

1
ответ дан 24 July 2018 в 18:41
  • 1
    Выглядит хорошо, но я думаю, sudo ufw allow out 443/tcp разрешает безопасную утечку веб-сайта, когда VPN не подключен. Разве вы не хотели бы этого прекратить? Сайт HTTPS с AJAX или WebSockets может повторно подключаться в фоновом режиме самостоятельно, возможно, с помощью таймера JavaScript. – halfer 11 December 2017 в 15:27

У меня была такая же потребность, и я разработал свое собственное решение, поскольку, похоже, в 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 (). Также проверьте, использует ли ваш провайдер одни и те же порты.

Запустите этот скрипт с f.e. sudo /home/user/vpn.sh.

Если вы хотите загрузить его при загрузке (iptables обычно сбрасывается после повторной загрузки), добавьте в свой файл /etc/rc.local f.e. как bash /home/user/vpn.sh.


Следующая часть - это автосоединение VPN и amp; монитор. Вот мое собственное приспособление для этого:

#!/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 priviledge). Вот пример, как запустить его в терминале:

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

... и вот как он выглядит в терминале:

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

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

5
ответ дан 31 July 2018 в 21:44

У меня была такая же потребность, и я разработал свое собственное решение, поскольку, похоже, в 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 (). Также проверьте, использует ли ваш провайдер одни и те же порты.

Запустите этот скрипт с f.e. sudo /home/user/vpn.sh.

Если вы хотите загрузить его при загрузке (iptables обычно сбрасывается после повторной загрузки), добавьте в свой файл /etc/rc.local f.e. как bash /home/user/vpn.sh.


Следующая часть - это автосоединение VPN и amp; монитор. Вот мое собственное приспособление для этого:

#!/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 priviledge). Вот пример, как запустить его в терминале:

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

... и вот как он выглядит в терминале:

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

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

5
ответ дан 2 August 2018 в 15:00

У меня была такая же потребность, и я разработал свое собственное решение, поскольку, похоже, в 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 (). Также проверьте, использует ли ваш провайдер одни и те же порты.

Запустите этот скрипт с f.e. sudo /home/user/vpn.sh.

Если вы хотите загрузить его при загрузке (iptables обычно сбрасывается после повторной загрузки), добавьте в свой файл /etc/rc.local f.e. как bash /home/user/vpn.sh.


Следующая часть - это автосоединение VPN и amp; монитор. Вот мое собственное приспособление для этого:

#!/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 priviledge). Вот пример, как запустить его в терминале:

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

... и вот как он выглядит в терминале:

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

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

5
ответ дан 3 August 2018 в 19:07

У меня была такая же потребность, и я разработал свое собственное решение, поскольку, похоже, в 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 (). Также проверьте, использует ли ваш провайдер одни и те же порты.

Запустите этот скрипт с f.e. sudo /home/user/vpn.sh.

Если вы хотите загрузить его при загрузке (iptables обычно сбрасывается после повторной загрузки), добавьте в свой файл /etc/rc.local f.e. как bash /home/user/vpn.sh.


Следующая часть - это автосоединение VPN и amp; монитор. Вот мое собственное приспособление для этого:

#!/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 priviledge). Вот пример, как запустить его в терминале:

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

... и вот как он выглядит в терминале:

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

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

5
ответ дан 5 August 2018 в 03:56

У меня была такая же потребность, и я разработал свое собственное решение, поскольку, похоже, в 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 (). Также проверьте, использует ли ваш провайдер одни и те же порты.

Запустите этот скрипт с f.e. sudo /home/user/vpn.sh.

Если вы хотите загрузить его при загрузке (iptables обычно сбрасывается после повторной загрузки), добавьте в свой файл /etc/rc.local f.e. как bash /home/user/vpn.sh.


Следующая часть - это автосоединение VPN и amp; монитор. Вот мое собственное приспособление для этого:

#!/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 priviledge). Вот пример, как запустить его в терминале:

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

... и вот как он выглядит в терминале:

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

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

5
ответ дан 6 August 2018 в 20:54

У меня была такая же потребность, и я разработал свое собственное решение, поскольку, похоже, в 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 (). Также проверьте, использует ли ваш провайдер одни и те же порты.

Запустите этот скрипт с f.e. sudo /home/user/vpn.sh.

Если вы хотите загрузить его при загрузке (iptables обычно сбрасывается после повторной загрузки), добавьте в свой файл /etc/rc.local f.e. как bash /home/user/vpn.sh.


Следующая часть - это автосоединение VPN и amp; монитор. Вот мое собственное приспособление для этого:

#!/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 priviledge). Вот пример, как запустить его в терминале:

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

... и вот как он выглядит в терминале:

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

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

5
ответ дан 9 August 2018 в 01:24

У меня была такая же потребность, и я разработал свое собственное решение, поскольку, похоже, в 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 (). Также проверьте, использует ли ваш провайдер одни и те же порты.

Запустите этот скрипт с f.e. sudo /home/user/vpn.sh.

Если вы хотите загрузить его при загрузке (iptables обычно сбрасывается после повторной загрузки), добавьте в свой файл /etc/rc.local f.e. как bash /home/user/vpn.sh.


Следующая часть - это автосоединение VPN и amp; монитор. Вот мое собственное приспособление для этого:

#!/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 priviledge). Вот пример, как запустить его в терминале:

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

... и вот как он выглядит в терминале:

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

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

5
ответ дан 14 August 2018 в 19:33

Другие вопросы по тегам:

Похожие вопросы: