商业上网出口 VPN 只隐藏你的地址,并不会把你连到自己的家。要访问家庭网络里的 NAS 或打印机,需要一台位于该网络的网关,以及一个向它建立隧道的客户端。随后数据包必须通过五项检查,而 其中任何一项失败,从外面看都一样。

关卡 1:客户端必须选中隧道

检查目标前缀在客户端上是否真的路由进了隧道。只推送 VPN 自身子网的分流隧道配置,会把 192.168.x.x 直接从本地接口发出去,那里哪也到不了。要看客户端的路由表,而不是配置文件的名称。

这是手机客户端最常见的问题,它们往往默认只发送 DNS 或只发送一个前缀。路由缺失时,握手可能完美,设备却仍然不可达。

继续之前,先确认客户端地址池和家庭子网没有重叠。

关卡 2:网关必须转发

VPN 终止在一台主机上,它必须把解密后的数据包转发到 LAN。这需要开启 IP 转发,并有一条防火墙策略允许流量从 VPN 接口进入 LAN 接口。路由器设备通常内置这些;在运行 strongSwan 或 WireGuard 的 Linux 机器上,这是人们常忘的两项设置。测试服务之前两项都要检查,因为任何一项单独出错都会造成同样的超时。

在 LAN 接口上抓包测试,因为从未出现在那里的数据包,要么被丢弃,要么根本没被转发。

这与服务拒绝连接是两种不同的故障,分清这一点能省下大量时间。把放行范围收窄,限定到具体服务和 VPN 地址池,而不是整个子网。

关卡 3:回程路径决定一切

目标会向它看到的源地址回包,那要么是客户端地址池,要么是网关,取决于你是否做地址转换。如果目标的默认网关是家里的路由器,而那台路由器没有到 VPN 地址池的路由,回包就会从互联网出去然后消失。这就是典型的单向连接。

有两种正当做法:在 LAN 网关上为地址池添加路由,或在 VPN 网关上做源 NAT,让目标始终只看到网关地址。后者更简单,但会丢失原始源身份。

有意识地选一种并写下来,因为防火墙规则和日志都依赖它。strongSwan 转发指南 讲解了这一决定的 Linux 一侧。

关卡 4:名称与前缀重叠

本地发现名称不会跨越路由边界,所以在家里以友好名称出现的设备,通过隧道可能看不见。为私有区域提供 DNS,或者把地址记录下来。无论用什么名称,都必须解析成远程客户端能够路由的东西。这就是为什么设备可以按地址访问、按名称却看不见。

前缀重叠是另一个陷阱:如果客户端地址池是 192.168.1.0/24,家庭网络也是,客户端就会把目标当成局域网内地址,永远不送进隧道。

重新规划一侧的编号,或者使用家里绝不会遇到的地址段。

关卡 5:从家外测试

在厨房里测试证明不了什么,因为流量可能根本没离开 LAN。从手机热点或另一个网络连进来,然后按顺序走一遍关卡:客户端路由、LAN 接口抓包、服务响应、回包抓包和名称解析。第一道拿不出证据的关卡,就是问题所在。

如果服务有响应而名称没有,那是 DNS 问题,不是隧道问题。

把可用的配置连同地址池、路由和 NAT 选择记在笔记里,因为下次换路由器会把这三点全部重置。

相关文章