远程用户需要访问物理 LAN 上的打印机和文件服务器,而唯一常开的 Linux 机器是一台 VirtualBox 虚拟机。把该虚拟机桥接到那个 LAN 是前半部分。后半部分是一条每个 LAN 设备都会真正使用的回程路由,而这正是大多数配置遗漏的地方。缺少它时,隧道能连上,客户端能 ping 通网关,其他什么都不响应。

使用可达的地址

把虚拟机的 LAN 网卡设为该网络获批的 Bridged Adapter 连接方式,并通过正常的分配流程给它一个地址。这样虚拟机就像任何其他主机一样出现在物理 LAN 上。它的默认路由仍必须使用真实网关,以便到 VPN 对端的加密传输保持可达。不要把 VirtualBox 默认的 NAT 地址当作 LAN 的下一跳,因为该地址位于虚拟 NAT 之后,对宿主机或 LAN 上的其他机器都不是 on-link。

LAN router:          192.168.70.1/24
VirtualBox host:     192.168.70.5/24
VPN gateway VM:      192.168.70.10/24
Example LAN service: 192.168.70.40
VPN client pool:     10.80.0.0/24

在选择地址池之前,检查是否与远程用户的家庭网络重叠。重叠会变成路由歧义,任何服务器配置都无法修复。

通告 LAN,然后转发

对于认证和传输都已受管的服务器,网络配置行是这样的。push 告诉接受连接的客户端如何到达 LAN,它本身并不会让虚拟机转发任何东西。

dev tun
topology subnet
server 10.80.0.0 255.255.255.0
push "route 192.168.70.0 255.255.255.0"

在虚拟机的持久网络配置中启用 IPv4 转发,并允许客户端地址池在虚拟机的转发边界处访问目标 LAN 服务。访问 VPN 监听端的许可是一条单独的规则,隧道起来后它已经在工作。

回程路由属于 LAN 路由器

LAN 设备通过其默认网关回包,也就是 192.168.70.1 上的 LAN 路由器。除非告诉它,该路由器并不知道 10.80.0.0/24 在哪里。把地址池路由加入路由器支持的持久配置,指向虚拟机的 LAN 地址。只在 VirtualBox 宿主机上添加,只能修复那些查询该宿主机的路径,而 LAN 上并非每台设备都这样。

ip route add 10.80.0.0/24 via 192.168.70.10

目标自身的防火墙仍必须允许客户端地址池作为源。路由只负责承载数据包,它并不授予服务。

如果无法修改 LAN 路由器,替代方案是在虚拟机上做限定范围的源地址转换。它让回包无需该路由即可返回,同时向 LAN 服务隐藏各个客户端地址。

端到端跟踪一个数据包

10.80.0.25 上的客户端通过隧道发往 192.168.70.40。虚拟机把数据包转发到 LAN。服务向它的路由器回包,路由器为客户端地址池选择虚拟机,虚拟机再通过 OpenVPN 把数据包送回。那句话里的每一跳都是设计可能失败的地方。

用真实应用从远程客户端测试,然后在虚拟机和路由器上重新加载受管配置后再重复一次。

如果客户端能到达虚拟机却到不了服务,先检查路由器的路由。如果服务收到了请求,而客户端始终看不到回包,回程路径就是可疑对象。

相关文章