客户端还没连接,两个名字就已经在起作用:笔记本上的文件名(nuc.ovpn)和服务器从凭据中推导出的身份。client-config-dir 查找用的是后者。在客户端改配置文件名,或者给服务器上的文件加上 .conf,都不会改变服务器打开哪个文件。

有用的比较不是「我用了哪个名字」,而是「服务器在套用哪条规则」,因为证书认证与用户名/密码认证可能从同一次登录得出不同的实际名称。

配置文件名与证书通用名

在默认的证书方案下,服务器取 X.509 通用名,并在 client-config-dir 里查找名字完全一致的文件。一个名为 nuc.ovpn、证书却写着 tester 的配置,会被解析成 /etc/openvpn/server/ccd/tester。客户端文件名从不参与计算。不匹配最先就藏在这里。

因此,一个满是精心命名配置的目录可能每次都落空。文件不是按 subject、邮箱地址或界面里显示的名字来匹配的,而是按通用名字符串匹配。

在区分大小写的文件系统上,Tester 和 tester 是两个不同的文件,只会打开其中一个。请核对客户端实际出示的证书里的通用名,而不是笔记里的副本。

username-as-common-name 会翻转规则

当服务器启用用户名/密码认证并带上 username-as-common-name 时,通过认证的用户名会在这次查找中取代证书通用名。

直接比较两种情况:证书身份下,文件跟着证书走,改密码无关紧要;用户名身份下,文件跟着登录名走,重签证书无关紧要。服务器替换了哪个字段,就该按哪个改名。用新 CN 重签的证书会悄悄改变查找目标,而旧的 CCD 文件仍留在磁盘上,看起来一切正常。

混合配置确实存在,大部分困惑就从这里开始。如果一个服务块开启了替换而另一个没有,实际名称取决于哪个实例处理了这次连接。请确认当前生效的配置,而不是假定全局文件适用。上游的服务器选项参考记录了按名查找文件以及可选的回退。

服务器读什么,又默默跳过什么

两个细微差别决定文件是否被选中。第一是额外加上去的扩展名。第二是名字里多出的一个字符。

OpenVPN 不会在查找的名字后追加 .conf,所以 tester.conf 与 tester 并不匹配。隐藏扩展名的编辑器可能留下一个在列表里看着正确、却永远匹配不上的文件。

没有匹配的文件时,服务器可以回退到名为 DEFAULT 的文件。因此收到部分设置并不能证明用的是每客户端文件。请把分配到的地址或推送的路由与该客户端文件本应产生的结果对比。第三个关卡是权限,因为服务器是降权之后才打开文件的;root shell 能读它,什么都证明不了。

文件名正确并不等于内容有效

选中与内容是两个独立的失败点。打开正确的文件之后,其中的指令仍必须对该客户端有效。

ifconfig-push 必须分配拓扑真正能用的地址,而 iroute 只对该客户端身后被路由的子网有意义。

一个身份,多台设备

两台出示同一通用名的笔记本会选中同一个文件,得到相同的客户端专属设置。如果需要各自的地址或各自吊销,就需要各自的身份,而不是同一个文件的两份拷贝。

比较的是共享身份与每设备签发一张证书。共享管理更简单、吊销更粗糙;每设备证书准备成本更高,却给出一个干净的、可以单独禁用的单位。

相关文章