连上办公 VPN,在 8443 端口启动一个小服务,把隧道地址发给同事,然后看着连接失败,而客户端仍然报告已连接。隧道里没有任何东西是坏的:地址已经下发,会话已经建立,本该承载回包的报文只是从未被放行。按顺序做完下面三项检查,并在失败的那一项停下,因为每项的修法都不同,而且只有一项与 VPN 有关。

先看套接字究竟绑定在哪里

在任何东西被路由之前,必须有进程在调用方能够到达的地址上监听。开发服务器是常见的元凶,因为它们大多默认绑定到 loopback,只接受来自同一台机器的连接。隧道地址并不会改变这个绑定,操作系统会在 VPN 介入之前就拒绝连接。

ss -ltnp | grep 8443
netstat -ano | findstr 8443

读本地地址这一列,而不是看状态。127.0.0.1:8443 表示只监听 loopback,修法是绑定到 0.0.0.0 或隧道地址本身。0.0.0.0:8443 会在所有接口上接受连接,当这台机器还有公网地址时,这比多数人想要的更宽;10.64.7.15:8443 是只有同事能到达的地方才监听的窄版本。还要注意同一份输出里的进程名,因为上一次测试残留的实例常会让端口看起来是开的,却用错误的内容作答。

然后问一下,有没有东西能路由到这个地址

隧道地址只对配置了把该前缀送进隧道的对端有意义。同事的机器有自己的路由表,如果没有通往隧道子网的路由,报文就会走默认网关,并死在完全不知道这个地址存在的地方。这是调用方的路由问题,不是你这一侧的许可问题。

Symptom from the callerWhat it usually meansWhere to look next
Connection refused immediatelyNothing is listening on the address the packet reachedThe bind address and the process owning the port
Connection times out with no replyA policy dropped the packet, or no route returnsServer forwarding, host firewall, cloud security group
Works from the same machine onlyListener is on loopback, or no route reaches the tunnel addressBind address, then the caller's route to that prefix

两台客户端之间的服务器同样重要。常见的远程访问设计里,每个客户端向网关建立出站连接,网关为这些流保留状态,所以回包沿着它已经知道的路径返回。从一个客户端到另一个客户端的连接是一条新流,网关必须接受并转发它;很多部署会故意关掉这一项,让客户端彼此隔离。消费级 VPN 服务通常默认隔离;企业网关有时按组放行。

在改动主机之前先看方向。如果隧道地址能从网关本身应答,却无法从对端应答,差别就在网关的客户端互连设置上,改本机防火墙一点用都没有。

最后,找到放行这条流的策略

在被路由的报文和应答的服务之间隔着三层策略:VPN 服务器的转发决定、主机防火墙,以及实例前面的任何云安全组。三层必须一致,而它们失败的方式各不相同,所以上表里的症状比浏览器里的报错更有用。

主机防火墙是绑定成功后人们最容易忘的一层,因为在 LAN 接口上放行端口的规则,不会自动在隧道接口上放行。按接口限定范围是正确设计,同时也是「办公室能通、家里不通」这类服务的常见原因。要看规则的作用范围,而不是端口号。

有状态过滤解释了相反的情形。从笔记本发出的出站连接会建立状态,回包无需入站规则就能通过。同事的连接是全新的流,后面没有任何状态,因此需要明确放行。正是这种不对称,才使得你本机上正常工作的浏览器会话,对服务能否从外部访问毫无说明力。

一项检查失败时,改设计而不是改隧道

如果需求是让同事打开你本地的服务,诚实的答案通常是专为入站访问设计的机制。反向 SSH 隧道是最小的一种:你的机器向外连接到同事本来就能到达的主机,监听器存在于那台主机上。

ssh -N -R 8443:127.0.0.1:8443 [email protected]

中继需要在 SSH 服务器配置里设置 GatewayPorts clientspecified,否则转发出来的监听器会绑在中继的 loopback 上,同事遇到的仍是同样的拒绝。任何比一个下午更持久的方案,带健康检查和已发布名称证书的负载均衡器或 ingress 是更合适的工具;而当两个网络确实需要互通时,为两个子网都配路由的站点到站点隧道才是正确答案。

这些设计都让暴露变得明确,这才是重点。VPN 只是在你本来就有权限使用的网络之间搬运报文,它不发布服务,也不会把笔记本变成面向互联网的主机。任务在于决定改动三层中的哪一层,而隧道很少是其中之一。

相关文章