長時間睡眠後,OpenVPN 無法通過 LAN 喚醒重新連接
我父母家裡有一個樹莓派,它設置並配置了 PiVPN,為我和幾個朋友提供個人 VPN 服務。這個VPN從一開始就完美無缺,我在我的電腦上使用過它,從來沒有出錯。
我最近在我父母家安裝了另一台裝有 Windows10 的電腦,作為用於各種目的的伺服器(如果它與此問題有關,我將它用作帶有 Plex 媒體伺服器的家庭多媒體伺服器,也用作 Git 儲存庫供個人使用)。我需要它自動連接到 VPN,所以我做了以下操作:
- 我將 PiVPN 配置為生成對應的 .ovpn 文件,在新伺服器機器上安裝 OpenVPN GUI 客戶端並導入 ovpn 文件。事實上,我為我的 VPN 的所有連接配置了靜態 IP,因為我希望它們始終具有相同的 IP。
- 我將 OpenVPN 配置為在伺服器啟動時自動連接。我通過在此文件夾中放置 OpenVPN GUI 的直接連結來實現這一點
C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp
,並且該直接連結具有此參數"C:\Program Files\OpenVPN\bin\openvpn-gui.exe" --connect ServerW10.ovpn
- 我將伺服器 BIOS 配置為在 AC 恢復時自動啟動(因此如果斷電,伺服器會再次啟動),我還將其配置為自動登錄到我在安裝 Win10 時創建的使用者。因此,有了這個,希望伺服器在開機時總是登錄。
- 由於我擔心父母家的電力消耗,我將此伺服器配置為在閒置 3 小時後進入睡眠狀態(Windows 10 設置),並在到達凌晨 2 點時始終進入睡眠狀態(使用批處理腳本)
- 由於自動睡眠的東西,我將 BIOS 配置為接受 LAN 喚醒數據包以喚醒伺服器。我對此進行了多次測試,效果很好。這樣我就可以在需要 3 小時的時候喚醒伺服器(對於我的目的來說足夠了)。
- 我花了幾天時間測試伺服器:手動讓它進入睡眠狀態,讓它在 3 小時不活動後進入睡眠狀態,強制關閉等等,OpenVPN 總是執行良好並且重新連接沒有問題。
現在,當我在“2AM sleep”之後測試與伺服器的 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 在凌晨 2 點進入睡眠的批處理腳本有關,因為我對其他睡眠方法(手動睡眠和非活動睡眠)沒有任何問題。批處理腳本如下所示:
rundll32.exe powrprof.dll,SetSuspendState 0,1,0
我使用了這個腳本,因為我看到了一個關於如何為此執行批處理腳本的教程。正如該教程中所說,我還執行了以下命令以進行睡眠而不是休眠:
Powercfg -H OFF
可能是什麼問題呢?
我終於修復了它,儘管我的設置中有兩個問題。
首先,“VPN 設置”有一個問題:OpenVPN 伺服器(帶有 PiVPN 的 RaspberryPi)與伺服器機器位於同一子網中。
.ovpn 配置文件指向我的個人 DNS,因此伺服器機器為了連接到 RaspberryPi 的 VPN,必須先到達 DNS,然後通過我父母路由器的公共 IP(我已與我的路由器連結)到達我的 RaspberryPi . 這是一個問題,因為所有 VPN 流量都通過固定的 UDP 埠重定向到 RaspberryPi 的本地 IP,這意味著 RaspberryPi 發送到伺服器機器的響應,當它們到達路由器時,它們最終在 RaspberryPi 中到重定向的 UDP 埠,因此伺服器機器從未收到響應。
我修復了打開 .ovpn 文件並修改包含目標 URL 的行以從這裡連接到 VPN:
remote my.personal.dns {port_number}
對此
remote {local_raspberry_pi_IP} {port_number}
此外,睡眠腳本在某種程度上與 OpenVPN 設置有關,我不太確定為什麼,但我認為它與禁用休眠有關。我下載了Microsoft PsTools並製作了一個新腳本,讓電腦在凌晨 2 點進入睡眠狀態。新腳本如下所示
C:\{path_where_pstools_was_extracted}\PsTools\psshutdown.exe -d -t 0 -accepteula
通過這些修改,伺服器現在終於可以按預期工作了。