Wireguard(この場合はWireguard)がインストールされているデスクトップでVPN接続を使用している場合、NetworkManager
システムが休止状態または一時停止後にオンラインに戻ってもVPN接続は再開されません。 (OpenVPNやその他のVPNプロトコルも影響を受けます。)
自動接続を有効にする機能がありますが、これは永続VPNトンネル用です。ここでの要件は、一時停止/休止状態の後にすべてのアクティブトンネルを再接続することです。
スリープまたは休止状態の操作後に既存のVPN接続を自動的に復元するにはどうすればよいですか?
答え1
WireGuardとOpenvpnの答えは異なります。つまり、NetworkManagerはOpenvpnをNetworkManager VPNプラグインとして実装しますが、WireGuardはデーモンによって直接(デフォルトで)実装されるためです。
NetworkManagerには、プロファイルを自動的にリンクする2つのメカニズムがあります。 1つはconnection.autoconnect
設定で、1つはプライマリconnection.secondaries
プロファイルがアクティブになったときにセカンダリプロファイルがアクティブになる場所です。現在、WireGuard、イーサネット、Wi-Fiなどの基本タイプのみがサポートされていますconnection.autoconnet
が、VPNプラグインは現在のサポート実行でのみ実装されています。これらの違いが発生する理由は、機能がないためです。
システムがスリープ状態になると、NetworkManager はまずデバイスの接続を切断します。スリープモードから戻ると、適切なプロファイルとデバイスに自動的に接続し始めます。
この質問では、なぜこれら2つのメカニズムが機能しないのかは明らかではありません。自動的に接続するようにプロファイルを設定しましたか?履歴書には何が起こりますか?いつものように、デーモンが何をしているのかを正確に知りたい場合は、デバッグログを有効にしてログを確認してください。
提供された自動化が適切でない場合は、プロファイルを有効にするスクリプトを作成することもできます。しかし、これは不要に見えます(なぜ自動的に機能しないのかを最初に理解していないまま)。
答え2
Wireguardはステートレスであり、スリープ/休止状態操作後にVPN接続を維持する必要がありますが、デスクトップの実装では、NetworkManagerがスリープ/休止状態からすべての接続を切断するため、Wireguardのステートレス機能は失われます。これには、復元する自動bashスクリプト定義設定があります。この機能は、OpenVPN などの他の VPN システムでも使用できます。これは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