UDP VPN 在端口扫描时毫无响应?原因在此
WireGuard 与加固过的 OpenVPN 会直接丢弃未通过认证的数据报而不作回应。扫描器看到的沉默是预期行为,而不是端口关闭。
你扫描 VPN 端口,收不到任何回应,于是断定服务已停或防火墙已关闭。对 WireGuard 以及自带认证的 OpenVPN 控制通道来说,这个结论并不成立。未携带有效认证材料的数据报会被直接丢弃而不回应,因此沉默恰恰是健康服务从外部看来的样子。 错的是探测本身,而不是隧道。
沉默就是协议本身,而不是故障
UDP 没有连接建立过程,因此既没有 SYN,也没有任何确认能让扫描器区分开放端口与被过滤的端口。探测以单个数据报的形式到达,服务会检查它是否符合自己预期的协议。不符合时,数据包被丢弃,而丢弃是文档化的行为,并非故障。
WireGuard 会以密码学方式校验自己的握手消息,并忽略一切校验失败的内容。 OpenVPN 使用 tls-auth 或 tls-crypt 时,对其控制通道也是如此。两种情况下,任意载荷都不会进入面向用户的环节,因此既没有可回应的内容,也没有可返回的错误。
如果是 TCP,关闭的端口至少会给你一个重置。UDP 留下的是模糊性,扫描器只好打印开放或过滤,而不是去猜。
扫描器能得出与不能得出的结论
扫描结果的信息量,只等于它所发送载荷的信息量。请按每种观察实际能支撑什么来排序:
| Probe | Observed result | What it supports |
|---|---|---|
| Empty datagram | No reply | Nothing beyond the fact that UDP was used |
| Random payload | No reply | Consistent with an authenticated service |
| Valid handshake from a real client | A protocol reply | The service is alive and reachable |
| ICMP port unreachable | Unreachable message | The host answered, usually because nothing listens |
把第三行读作清单中唯一一项肯定性测试。它需要真实配置、真实密钥和正确的端点,而这恰恰是通用扫描器没有的。
看路径的两端
对于你自己管理的服务器,先在内核接口上抓包,再下任何结论,然后询问服务它到底看到了什么。两条命令都需要网关上的 root 权限:
tcpdump -ni any udp port 51820
tcpdump -ni any udp port 1194
wg show
如果接口上根本没有出现数据包,说明路径在服务看到之前就已将其丢弃,下一站就该检查路由与过滤。如果数据包到达但握手始终完不成,说明服务可达,问题出在密钥、端点配置或协议版本上。这个对比才能回答扫描器回答不了的问题。要在真实客户端尝试连接时运行,而不是在扫描器自我重复时运行。
要改的是测试,而不是防护
诱人的捷径是关掉控制通道的防护,好让诊断得到回应。那是拿真实的安全属性去换一个更好看的扫描结果,方向错了。正确做法是使用来自受批准网络的有效配置,并记下端点与时间,让对比可以重复。
最有用的测试是差分测试:同一份配置分别放在能通的路径和不通的路径上。如果通的那条能完成握手,而不通的那条在接口上什么都没有,你就在不削弱任何东西的前提下定位了断点。
因此,一个没有回应的 UDP 数据包既不能证明服务器离线,也不能证明它安全。它只能证明:这次探测,在这条路径上,在这一刻,没有被接受。