ฉันมีความต้องการแบบเดียวกันนี้และฉันได้พัฒนาโซลูชันของตัวเองเนื่องจากดูเหมือนว่าจะไม่มีเครื่องมือเฉพาะสำหรับสิ่งนี้บน 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 ()
ลูป ตรวจสอบด้วยว่าผู้ให้บริการของคุณใช้พอร์ตเดียวกัน - อาจแตกต่างกัน
เรียกใช้สคริปต์นี้กับ sudo /home/user/vpn.sh
fe
หากคุณต้องการที่จะโหลดในการบูต (iptables มักจะตั้งค่าใหม่อีกครั้งหลังจากบูต), เพิ่มที่คุณ/etc/rc.local
ไฟล์บรรทัด fe bash /home/user/vpn.sh
เช่น
ส่วนถัดไปคือตัวเชื่อมต่อและตรวจสอบ VPN อัตโนมัติ นี่คือการคุมกำเนิดของฉันสำหรับสิ่งนี้:
#!/bin/bash
# CONNECTIONS
# Those values can be checked by running `nmcli con show`
vpn=(
85e60352-9e93-4be4-8b80-f6aae28d3c94
)
# NUMBER OF CONNECTIONS
total=${#vpn[@]}
# SLEEP
amount=10 # number of seconds to wait after each connection checking cycle
countdown=true # enable/disable animated countdown
skip=1 # how many seconds to substract between each animated countdown iteration
# LOGS
dir='/home/user/logs-vpn' # directory for storing logs
name='vpn' # prefix/name for a log file
seperate=true # create a seperate log file for each init session or log to single file
init=false # log init event (with logging setup)
start=false # log vpn start event
yes=false # log connected events
no=false # log disconnected events
# STYLE
clean='\e[1A\033[K' # clean & move to previous line
default='\e[0m' # default
blink='\e[5m' # blinking (works only in couple terminals, e.g. XTerm or tty)
dim='\e[2m' # dim/half-bright
disconnected='\e[91m' # light red
connected='\e[92m' # light green
count='\e[94m' # light blue
reconnecting='\e[96m' # light cyan
initializing='\e[93m' # light yellow
connection='\e[1m\e[91m' # bold light red
# SETUP
time=$(date +"%Y-%m-%d_%H-%M-%S")
if $separate; then
file="$dir/$time.log"
else
file="$dir/$name.log"
fi
# RESET
reset # reset screen
tput civis -- invisible # disable cursor
# RE-TIME
time=$(date +"%Y.%m.%d %H:%M:%S")
# INITIALIZATION
if $init; then
printf "$time INIT" >> $file
if $yes; then
printf " -y" >> $file
fi
if $no; then
printf " -n" >> $file
fi
printf "\n" >> $file
fi
# START CONNECTION
con=$(nmcli con show --active | grep " vpn")
if [[ $con == '' ]]; then
if $start; then
printf "$time START\n" >> $file
fi
time=$(date +"%H:%M:%S")
echo -e "${dim}[$time]${default} ${initializing}INITIALIZING...${default}"
echo ""
echo ""
random=$(((RANDOM % $total)-1))
try=${vpn[$random]}
(sleep 1s && nmcli con up uuid $try) >& /dev/null
sleep 10s
fi
# LOOP
while [ "true" ]; do
time=$(date +"%H:%M:%S")
# CLEAN AFTER COUNTDOWN
if $countdown; then
echo -en $clean
echo -en $clean
fi
# CHECK CONNECTION
con=$(nmcli con show --active | grep " vpn" | cut -f1 -d " ")
if [[ $con == '' ]]; then
if $no; then
printf "$time NO\n" >> $file
fi
echo -e "${dim}[$time]${default} ${disconnected}DISCONNECTED !!${default}"
echo -e "${blink}${reconnecting}re-connecting ...${default}"
random=$(((RANDOM % $total)-1))
try=${vpn[$random]}
(sleep 1s && nmcli con up uuid $try) >& /dev/null
else
if $yes; then
printf "$time YES\n" >> $file
fi
arr=(${con//./ })
echo -en $clean
echo -e "${dim}[$time]${default} ${connected}CONNECTED${default} (${connection}${arr[0]^^}${default})"
fi
# SLEEP
if $countdown; then
echo -e "${count}$amount${default}"
for (( c=$amount; c>=1; c=c-$skip )); do
echo -en $clean
echo -e "${count}$c${default}"
sleep $skip
done
echo -e "${count}0${default}"
else
sleep $amount
fi
done
มันจะเชื่อมต่ออัตโนมัติเมื่อเริ่มต้นและตรวจสอบการเชื่อมต่อของคุณด้วยช่วงเวลาที่กำหนด ( amount=10
ให้ช่วงเวลา 10 วินาที) และเชื่อมต่ออีกครั้งเมื่อการเชื่อมต่อขาดหายไป เตรียมพร้อมคุณสมบัติการบันทึกและตัวเลือกอื่น ๆ
ตรวจสอบการเชื่อมต่อของคุณ UUID ใช้nmcli con show
และเพิ่มรายการโปรดของคุณ (จับคู่กับ IP ที่เพิ่มเข้ากับไฟร์วอลล์) ลงในvpn=()
ตาราง ทุกครั้งที่มีการสุ่มเลือกการเชื่อมต่อที่ระบุในตารางนี้
คุณสามารถเพิ่มลงในการเริ่มอัตโนมัติของคุณ (ไม่ต้องใช้สิทธิ์ sudo) นี่คือตัวอย่างวิธีการเริ่มต้นใน terminal:
mate-terminal --command="/home/user/vpn-reconnect.sh"
... และนี่คือลักษณะที่ปรากฏในเทอร์มินัล:
... และนี่คือลักษณะการ ping ที่ป้องกันการรั่วเหมือนหลังจากการเชื่อมต่อ VPN ของคุณลดลง:
สนุก :)
ARGV
เริ่มต้นด้วย'tun0'
เวลานานและเปลี่ยนเป็น'tun1'
โดยไม่ต้องแจ้งให้ทราบล่วงหน้า ดังนั้นเพื่อให้สวิตช์ฆ่าทำงานแม้ว่าค่าการเปลี่ยนแปลงครั้งแรก (ไร้ประโยชน์) นี้ฉันต้องเปลี่ยนการทดสอบเป็นif ARGV.last == 'vpn-down'