我正在尝试调试 OpenVPN 客户端运行时令人难以置信的 DNS 故障。虽然我可以 ping 8.8.8.8,但运行时dig +trace example.com @8.8.8.8
我得到的是回复connection timed out; no servers could be reached
。奇怪的是,当我捕获和检查网络数据包时,计算机的任何网络接口上都没有出现端口 53 数据包。(当 OpenVPN 连接时,其他数据包在数据包转储中显示正常,当 OpenVPN 未连接时也会出现端口 53 数据包。)
通过数据包捕获,我将问题缩小到 OpenVPN 客户端运行时端口 53 数据包完全消失。具体来说:
- 当 OpenVPN 客户端运行时,如果我执行
echo hi | nc -u 1.2.3.4 53
或echo hi | nc 1.2.3.4 53
,则数据包跟踪中不会出现 UDP 或 TCP 端口 53 数据包, - 如果我将数据包发送到不同的端口,数据包会正常显示在数据包跟踪中,
echo hi | nc -u 1.2.3.4 52
例如echo hi | nc 1.2.3.4 52
, - 如果 OpenVPN 客户端未运行,则数据包将正常出现在数据包跟踪中。
通过跟踪 CygWin数控(netcat)系统调用,我进一步将失败原因缩小到创建套接字时出现的 WSAEACCES(10013)错误。
23 21665 [主要] nc 2406 cygwin_socket: 3 = 套接字(2, 1 (标志 0x0), 6) 204 21869 [main] nc 2406 __set_errno:void __set_winsock_errno(const char*,int):200 设置 errno 1 24 21893 [主要] nc 2406 __set_winsock_errno:连接:810 - winsock 错误 10013 -> errno 1
这是“权限被拒绝”错误,记录如下所示:“尝试以访问权限所禁止的方式访问套接字。例如,使用广播地址进行 sendto 操作,而未使用 setsockopt(SO_BROADCAST) 设置广播权限。”
OpenVPN 运行于轻敲在 Windows 10 计算机上使用默认 1194 端口的模式。Windows Defender 防火墙和 Windows Defender 防病毒软件暂时关闭,以排除它们是罪魁祸首。出于同样的原因,特定计算机上当前没有运行其他防火墙或防病毒软件。完全相同的 OpenVPN 配置在 Debian GNU/Linux 计算机上运行良好。
答案1
该问题是由–block-outside-dns
OpenVPN 客户端选项引起的。根据OpenVPN 文档该选项可阻止任何应用程序访问 TCP 或 UDP 端口 53,隧道内的应用程序除外,通过 Windows 过滤平台 (WFP)。