两种设计都叫 VPN,但解决的问题不同。站点到站点隧道连接两台网关,因此其后的每台主机无需安装任何软件即可访问对端获准的地址。远程访问隧道把单台设备接入网络,一次一个客户端。这个比较很重要,因为多数部署错误都来自配置了其中一种却期待另一种的行为,而症状通常是隧道确实到达了的服务出现超时。

两种设计,两条边界

Site-to-siteRemote access
Endpointstwo gatewaysa gateway and each client
Who configuresnetwork ownerseach user or an MDM
Scope of reachwhatever the gateways routewhatever the client is granted
Broadcast discoverynot carriednot carried

两种设计都不扩展 LAN 广播域。远端设备不会出现在本地发现列表中,期待它们出现是第一个应当放弃的假设。你有意发布的私有 DNS 名称比任何发现协议都更可预测,而且更换厂商后依然有效。

一个站点用 10.10.0.0/24,另一个站点用 10.20.0.0/24。网关 A 需要一条路由或流量选择器,把 10.20.0.0/24 前缀送入隧道;网关 B 需要它的镜像。随后两侧主机使用普通 IP 连通性,永远不知道隧道存在。这种不可见正是特性,也是故障看起来像普通网络错误而不是隧道错误的原因。

基于策略和基于路由不是同一条隧道

在基于策略的 IPsec 部署中,协商出的流量选择器精确定义了哪些源与目的对受到保护。如果某台网关后出现新子网而没有任何选择器覆盖它,隧道仍保持运行,新子网就是不会被承载。在基于路由的设计中,由接口接收流量、由路由表作出决定,这使得添加前缀成为路由变更,而不是重新协商隧道。

StrongSwan 直接展示两种视图,把它们一起读,才能判断你实际部署的是哪种模型。

swanctl --list-sas
ip xfrm policy
ip -4 route show table all | grep -E '10\.(10|20)\.'

缺少你所需前缀的选择器列表无需任何抓包就能解释故障,而指向错误接口的路由则解释了回程的镜像故障。重新协商任何东西之前,先把两者都读一遍,因为密钥更新不会添加你从未配置过的选择器。

在隧道之前规划地址

地址重叠是配置无法修复的设计错误。如果两个站点都用 192.168.1.0/24,需要 192.168.1.50 的主机就有两个候选,却无法选择。隧道会完成认证,安全关联会建立,而路由决定依然是错误或含糊的。

从三种诚实选项里选一个:给一个站点重新编号,在网关上转换重叠区间好让两侧看到不同前缀,或者放弃这些主机的直连路由、改用其他方式发布服务。每种都有代价,而在两年尺度上第一种通常最便宜。要在隧道存在之前决定,因为事后改动会触及每台持有旧地址的设备。

MTU 问题也要尽早解决。隧道会减少可用载荷,依赖分片的方案与在网关上钳制 MSS 的方案行为不同。

转发与策略位于隧道之外

网关必须愿意在隧道接口与 LAN 接口之间转发数据包,两个方向都需要允许该服务的策略。在 Linux 上这是两个独立设置,此外还有决定被转发的流是否被允许的防火墙规则。

sysctl -w net.ipv4.ip_forward=1
iptables -A FORWARD -s 10.20.0.0/24 -d 10.10.0.0/24 -j ACCEPT
iptables -A FORWARD -s 10.10.0.0/24 -d 10.20.0.0/24 -j ACCEPT

接收端主机还加了一层:它自己的防火墙仍须接受来自远端子网的客户端。只允许本地 /24 的文件服务器会拒绝来自 10.20.0.7 的转发流量,无论隧道看起来多健康,而这种拒绝很容易被误读为路由故障。

从主机测试,而不是从网关

由网关自身发出的 ping 可能走与转发用户流量不同的源地址和不同策略。这使它成为弱测试,偶尔还会误导:应用失败时它成功,或应用正常时它失败。

ip route get 10.10.0.5 from 10.20.0.7
ping -I 10.20.0.7 10.10.0.5
curl -sv --max-time 5 http://files.10-10.internal/ -o /dev/null

使用真实主机、真实源地址和应用真正使用的协议。然后单独读回程路径,因为前向可用但没有返回路由时,产生的超时看起来与被阻塞的服务完全一样。

按你要回答的问题选择设计:你是在连接网络,还是在接纳设备?其余一切,包括配置哪家厂商,都由这个答案推出。

相关文章