在带有 的桌面上使用 VPN 连接(在本例中为 Wireguard)时NetworkManager
,当系统在休眠或暂停后重新上线时,VPN 连接不会恢复。 (请注意,OpenVPN 和其他 VPN 协议也会受到影响)。
有一个功能可以启用自动连接,但这适用于永久 VPN 隧道;这里的要求是在暂停/休眠后重新连接任何活动隧道。
我们如何在睡眠或休眠操作后自动恢复现有 VPN 连接?
答案1
WireGuard 和 Openvpn 的答案是不同的。也就是说,因为 NetworkManager 将 Openvpn 实现为 NetworkManager VPN 插件,而 WireGuard 则由守护进程直接(本机)实现。
NetworkManager 有两种自动连接配置文件的机制。一种是connection.autoconnect
设置,一种是connection.secondaries
在主配置文件激活时激活辅助配置文件的位置。目前,本机类型(如 WireGuard、以太网和 Wi-Fi)仅支持connection.autoconnet
,而 VPN 插件目前仅实现作为辅助启动。造成这种差异的原因是它缺少一个功能。
当系统进入睡眠状态时,NetworkManager 首先断开设备连接。从睡眠状态返回时,它会开始自动连接合适的配置文件和设备。
从这个问题来看,尚不清楚为什么这两种机制不起作用。您是否相应地配置了配置文件以自动连接?简历上会发生什么?与往常一样,当您想准确了解守护程序的功能时,请启用调试日志记录并检查日志。
如果提供的自动化功能不适合您,您还可以编写脚本来激活配置文件。但这似乎没有必要(没有首先了解它为什么不能自动工作)。
答案2
Wireguard 是无状态的,VPN 连接应该在睡眠/休眠操作后保持,但在桌面实现上,因为 NetworkManager 在睡眠/休眠时与所有内容断开连接,所以我们失去了 Wireguard 的无状态功能,这里是自定义 bash 脚本设置要恢复此功能,此设置还可以与其他 VPN 系统(例如 OpenVPN)一起使用,这在 KDE 上下文中进行了解释,但可以在其他桌面环境中轻松使用:
睡眠/休眠后恢复 VPN 连接(如果使用过)
特征:
- 显示当前ip
- WAN ip 更改时发出警告
- 如果在睡觉前使用过VPN,请重新连接VPN
设置:
- 首先在 KDE 下我使用小部件命令输出并将小部件设置为每 15 秒运行一次“sh Ip.Vpn.Watcher.sh”(这将监视并通知 IP 更改、显示当前 IP 并将当前使用的网络保存到
/tmp/used-conn
) suspend-vpn
Systemd 配置为在 sleep/hibernate:添加后运行脚本/usr/lib/systemd/system-sleep/
suspend-vpn
扳机Wait.Network.And.Restore.VPN.sh
就是这样 :)
**Ip.Vpn.Watcher.sh**
#!/bin/bash
wget -q http://internet.adress.that.return.myip.in.text/ip.php -O /tmp/ip --force-clobber
ip=$( cat /tmp/ip )
wantedip=$( cat /tmp/ip-old )
if [[ $ip = $wantedip ]]
then
echo $ip
nmcli --fields name connection show --active | tail -n +2 | head -n 1 > /tmp/used-conn
else
if [[ $ip != "" ]]
then
echo $ip
zenity --warning --title="VPN Watcher" --width=250 --text="\nWARNING : Wan IP Changed !"
nmcli --fields name connection show --active | tail -n +2 | head -n 1 > /tmp/used-conn
cp -f /tmp/ip /tmp/ip-old
else
echo $ip
zenity --warning --title="VPN Watcher" --width=250 --text="\nWARNING : Wan Connection Gone !"
cp -f /tmp/ip /tmp/ip-old
fi
fi
**suspend-vpn**
#!/bin/bash
# $1 values ('pre' or 'post')
# $2 values ('suspend', 'hibernate', or 'hybrid-sleep')
# case "$1/$2" in
case $1 in
pre)
# Save connection state
# Too late for this network is already gone...
# Implemented via check ip (plasmoid)
# nmcli --fields name connection show --active | tail -n +2 | head -n 1 > /tmp/used-conn
;;
post)
# Restore connection
su username -c "export DISPLAY=:0; export XDG_RUNTIME_DIR='/run/user/2000'; /scripts/location/Wait.Network.And.Restore.VPN.sh &"
;;
esac
**Wait.Network.And.Restore.VPN.sh**
#!/bin/bash
timer=1
conn=$( cat /tmp/used-conn )
printf "%s" "Waiting For Online State ..."
while ! ping -c 1 -n -w 1 8.8.8.8 &> /dev/null
do
printf "%c" "."
sleep 1
let "timer++"
if [[ ( $timer -ge 300 ) ]] ; then
printf "\n%s\n" "Script Timeout"
exit
fi
done
printf "\n%s\n" "Network Is Online"
if [[ $conn == VPNCONNECTIONAME* ]] || [[ $conn == VPNCONNECTIONAME2* ]]
then
# Need to wait network to be up
sleep 5
nmcli connection up $conn
fi