如何设置网络管理器在睡眠/休眠后恢复 VPN 连接?

如何设置网络管理器在睡眠/休眠后恢复 VPN 连接?

在带有 的桌面上使用 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

设置:

  1. 首先在 KDE 下我使用小部件命令输出并将小部件设置为每 15 秒运行一次“sh Ip.Vpn.Watcher.sh”(这将监视并通知 IP 更改、显示当前 IP 并将当前使用的网络保存到/tmp/used-conn
  2. suspend-vpnSystemd 配置为在 sleep/hibernate:添加后运行脚本/usr/lib/systemd/system-sleep/
  3. 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

相关内容