开启duplicate-cn的OpenVPN服务器为客户端及特定共享证书客户端设置静态IP的方法咨询
开启duplicate-cn的OpenVPN服务器为客户端及特定共享证书客户端设置静态IP的方法咨询
这个问题确实戳中了OpenVPN开启duplicate-cn后的一个痛点——常规的按证书CN绑定静态IP的方法完全失效了,毕竟多个客户端共用同一个证书标识。不过别担心,我们可以通过客户端唯一识别+连接脚本的方式来解决这个问题,下面给你两种实用的方案:
方案一:自定义客户端唯一标识+Client-Connect脚本
这种方法不需要额外的认证体系,靠客户端主动发送一个唯一标识来让服务器识别它:
- 第一步,服务器端先开启脚本支持:在OpenVPN的服务器配置文件(比如
/etc/openvpn/server.conf)里添加一行:
这里的script-security 2 client-connect /etc/openvpn/assign-static-ip.shscript-security 2是允许执行外部脚本的必要配置。 - 第二步,编写分配IP的脚本
/etc/openvpn/assign-static-ip.sh,内容大概是这样:
脚本的核心是读取客户端发送的#!/bin/bash # 根据客户端自定义的唯一ID分配静态IP if [ "$CLIENT_UNIQUE_ID" = "my_specific_client_01" ]; then export ifconfig_pool_remote_ip=10.8.0.50 elif [ "$CLIENT_UNIQUE_ID" = "my_specific_client_02" ]; then export ifconfig_pool_remote_ip=10.8.0.51 fiCLIENT_UNIQUE_ID环境变量,匹配成功就设置对应的静态IP。 - 第三步,给目标客户端配置添加唯一标识:在客户端的
.ovpn配置文件里加一行:setenv CLIENT_UNIQUE_ID my_specific_client_01 - 最后,给脚本加上执行权限:
重启OpenVPN服务后,这个特定客户端连接时就会拿到你指定的静态IP了。chmod +x /etc/openvpn/assign-static-ip.sh
方案二:结合用户名密码认证(更安全)
如果担心自定义标识被冒用,推荐结合用户名密码认证,用唯一用户名来区分共享证书的客户端:
- 第一步,服务器端启用用户名密码验证:在
server.conf里添加:script-security 2 auth-user-pass-verify /etc/openvpn/verify-user.sh via-env client-connect /etc/openvpn/assign-ip-by-user.sh username-as-common-name - 第二步,编写用户验证脚本
verify-user.sh(这里可以简单用一个预设的用户列表,或者对接数据库):#!/bin/bash # 验证用户名密码,示例用硬编码的用户 valid_users=("user1:pass1" "user2:pass2") for user in "${valid_users[@]}"; do if [ "$username:$password" = "$user" ]; then exit 0 fi done exit 1 - 第三步,编写按用户名分配IP的脚本
assign-ip-by-user.sh:#!/bin/bash if [ "$username" = "user1" ]; then export ifconfig_pool_remote_ip=10.8.0.60 elif [ "$username" = "user2" ]; then export ifconfig_pool_remote_ip=10.8.0.61 fi - 第四步,客户端配置里添加用户名密码认证:在
.ovpn里加一行:
这样每个共享证书的客户端需要输入唯一的用户名密码,服务器端根据用户名分配对应的静态IP,安全性更高。auth-user-pass
注意事项
- 确保OpenVPN进程对脚本有读取和执行权限,避免因权限问题导致脚本失效;
- 如果使用自定义环境变量,要确保服务器端没有禁用
setenv相关的配置; - 脚本里的IP要在你OpenVPN服务器的
server或ifconfig-pool指定的网段内,不能冲突。
备注:内容来源于stack exchange,提问作者Youran




