Привет я ищу VPN, Контролируют/Уничтожают приложение Переключателя, которое гарантирует, что мое соединение VPN всегда соединяется. Если мое отбрасывание защищенного соединения, приложение отбросит приложения, которые оно контролирует для предотвращения утечки данных. Я знаю, что существуют такие приложения для Windows. Однако я должен все же найти подходящую альтернативу для Linux.
у меня была такая же установка, и "VPN-убийства коммутаторов" оказалось сложнее, чем можно было подумать.
Следуя вашей спецификации, которая гласит "убивать определенные приложения при падении VPN", есть простое решение.
На Ubuntu, сетевой монитор имеет обратные вызовы для сетевых событий, так что вы можете написать скрипт, чтобы убить приложения, которые вам нужны. Пример следующий:
Редактируйте /etc/NetworkManager/dispatcher.d/50vpndownkillapps.rb
:
#!/usr/bin/env ruby
if ARGV == [ 'tun0', 'vpn-down' ]
`pkill -f transmission`
`pkill -f deluge`
end
Сделайте его исполняемым: chmod 755 /etc/NetworkManager/dispatcher.d/50vpndownkillapps.rb
, и наслаждайтесь :-)
Этот скрипт находится в Ruby (поэтому ему нужен рубин), но его можно тривиально преобразовать в скрипт оболочки.
Он также предполагает, что VPN-адаптер имеет tun0
, что является стандартом для конфигураций OpenVPN.
Мне удалось настроить простой переключатель отключения VPN с помощью UFW. Он работает со всеми имеющимися у меня VPN.
Вот мои настройки ufw:
sudo ufw default deny outgoing
sudo ufw default deny incoming`
sudo ufw allow out 443/tcp
sudo ufw allow out 1194/udp
sudo ufw allow out on tun0 from any to any port 80
sudo ufw allow out on tun0 from any to any port 53
sudo ufw allow out on tun0 from any to any port 67
sudo ufw allow out on tun0 from any to any port 68
У меня отлично работает :)
Я решил эту проблему, настроив Ufw для блокировки всего исходящего трафика, а затем добавив в белый список все VPN. узлы, ссылаясь на их индивидуальные IP-адреса. Это не так обременительно, как кажется: по моему опыту, виртуальные частные сети позволяют использовать поиск в 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 поддерживает его, вы можете использовать полностью определенный домен, чтобы получить список серверов для региона (вам нужно будет найти его в документации вашего провайдера или, возможно, в его службе поддержки Department):
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. Так что, если у вас есть какие-то особые правила, их необходимо удалить перед запуском.
В репозитории доступны дополнительные документы, и все они с открытым исходным кодом, так что вы можете проверить код на наличие проблем с безопасностью. Мы приветствуем отчеты об ошибках и предложения по функциям.
У меня была такая же потребность, и я разработал собственное решение, поскольку, похоже, в 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
Он поддерживает TCP и UDP соединения, если вам нужно только одно из них, удалите ненужные две строки из for ()
петля. Также проверьте, использует ли ваш провайдер те же порты - могут быть разные.
Запустите этот скрипт с f.e. sudo /home/user/vpn.sh[11111529 visible.[1229 visible] Если вы хотите загрузить его при загрузке (iptables обычно сбрасывается после перезагрузки), добавьте в свой
/etc/rc.local
файл fe строка вроде bash /home/user/vpn.sh[11111533 impression.[1230 sizes Следующая часть - это автоматический соединитель и монитор VPN. Вот мое собственное приспособление для этого:
#!/bin/bash
# CONNECTIONS
# Those values can be checked by running `nmcli con show`
vpn=(
85e60352-9e93-4be4-8b80-f6aae28d3c94
)
# NUMBER OF CONNECTIONS
total=${#vpn[@]}
# SLEEP
amount=10 # number of seconds to wait after each connection checking cycle
countdown=true # enable/disable animated countdown
skip=1 # how many seconds to substract between each animated countdown iteration
# LOGS
dir='/home/user/logs-vpn' # directory for storing logs
name='vpn' # prefix/name for a log file
seperate=true # create a seperate log file for each init session or log to single file
init=false # log init event (with logging setup)
start=false # log vpn start event
yes=false # log connected events
no=false # log disconnected events
# STYLE
clean='\e[1A\033[K' # clean & move to previous line
default='\e[0m' # default
blink='\e[5m' # blinking (works only in couple terminals, e.g. XTerm or tty)
dim='\e[2m' # dim/half-bright
disconnected='\e[91m' # light red
connected='\e[92m' # light green
count='\e[94m' # light blue
reconnecting='\e[96m' # light cyan
initializing='\e[93m' # light yellow
connection='\e[1m\e[91m' # bold light red
# SETUP
time=$(date +"%Y-%m-%d_%H-%M-%S")
if $separate; then
file="$dir/$time.log"
else
file="$dir/$name.log"
fi
# RESET
reset # reset screen
tput civis -- invisible # disable cursor
# RE-TIME
time=$(date +"%Y.%m.%d %H:%M:%S")
# INITIALIZATION
if $init; then
printf "$time INIT" >> $file
if $yes; then
printf " -y" >> $file
fi
if $no; then
printf " -n" >> $file
fi
printf "\n" >> $file
fi
# START CONNECTION
con=$(nmcli con show --active | grep " vpn")
if [[ $con == '' ]]; then
if $start; then
printf "$time START\n" >> $file
fi
time=$(date +"%H:%M:%S")
echo -e "${dim}[$time]${default} ${initializing}INITIALIZING...${default}"
echo ""
echo ""
random=$(((RANDOM % $total)-1))
try=${vpn[$random]}
(sleep 1s && nmcli con up uuid $try) >& /dev/null
sleep 10s
fi
# LOOP
while [ "true" ]; do
time=$(date +"%H:%M:%S")
# CLEAN AFTER COUNTDOWN
if $countdown; then
echo -en $clean
echo -en $clean
fi
# CHECK CONNECTION
con=$(nmcli con show --active | grep " vpn" | cut -f1 -d " ")
if [[ $con == '' ]]; then
if $no; then
printf "$time NO\n" >> $file
fi
echo -e "${dim}[$time]${default} ${disconnected}DISCONNECTED !!${default}"
echo -e "${blink}${reconnecting}re-connecting ...${default}"
random=$(((RANDOM % $total)-1))
try=${vpn[$random]}
(sleep 1s && nmcli con up uuid $try) >& /dev/null
else
if $yes; then
printf "$time YES\n" >> $file
fi
arr=(${con//./ })
echo -en $clean
echo -e "${dim}[$time]${default} ${connected}CONNECTED${default} (${connection}${arr[0]^^}${default})"
fi
# SLEEP
if $countdown; then
echo -e "${count}$amount${default}"
for (( c=$amount; c>=1; c=c-$skip )); do
echo -en $clean
echo -e "${count}$c${default}"
sleep $skip
done
echo -e "${count}0${default}"
else
sleep $amount
fi
done
Оно автоматически подключается при запуске и отслеживает ваше соединение с заданным интервалом ( amount = 10
дает интервал 10 секунд) и повторно подключается при потере соединения. Есть функция ведения журнала и некоторые другие параметры.
Проверьте UUID ваших подключений с помощью nmcli con show
и добавьте свои избранные (соответствующие IP-адресам, добавленным в брандмауэр) в таблицу vpn = ()
. Каждый раз он будет случайным образом выбирать соединение, указанное в этой таблице.
Вы можете добавить его в свой авто-start (не требует sudo priviledge). Вот пример того, как запустить его в терминале:
mate-terminal --command="/home/user/vpn-reconnect.sh"
... и вот как он выглядит в терминале:
... а вот как выглядит защищенный от утечек эхо-запрос после разрыва вашего VPN-соединения:
Наслаждайтесь :)