如何設置網路管理器以在睡眠/休眠後恢復 VPN 連接?
在帶有 的桌面上使用 VPN 連接(在本例中為 Wireguard)時
NetworkManager
,當系統在休眠或暫停後重新聯機時,不會恢復 VPN 連接。(請注意,OpenVPN 和其他 VPN 協議也會受到影響)。有一個啟用自動連接的功能,但這意味著永久的 VPN 隧道;這裡的要求是在暫停/休眠後重新連接任何活動隧道。
我們如何在睡眠或休眠操作後自動恢復現有 VPN 連接?
Wireguard 是無狀態的,VPN 連接是在睡眠/休眠操作後保持的,但在桌面實現中,由於 NetworkManager 與睡眠/休眠的所有內容斷開連接,我們就失去了 Wireguard 的無狀態功能,這是一個自定義 bash 腳本設置要恢復此功能,此設置還可以與 OpenVPN 等其他 VPN 系統一起使用,這在 KDE 上下文中進行了解釋,但可以在其他桌面環境中輕鬆使用:
睡眠/休眠後恢復 VPN 連接(如果已使用)
特徵:
- 顯示目前ip
- 警告 wan ip 更改
- 如果在睡眠前使用過 VPN,請重新連接
設置:
- 首先在 KDE 下,我使用小元件命令輸出並將小元件設置為每 15 秒執行一次“sh Ip.Vpn.Watcher.sh”(這將監視並通知 IP 更改,顯示目前 IP 並將目前使用的網路保存到
/tmp/used-conn
)- Systemd 配置為在 sleep/hibernate:
suspend-vpn
添加到後執行腳本/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
WireGuard 和 Openvpn 的答案是不同的。也就是說,因為 NetworkManager 將 Openvpn 實現為 NetworkManager VPN 外掛,而 WireGuard 是由守護程序直接(本機)實現的。
NetworkManager 有兩種機制來自動連接配置文件。一種是
connection.autoconnect
設置,一種是connection.secondaries
在啟動主要配置文件時啟動次要配置文件的位置。目前,原生類型(如 WireGuard、Ethernet 和 Wi-Fi)僅支持connection.autoconnet
,而 VPN 外掛目前僅實現作為輔助啟動。這種差異的原因是它是一個缺失的功能。當系統進入睡眠狀態時,NetworkManager 首先斷開設備。從睡眠中返回時,它開始自動連接合適的配置文件和設備。
從這個問題來看,尚不清楚為什麼這兩種機制不能正常工作。您是否相應地配置了配置文件以自動連接?簡歷上會發生什麼?與往常一樣,當您想準確了解守護程序的作用時,請啟用調試日誌記錄並檢查日誌。
如果提供的自動化不適合您,您還可以編寫腳本來啟動配置文件。但這似乎沒有必要(沒有首先了解它為什麼不能自動工作)。