OpenVPN は長時間のスリープ後に Wake-on-LAN で再接続できません

OpenVPN は長時間のスリープ後に Wake-on-LAN で再接続できません

実家には RaspberryPi があり、PiVPN をセットアップして、私と数人の友人に個人用 VPN サービスを提供するために構成しています。この VPN は最初から問題なく動作しており、PC で使用していますが、エラーは一度も発生していません。

最近、実家に Windows10 を搭載した別のコンピューターを設置し、さまざまな目的でサーバーとして動作させました (この問題に関係する場合、Plex Media Server を備えたホーム マルチメディア サーバーとして、また個人使用の Git リポジトリとしても使用しています)。VPN に自動的に接続する必要があるため、次の操作を実行しました。

  1. 私は、対応する .ovpn ファイルを生成するように PiVPN を設定し、新しいサーバー マシンに OpenVPN GUI クライアントをインストールして、ovpn ファイルをインポートしました。実際のところ、VPN へのすべての接続に常に同じ IP を使用するように、静的 IP を設定しました。
  2. OpenVPNをサーバーの起動時に自動的に接続するように設定しました。このフォルダにOpenVPN GUIへの直接リンクを配置することでこれを実現しましたC:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp。その直接リンクには次の引数がありました。"C:\Program Files\OpenVPN\bin\openvpn-gui.exe" --connect ServerW10.ovpn
  3. AC が復旧すると自動的に起動するようにサーバー BIOS を構成しました (そのため、停電してもサーバーは再起動します)。また、Win10 のインストール時に作成したユーザーに自動的にログインするように構成しました。これにより、サーバーは電源がオンになると常にログイン状態になります。

  4. 実家の電力消費が心配なので、このサーバーを3時間操作がないとスリープするように(Windows 10の設定)、午前2時になると常にスリープするように(バッチスクリプトを使用)設定しました。

  5. 自動スリープ機能のため、Wake-on-LAN パケットを受け入れてサーバーを起動するように BIOS を構成しました。これを数回テストしたところ、うまく機能しました。この方法で、3 時間 (私の目的には十分) 必要なときにいつでもサーバーを起動できました。

  6. 私は数日かけてサーバーをテストしました。手動でスリープ状態にしたり、3時間操作がない状態でスリープ状態にしたり、強制的にシャットダウンしたりしましたが、OpenVPN は常に正常に動作し、問題なく再接続されました。

問題は、「午前 2 時のスリープ」後にサーバーへの VPN 接続をテストしたときに発生しました。サーバーを起動し、通常どおり静的 VPN IP で ping を実行しようとしましたが、接続できませんでした。TeamViewer からログインして何が起こっているかを確認したところ、OpenVPN の GUI を開くと、次のようなループに陥っていることがわかりました。

Thu Mar 01 10:26:28 2018 OpenVPN 2.4.4 x86_64-w64-mingw32 [SSL (OpenSSL)] [LZO] [LZ4] [PKCS11] [AEAD] built on Sep 26 2017
Thu Mar 01 10:26:28 2018 Windows version 6.2 (Windows 8 or greater) 64bit
Thu Mar 01 10:26:28 2018 library versions: OpenSSL 1.0.2l  25 May 2017, LZO 2.10
Thu Mar 01 10:26:29 2018 WARNING: this configuration may cache passwords in memory -- use the auth-nocache option to prevent this
Thu Mar 01 10:26:29 2018 TCP/UDP: Preserving recently used remote address: [AF_INET](my ip):(my port)
Thu Mar 01 10:26:29 2018 UDP link local: (not bound)
Thu Mar 01 10:26:29 2018 UDP link remote: [AF_INET](my ip):(my port)
Thu Mar 01 10:27:29 2018 TLS Error: TLS key negotiation failed to occur within 60 seconds (check your network connectivity)
Thu Mar 01 10:27:29 2018 TLS Error: TLS handshake failed

Thu Mar 01 10:27:29 2018 SIGUSR1[soft,tls-error] received, process restarting
Thu Mar 01 10:27:34 2018 TCP/UDP: Preserving recently used remote address: [AF_INET](my ip):(my port)
Thu Mar 01 10:27:34 2018 UDP link local: (not bound)
Thu Mar 01 10:27:34 2018 UDP link remote: [AF_INET](my ip):(my port)
Thu Mar 01 10:28:34 2018 TLS Error: TLS key negotiation failed to occur within 60 seconds (check your network connectivity)
Thu Mar 01 10:28:34 2018 TLS Error: TLS handshake failed
etc...

自分の PC で VPN をテストしたところ、いつもどおり問題なく動作したので、サーバーのせいである可能性が最も高いです。

個人的には、他のスリープ方法 (手動スリープと非アクティブ スリープ) では問題がなかったため、午前 2 時に PC をスリープ状態にするために作成してプログラムしたバッチ スクリプトと関係があるのではないかと考えています。バッチ スクリプトは次のようになります。

rundll32.exe powrprof.dll,SetSuspendState 0,1,0

このスクリプトを使用したのは、このためのバッチ スクリプトを実行する方法に関するチュートリアルを見たからです。そのチュートリアルで述べられているように、休止状態ではなくスリープを実行するために次のコマンドも実行しました。

Powercfg -H OFF

何が問題なのでしょうか?

答え1

セットアップに 2 つの問題がありましたが、最終的には修正できました。

まず、「VPN セットアップ」には 1 つの問題がありました。OpenVPN サーバー (PiVPN を搭載した RaspberryPi) がサーバー マシンと同じサブネットにありました。

.ovpn 構成ファイルは私の個人 DNS を指していたため、サーバーマシンは RaspberryPi の VPN に接続するために、DNS にアクセスし、次に両親のルーターのパブリック IP (ルーターにリンクしていた) を介して RaspberryPi にアクセスする必要がありました。これは、VPN トラフィックがすべて固定 UDP ポートを介して RaspberryPi のローカル IP にリダイレクトされるため問題となります。つまり、RaspberryPi がサーバーマシンに送信した応答は、ルーターに到着すると、リダイレクトされた UDP ポートにより RaspberryPi に届き、サーバーマシンは返事が来なかった

私は、.ovpn ファイルを開いて、VPN に接続するための宛先 URL を含む行を次のように変更することでこれを修正しました。

remote my.personal.dns {port_number}

これに

remote {local_raspberry_pi_IP} {port_number}

また、スリープスクリプトはOpenVPNの設定で何らかのバグがありました。理由はよく分かりませんが、休止状態を無効にすることと関係があると思います。ダウンロードしましたマイクロソフト PsToolsそして、午前2時にPCをスリープ状態にする新しいスクリプトを作成しました。新しいスクリプトは次のようになりますC:\{path_where_pstools_was_extracted}\PsTools\psshutdown.exe -d -t 0 -accepteula

これらの変更により、サーバーは最終的に期待どおりに動作するようになりました。

答え2

Windows PC (サーバー) は他のすべての時間に Pi の VPN に接続できたため、ポート リダイレクト (転送?) がここでの問題の原因であるとは考えられません。また、ローカル IP を使用して (Pi の) VPN にアクセスできるという事実は、ルーターに問題がある可能性があることを示しています。その間にパブリック IP アドレスが変更され、DNS レコードが更新されなかった可能性があります。

関連情報