Networking

如何設置網路管理器以在睡眠/休眠後恢復 VPN 連接?

  • July 6, 2020

在帶有 的桌面上使用 VPN 連接(在本例中為 Wireguard)時NetworkManager,當系統在休眠或暫停後重新聯機時,不會恢復 VPN 連接。(請注意,OpenVPN 和其他 VPN 協議也會受到影響)。

有一個啟用自動連接的功能,但這意味著永久的 VPN 隧道;這裡的要求是在暫停/休眠後重新連接任何活動隧道。

我們如何在睡眠或休眠操作後自動恢復現有 VPN 連接?

Wireguard 是無狀態的,VPN 連接是在睡眠/休眠操作後保持的,但在桌面實現中,由於 NetworkManager 與睡眠/休眠的所有內容斷開連接,我們就失去了 Wireguard 的無狀態功能,這是一個自定義 bash 腳本設置要恢復此功能,此設置還可以與 OpenVPN 等其他 VPN 系統一起使用,這在 KDE 上下文中進行了解釋,但可以在其他桌面環境中輕鬆使用:

睡眠/休眠後恢復 VPN 連接(如果已使用)

特徵:

  • 顯示目前ip
  • 警告 wan ip 更改
  • 如果在睡眠前使用過 VPN,請重新連接

設置:

  1. 首先在 KDE 下,我使用小元件命令輸出並將小元件設置為每 15 秒執行一次“sh Ip.Vpn.Watcher.sh”(這將監視並通知 IP 更改,顯示目前 IP 並將目前使用的網路保存到/tmp/used-conn
  2. Systemd 配置為在 sleep/hibernate:suspend-vpn添加到後執行腳本/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

WireGuard 和 Openvpn 的答案是不同的。也就是說,因為 NetworkManager 將 Openvpn 實現為 NetworkManager VPN 外掛,而 WireGuard 是由守護程序直接(本機)實現的。

NetworkManager 有兩種機制來自動連接配置文件。一種是connection.autoconnect設置,一種是connection.secondaries在啟動主要配置文件時啟動次要配置文件的位置。目前,原生類型(如 WireGuard、Ethernet 和 Wi-Fi)僅支持connection.autoconnet,而 VPN 外掛目前僅實現作為輔助啟動。這種差異的原因是它是一個缺失的功能。

當系統進入睡眠狀態時,NetworkManager 首先斷開設備。從睡眠中返回時,它開始自動連接合適的配置文件和設備。

從這個問題來看,尚不清楚為什麼這兩種機制不能正常工作。您是否相應地配置了配置文件以自動連接?簡歷上會發生什麼?與往常一樣,當您想準確了解守護程序的作用時,請啟用調試日誌記錄並檢查日誌。

如果提供的自動化不適合您,您還可以編寫腳本來啟動配置文件。但這似乎沒有必要(沒有首先了解它為什麼不能自動工作)。

引用自:https://unix.stackexchange.com/questions/594275