OpenVpn 服务端配置账号密码登录

创建日志记录文件

当前目录下创建文件 password.log 和 服务端的ovpn 配置文件同级目录

创建验证账号密码脚本

当前目录下创建文件 password.bat 和 服务端的ovpn 配置文件同级目录

@echo off
setlocal enabledelayedexpansion

rem 设置日志文件的名称和路径,这里将日志文件命名为 openvpn_auth_log.txt,可根据实际需求修改路径
set "log_file=password.log"

rem 获取当前时间,用于在日志文件中记录操作的时间戳,格式化为比较易读的形式
for /f "tokens=1-4 delims=/:. " %%a in ("%date% %time%") do (
    set "year=%%d"
    set "month=%%a"
    set "year=!year:~-2!"
    set "day=%%b"
    set "hour=%%c"
)
set "timestamp=%year%-%month%-%day% %hour%:%minute%:%second%"

rem 这里假设你将用户信息存储在一个文本文件中,格式为每行 "用户名 密码",例如 "user1 pass1",根据实际情况替换下面的路径
set "user_file_path=password.txt"

rem 从环境变量中获取用户名和密码,OpenVPN会通过环境变量来传递这些信息,并记录到日志文件中
set "username=%username%"
set "password=%password%"
echo [%timestamp%] 接收到的用户名: %username% >> %log_file%
echo [%timestamp%] 接收到的密码: %password% >> %log_file%

rem 标记是否验证通过,初始设为0(未通过)
set "is_valid=0"

rem 检查用户信息文件是否存在
if not exist "%user_file_path%" (
    echo 存储用户信息的文件不存在,无法验证,请检查路径配置。
    echo [%timestamp%] 存储用户信息的文件不存在,无法验证,请检查路径配置。 >> %log_file%
    exit /b 1
)

rem 开始逐行读取用户信息文件,查找匹配的用户名和密码,同时记录比对过程的相关日志
echo [%timestamp%] 开始读取用户信息文件 "%user_file_path%" 进行用户名和密码比对... >> %log_file%
for /f "tokens=1,2 delims= " %%a in (%user_file_path%) do (
    echo [%timestamp%] 当前正在比对用户信息文件中的记录:用户名="%%a",密码="%%b" >> %log_file%
    if "%%a"=="%username%" (
        echo [%timestamp%] 找到匹配的用户名,开始比对密码... >> %log_file%
        if "%%b"=="%password%" (
            set "is_valid=1"
            echo [%timestamp%] 密码比对成功,账号密码验证通过。 >> %log_file%
            goto :success
        ) else (
            echo [%timestamp%] 密码比对失败,与传入密码不一致。 >> %log_file%
        )
    ) else (
        echo [%timestamp%] 用户名与传入的用户名不匹配,继续查找... >> %log_file%
    )
)

:success
if "%is_valid%"=="1" (
    echo 账号密码验证通过。
    echo [%timestamp%] 账号密码验证通过。 >> %log_file%
    exit /b 0
) else {
    echo 账号密码验证失败,请检查用户名和密码是否正确。
    echo [%timestamp%] 账号密码验证失败,请检查用户名和密码是否正确。 >> %log_file%
    exit /b 1
}

endlocal

创建账号密码存储文件

当前目录下创建文件 password.txt 和 服务端的ovpn 配置文件同级目录

zhangsan password@123
lisi password@456

每行一个账号, 前面是账号名称 空格分开 后面是账号密码

服务端ovpn配置文件追加配置

# 新加此行,开启密码验证脚本 执行password.bat  via-env 参数传入已环境变量的形式传入 
auth-user-pass-verify password.bat via-env
# 加上client-cert-not-required代表只使用用户密码方式验证登录,不加则代表需要证书和用户名密码双重验证登录
# client-cert-not-required
# 新加此行,使用客户提供的UserName作为Common Name
# username-as-common-name
# 该指令提供对OpenVPN使用外部程序和脚本的策略级别的控制。较低的 水平 值更具限制性,较高的值更宽松。级别设置 
# 0- 完全不调用外部程序。
# 1- (默认)仅调用内置可执行文件,例如ifconfig,ip,route或netsh。
# 2- 允许调用内置的可执行文件和用户定义的脚本。
# 3- 允许通过环境变量将密码传递给脚本(可能不安全)。
# 特别注意如果没有这个配置项会导致服务端校验密码时无法获取到密码,导致校验失败
script-security 3

验证密码的多种方式

#读取环境变量验证密码  %username% %password%
#使用python 
auth-user-pass-verify "python auth.py" via-env
#使用nodejs
auth-user-pass-verify "node auth.js" via-env
#使用java
auth-user-pass-verify "java auth.java" via-env
#使用C++ Go Rust 等二进制语言
auth-user-pass-verify "auth.exe" via-env

其他校验方式

除了配置 via-env 也有其他的校验方式

不写 via-env 默认读取输入流,第一次读取 username 第二次读取 password

网上搜索相关 openvpn auth-user-pass-verify 验证方式有那些验证方式

客户端配置文件ovpn追加配置

# 开启校验账号密码
auth-user-pass

参考文章

Open Vpn使用账号密码认证方式登陆
在windows下实现open***的user/pass及证书验证
配置openVPN使用用户名密码认证