スリープ/休止状態の後にVPN接続を再開するようにNetwork Managerを設定するにはどうすればよいですか?

スリープ/休止状態の後にVPN接続を再開するようにNetwork Managerを設定するにはどうすればよいですか?

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に再接続してください。

設定:

  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

関連情報