在 ipp.txt 里改一行,感觉像是在预约地址,其实不是。这个由 ifconfig-pool-persist 命名的文件记录的是某个通用名称上次用过哪个地址,好让地址池在方便时把同一个地址还回去。文件里的任何内容都不能把下一次连接绑定到那个号码。

按顺序执行下面的检查。每一项要么确认机制,要么让你停下来修复某个输入。

持久化文件是做什么用的

这个文件的存在是为了让地址在重启之间保持稳定,从而让重连更友好、日志更好读。它被当作历史来读取,也被当作历史来写入,而分配路径仍然可以自由选择另一个地址——当提示不合适时:不同的地址池、冲突的分配,或者在地址池满了之后才到达的客户端。这就是为什么手动修改在文件里看起来完美,却不会改变连接。请把它当作过去决策的缓存,而不是策略的来源。

如果你需要为某个特定客户端指定特定地址,有文档记载的机制是 ifconfig-push,它属于拥有该客户端的那份配置。

确认选中的是正确的客户端

显式分配是按客户端的通用名称查找的,所以用错误身份命名的文件根本不会被读取。确认服务器认为该客户端的名称是什么,尤其是在 username-as-common-name 于认证后改变它的时候。然后确认文件名与该值完全一致,包括大小写。

既然看到这里,也考虑一下并发。如果允许 duplicate-cn,多台设备可以呈现同一个身份,而一个固定地址不可能对它们都唯一。请决定这个固定地址是否值得拒绝该身份的并发会话,因为这两个要求无法同时满足。

确认数字与拓扑匹配

参数的含义取决于隧道拓扑,而复制来的示例造成最大损害的地方就在这里。在较旧的 net30 布局中,每个客户端占用一个四地址块,所以 push 提供一对地址。在子网拓扑中,客户端收到一个地址加上地址池的掩码,成对的形式是错的。在写这一行之前,先从正在运行的配置中读出拓扑。

# /etc/openvpn/ccd/partner-a   (subnet topology)
ifconfig-push 10.44.0.61 255.255.255.0

把地址与所有可能占用它的东西逐一核对:另一个显式分配、动态地址池范围,以及任何假定固定主机的静态路由。与地址池重叠的地址会一直工作到地址池把它交给别人为止,而这种失败看起来会像是随机的。

在新连接上验证结果

现有会话会保留已分配的地址,所以唯一有意义的测试是新连接。断开客户端,重新连接,读取它实际收到的地址以及随之而来的路由。如果地址仍然是动态的,说明分配没有生效,下一步是查看配置,而不是再去改历史文件。

把证据放在一起:客户端名称、匹配到的文件、分配的地址,以及它来自哪个地址池。

最后,固定的隧道地址不是设备凭据。它标记的是地址规划中的一个位置,而认证仍然依赖证书和账户。把两者混为一谈,就会把地址冲突变成没有人写下来的安全假设。

相关文章