OpenVPN 客户端认证与固定 IP 方案
OpenVPN 客户端认证与固定 IP 方案

OpenVPN 客户端认证与固定 IP 方案

文档定位:本文档聚焦 OpenVPN 客户端侧的两大核心课题——认证模式选型与固定 IP 分配。服务端基础部署参见部署指南,工业网关设备接入参见私有化方案。


一、认证模式总览

OpenVPN 提供两种主要认证模式,它们在服务端配置、凭证分发和运维复杂度上有本质差异:

维度用户名/密码X.509 证书
服务端指令auth-user-pass-verify + client-cert-not-required默认(无需额外指令)
客户端文件ca.crt(+ 可选的 tls-crypt.keyca.crt + client.crt + client.key
凭证分发告知用户名密码每个设备签发独立证书
吊销机制修改认证脚本/凭据文件CRL 吊销列表或 easyrsa revoke
安全模型密码泄露 = 该用户冒用风险单设备证书泄露 ≠ 影响其他设备
嵌入式设备配置最简单需导入 3 个文件,但免人工记忆密码

决策原则

  • 设备 ≤ 10 台且更换频繁 → 用户名/密码(配 duplicate-cn
  • 设备 > 10 台或生产环境 → 证书认证(推荐)
  • 等保合规 → 必须证书 + CRL

二、方案 A:用户名/密码 + 固定 IP

2.1 机制原理

传统方案下一个用户名代表一个”虚拟身份”,但若服务器未启用 client-config-dir(CCD),所有客户端从同一个 IP 池随机分配地址。启用 CCD 后,OpenVPN 连接建立时自动查找 /etc/openvpn/ccd/ 下与客户端 Common Name 同名的文件,从中读取该客户端的专属配置指令。

Common Name 的来源取决于认证方式:

  • 用户名/密码 + username-as-common-name → CN = 用户名
  • 证书认证 → CN = 证书 Subject 的 CN 字段

2.2 服务端增量配置

在部署指南生成的 server.conf 基础上,确保已包含:

2.3 创建 CCD 条目

2.4 ifconfig-push 参数解释

TUN 模式下的 IP 对 A B

  • A:分配给客户端的 VPN IP(实际使用的地址,如 10.8.0.100
  • B:服务器端虚拟端点地址

⚠️ CCD 分配的 IP 不应落在 server 指令定义的 DHCP 池内(池默认 .2 ~ .253),否则会发生冲突。建议将固定 IP 分配在池的末尾区段(如 .100+),同时在 server.conf 中用 ifconfig-pool 10.8.0.2 10.8.0.99 255.255.255.0 显式限定 DHCP 池范围。

2.5 验证固定 IP

连接后查看 OpenVPN 状态文件:


三、方案 B:X.509 证书 + 固定 IP

3.1 生成客户端身份证书

生成位置:

文件路径
证书 .crtpki/issued/<CN>.crt
私钥 .keypki/private/<CN>.key

3.2 切换为证书认证

从部署指南的 server.conf移除用户名/密码相关行:

关键陷阱:OpenVPN 配置文件中,# 仅在行首时才被视为注释。option # comment 这种行内写法不可靠——client-cert-not-required 可能仍然生效,导致证书认证失败。务必彻底删除该行或确保 # 为行首第一个字符。

重启生效:

3.3 导出客户端证书文件

3.4 CCD 配置(证书模式)

证书模式下 CCD 文件名 = 证书 CN,严格区分大小写:

令 OpenVPN 重新读取配置:

推荐使用证书模式:证书认证下由于 CN 使用设备标识(如序列号),CCD 文件名建立后即固定,不会像用户名方式那样因改密码而变动——这是推荐用于生产环境的关键原因之一。

3.5 证书吊销

当设备退役或私钥泄露时:

重启服务以加载新的 CRL。


四、PC 客户端接入

4.1 用户名/密码模式

client.ovpn(替换 YOUR_SERVER_IP 与 CA 证书内容):

安装 OpenVPN GUI,将 .ovpn 放入 C:\Program Files\OpenVPN\config\,连接时输入凭据。

重要data-ciphersdata-ciphers-fallbackcompress 的值必须与部署指南 §3.1 中的 server.conf 完全一致。若服务端启用了 tls-crypt,需在 <ca> 块后追加 <tls-crypt> 块并粘贴 tls-crypt.key 内容。

4.2 证书模式

remote-cert-tls server 强制验证服务端证书的 EKU 扩展(TLS Web Server Authentication),是防中间人攻击的关键安全选项——证书模式下务必包含。


五、故障排查速查表

现象典型原因解决
AUTH_FAILED用户名/密码不匹配手动执行认证脚本测试:echo -e "sanker\nreknas" | /etc/openvpn/check-password.sh
AUTH_FAILED认证脚本无执行权限chmod +x /etc/openvpn/check-password.sh
certificate required服务端仍配置了 client-cert-not-required检查该行是否彻底删除(行内注释可能仍生效)
固定 IP 不生效未配置 client-config-dirgrep client-config-dir /etc/openvpn/server/server.conf 确认
固定 IP 错乱CCD 文件名与 CN 不匹配openssl x509 -in cert.crt -noout -subject 确认 CN
IP 冲突固定 IP 落在 DHCP 池内ifconfig-pool 显式限定池范围,见 §2.4
TLS Error证书时间校验失败date 对比服务器与客户端系统时间,偏差须 < 5 分钟
TLS Error加密算法不匹配检查客户端 data-ciphers 与服务端是否一致
证书模式下连接无响应客户端未提供证书私钥验证 .ovpn<cert>/<key> 块完整无缺
Options error: --cipher not allowed旧客户端使用了不支持的算法将客户端 cipher 改为 data-ciphers-fallback

参考文献