You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

开启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.sh
    
    这里的script-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
    fi
    
    脚本的核心是读取客户端发送的CLIENT_UNIQUE_ID环境变量,匹配成功就设置对应的静态IP。
  • 第三步,给目标客户端配置添加唯一标识:在客户端的.ovpn配置文件里加一行:
    setenv CLIENT_UNIQUE_ID my_specific_client_01
    
  • 最后,给脚本加上执行权限:
    chmod +x /etc/openvpn/assign-static-ip.sh
    
    重启OpenVPN服务后,这个特定客户端连接时就会拿到你指定的静态IP了。

方案二:结合用户名密码认证(更安全)

如果担心自定义标识被冒用,推荐结合用户名密码认证,用唯一用户名来区分共享证书的客户端:

  • 第一步,服务器端启用用户名密码验证:在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里加一行:
    auth-user-pass
    
    这样每个共享证书的客户端需要输入唯一的用户名密码,服务器端根据用户名分配对应的静态IP,安全性更高。

注意事项

  • 确保OpenVPN进程对脚本有读取和执行权限,避免因权限问题导致脚本失效;
  • 如果使用自定义环境变量,要确保服务器端没有禁用setenv相关的配置;
  • 脚本里的IP要在你OpenVPN服务器的serverifconfig-pool指定的网段内,不能冲突。

备注:内容来源于stack exchange,提问作者Youran

火山引擎 最新活动