답변:
같은 설정을했고 "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 구성의 표준 인 것으로 가정 합니다.
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
table을 설정해야합니다 servers=()
. 즐겨 사용하는 VPN 서버의 IP를 지정하십시오.
또한 스크립트 시작 부분의 다른 변수가 올바르게 설정되어 있는지 확인하십시오. 그렇지 않으면 전체 연결이 차단됩니다.
다음을 사용하여 iptables를 백업하십시오.
sudo iptables-save > working.iptables.rules
(으로 복원 sudo iptables-restore < working.iptables.rules
)
TCP 및 UDP 연결을 지원하며, 그 중 하나만 필요한 경우 for ()
루프 에서 원하지 않는 두 줄을 제거하십시오 . 공급자가 동일한 포트를 사용하고 있는지 확인하십시오. 다를 수 있습니다.
fe로이 스크립트를 실행하십시오 sudo /home/user/vpn.sh
.
부팅시로드하려면 (일반적으로 재부팅 후 iptables가 재설정 됨) /etc/rc.local
파일과 같이 파일에 추가하십시오 bash /home/user/vpn.sh
.
다음 부분은 VPN 자동 커넥터 및 모니터입니다. 이것에 대한 내 자신의 contraption은 다음과 같습니다.
#!/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 권한이 필요하지 않음). 터미널에서 시작하는 방법은 다음과 같습니다.
mate-terminal --command="/home/user/vpn-reconnect.sh"
... 그리고 터미널에서 실행되는 모습은 다음과 같습니다.
... 그리고 VPN 연결이 끊어진 후 누수 방지 핑이 어떻게 나타나는지 보여줍니다.
즐겨 :)
/etc/rc.local
않습니까?
UFW로 간단한 VPN 킬 스위치를 설정할 수있었습니다. 그것은 내가 가진 모든 VPN과 함께 작동합니다.
내 ufw 설정은 다음과 같습니다.
sudo ufw default deny outgoing
sudo ufw default deny incoming`
sudo ufw allow out 443/tcp
sudo ufw allow out 1194/udp
sudo ufw allow out on tun0 from any to any port 80
sudo ufw allow out on tun0 from any to any port 53
sudo ufw allow out on tun0 from any to any port 67
sudo ufw allow out on tun0 from any to any port 68
나를 위해 잘 작동합니다 :)
sudo ufw allow out 443/tcp
VPN이 연결되어 있지 않으면 안전한 웹 사이트 유출이 허용됩니다. 그만하고 싶지 않아? AJAX 또는 WebSocket을 사용하는 HTTPS 사이트는 아마도 JavaScript 타이머를 통해 백그라운드에서 자체적으로 다시 연결될 수 있습니다.
나가는 모든 트래픽을 차단하도록 Ufw를 설정 한 다음 개별 IP 주소를 참조하여 모든 VPN 노드를 허용 목록에 추가하여이 문제를 해결했습니다. 내 생각에 VPN을 사용하면 DNS 조회를 사용하여 다양한 IP 주소를 얻을 수 있습니다.
이 작업을 수행하기 위해 ufw-vpn 이라는 PHP 프로그램을 작성했습니다 . 나는 그것을 몇 년 동안 사용해 왔으며, 시간이 지남에 따라 다양한 작은 개선이 이루어졌습니다. 물론 PHP가 설치되어 있어야하며, Git을 다운로드하지 않고 복제하려면 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 주소를 업데이트하므로 일치하도록 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에 속하지 않은 것은 삭제하므로 규칙을 실행하기 전에 확인해야합니다. 따라서 일부 사용자 지정 규칙이 있으면 실행하기 전에 제거해야합니다.
리포지토리에서 더 많은 문서를 사용할 수 있으며 모두 오픈 소스이므로 보안 문제에 대한 코드를 확인할 수 있습니다. 버그 리포트 및 기능 제안은 매우 환영합니다.
ARGV
시작하여'tun0'
갑자기'tun1'
예고없이 변경되었습니다 . 따라서이 첫 번째 (쓸모없는) 값 변경에도 불구하고 킬 스위치가 작동하도록하려면 테스트를if ARGV.last == 'vpn-down'