OpenVPN 长时间休眠后无法通过 LAN 唤醒重新连接

OpenVPN 长时间休眠后无法通过 LAN 唤醒重新连接

我父母家里有一台 RaspberryPi,已安装并配置了 PiVPN,为我和几个朋友提供个人 VPN 服务。这款 VPN 从一开始就运行完美,我将其用于我的 PC,从未出现过错误。

我最近在父母家里安装了另一台装有 Windows10 的计算机,用作各种用途的服务器(如果与此问题有关,我会将其用作带有 Plex Media Server 的家庭多媒体服务器,也将其用作个人使用的 Git 存储库)。我需要它自动连接到 VPN,所以我做了以下操作:

  1. 我配置了 PiVPN 以生成相应的 .ovpn 文件,在新服务器计算机上安装了 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. 我将服务器 BIOS 配置为交流电恢复时自动启动(因此如果断电,服务器会再次启动),并且还将其配置为自动登录到我在安装 Win10 时创建的用户。因此,希望服务器在每次开机时都能登录。

  4. 由于我担心父母家的耗电量,我将此服务器配置为在 3 小时不活动后进入睡眠状态(Windows 10 设置),并在凌晨 2 点时始终进入睡眠状态(使用批处理脚本)

  5. 由于自动睡眠功能,我将 BIOS 配置为接受 LAN 唤醒数据包来唤醒服务器。我测试了几次,效果很好。这样,我可以在需要时随时唤醒服务器,持续 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...

我用我的电脑测试了 VPN,它像往常一样运行良好,所以最好的办法是这是服务器的故障。

我个人认为这可能与我编写并编程为在凌晨 2 点运行以使 PC 在凌晨 2 点进入睡眠状态的批处理脚本有关,因为我使用其他睡眠方法(手动睡眠和不活动睡眠)没有遇到任何问题。批处理脚本如下所示:

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

我使用这个脚本是因为我看过一个关于如何为此编写批处理脚本的教程。正如该教程所述,我还运行了以下命令以执行睡眠而不是休眠:

Powercfg -H OFF

可能是什么问题呢?

答案1

我最终解决了这个问题,尽管我的设置中存在两个问题。

首先,“VPN 设置”有一个问题:OpenVPN 服务器(带有 PiVPN 的 RaspberryPi)与服务器机器位于同一子网。

.ovpn 配置文件指向我的个人 DNS,因此服务器计算机为了连接到 RaspberryPi 的 VPN,必须先访问 DNS,然后通过我父母路由器的公共 IP(我已将其链接到我的路由器)访问我的 RaspberryPi。这是一个问题,因为所有 VPN 流量都通过固定的 UDP 端口重定向到 RaspberryPi 的本地 IP,这意味着 RaspberryPi 发送到服务器计算机的响应在到达路由器时,由于重定向的 UDP 端口,它们最终进入 RaspberryPi,因此服务器计算机从未收到回复

我通过打开 .ovpn 文件并修改包含目标 URL 的行来修复此问题,以便从此处连接到 VPN:

remote my.personal.dns {port_number}

对此

remote {local_raspberry_pi_IP} {port_number}

此外,OpenVPN 设置的休眠脚本存在某种缺陷,我不太清楚原因,但我认为这与禁用休眠有关。我下载了微软 PsTools并编写了一个新脚本,让电脑在凌晨 2 点进入睡眠状态。新脚本如下所示C:\{path_where_pstools_was_extracted}\PsTools\psshutdown.exe -d -t 0 -accepteula

经过这些修改,服务器现在终于可以按预期运行了。

答案2

由于您的 Windows PC(服务器)在其他时间都可以连接到 Pi 上的 VPN,因此我并不认为端口重定向(转发?)是导致您出现此问题的原因。此外,您可以使用本地 IP 访问(Pi 上的)VPN 这一事实表明您的路由器可能存在问题。您的公共 IP 地址可能在此期间发生了变化,而您的 DNS 记录并没有更新。

相关内容