站点到站点 VPN 与远程访问 VPN:两者各自连接什么
一种连接网关,另一种连接设备。比较流量选择器与路由,规划地址,再从真实主机验证转发与策略。
两种设计都叫 VPN,但解决的问题不同。站点到站点隧道连接两台网关,因此其后的每台主机无需安装任何软件即可访问对端获准的地址。远程访问隧道把单台设备接入网络,一次一个客户端。这个比较很重要,因为多数部署错误都来自配置了其中一种却期待另一种的行为,而症状通常是隧道确实到达了的服务出现超时。
两种设计,两条边界
| Site-to-site | Remote access | |
|---|---|---|
| Endpoints | two gateways | a gateway and each client |
| Who configures | network owners | each user or an MDM |
| Scope of reach | whatever the gateways route | whatever the client is granted |
| Broadcast discovery | not carried | not 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
使用真实主机、真实源地址和应用真正使用的协议。然后单独读回程路径,因为前向可用但没有返回路由时,产生的超时看起来与被阻塞的服务完全一样。
按你要回答的问题选择设计:你是在连接网络,还是在接纳设备?其余一切,包括配置哪家厂商,都由这个答案推出。