笔记本连上了,隧道也起来了,而发往内部服务的请求却卡在建立连接这一步。在服务本身看来,请求来自类似 10.90.0.25 的地址,回复发往默认网关,然后什么也没回来,因为那个网关根本不知道 10.90.0.25 在哪里。从另一端看,同样的故障表现为一台内部主机无法 ping 通已连接的客户端。两者都指向同一个缺失对象:一条通往 VPN 客户端池的返回路由,而只有私有网络才能添加它。

读取服务看到的源地址

这一个字段决定了其余一切。如果内部服务看到的是池地址,说明 Access Server 在做路由而不是隐藏客户端流量,所有回复都必须被路由回池。如果它看到的是服务器自身的私有地址,说明服务器在做 masquerade,返回路径本来就能工作,代价是服务日志和访问规则中完全失去按客户端区分的能力。

改动任何东西之前先对比两端。在服务器上列出隧道的接口及其地址;在客户端上确认它实际持有的是哪个地址;在内部主机上观察一条活动连接。

ip -br addr show
ss -tnp state established '( dport = :443 )'
ip route get 10.90.0.25

最后一条命令正是故障时会失败的那条:它要么报告隧道前缀不可达,要么更糟,直接返回你的默认网关,回复就这样跑到了互联网上。

不要假定只有一个池。一台服务器可能既有动态范围,又有按用户的静态映射,而静态地址可能完全落在动态前缀之外。如果你只路由记得住的那个范围,持有固定地址的用户会一直不通,其他人却报告问题已解决。

在决定回复的地方添加路由

路由应加在内部服务已经在用的网关上,而不是加在服务上——除非服务自己路由自己的流量。指向 Access Server 可达的私有地址,它与客户端持有的隧道地址是不同的值。

ip route add 10.90.0.0/24 via 10.0.1.5
ip route get 10.90.0.25

在云网络中,同样的说法会变成一条路由表条目,其目标是运行该服务器的实例或网络接口,并在该接口上关闭源与目标检查。注意这条条目没有做什么:路由不是访问授权,安全组、网络 ACL 和主机防火墙仍然必须放行流量。

让它持久化,并保持池大小的诚实。两个不连续池需要两条路由,而超出已配置前缀增长的池会悄悄产生回复无处可去的客户端。如果你掌控池的范围,选一个既能一次路由、又能长期不管的汇总。

转发和过滤必须与路由一致

路由只是路径的一半。必须允许服务器在隧道与私有接口之间转发,在 Linux 上这意味着 net.ipv4.ip_forward 外加一条允许该接口对的转发链,而在加固过的主机上通常每个方向都有一条明确的规则。

sysctl net.ipv4.ip_forward
nft list ruleset | grep -A5 forward

有状态过滤解释了一个把人引向错误方向的症状。已建立流中的回复不需要新的入站规则,所以 SYN-ACK 之后卡住的连接并不是被缺失的 accept 规则挡住,而是被丢弃或错误路由了。保留这个区分,它把路由改动和防火墙改动分开。

非对称返回路径是同一问题更安静的形式。如果两条路由都能到达池,而回复走的是与请求进入时不同的接口,严格的逆向路径过滤会丢弃它,于是只有部分客户端失败。

路由还是伪装:有意识地选择

路由模式在服务处保留客户端的池地址,从而能按客户端记录日志和实施策略,代价是每个需要回复客户端的内网都必须有池路由。masquerade 模式则免去这个要求,因为回复会回到服务器,但服务再也分不清客户端之间的差别,也无法主动向某个客户端发起任何连接。

在运行中的服务器上改变这一行为会中断现有会话,所以先用一个客户端和一条流测试。如果切换是正确答案,那是服务器上的配置决定,而不是靠添加日后会变得多余的路线来绕开。

客户端背后的一段子网是另一件事

访问笔记本自身局域网里的设备 与访问笔记本的隧道地址不是一回事。它要求客户端充当子网网关:声明客户端侧网段、在客户端操作系统上开启转发,并在该局域网上有一条回到客户端的路由。为笔记本家里那侧的范围添加一条私有网络路由做不到这一点,而且当两个用户处在同一网段时还会产生冲突。

方向也是策略问题。允许客户端向内部服务发起连接,并不自动允许内部主机向该客户端发起连接。在断定路径不通之前,检查服务器的访问策略和客户端主机防火墙。

用一条流和一次抓包来验证

用一条连接来证明路径,而不是做通用的可达性测试。在两端观察同一条流:请求进入服务,回复离开服务。

tcpdump -ni any host 10.90.0.25 and port 443

修复前,抓包显示回复发往一个不会路由它的网关。修复后,回复发往服务器,流也随之完成。然后确认网关会为第二个客户端地址使用的路由,这样没被覆盖的池现在就会暴露,而不是一周后才发现。

用四项检查收尾:服务处的源地址与预期的模式一致;网关到每个在用池都有路由;转发和过滤放行两个方向;一条真实的流能端到端完成。Access Server 路由常见问题 对已安装版本阐述了同样的原则,其受支持的配置界面可能与旧指南不同。

相关文章