我这里用的最新的版本open***-install-2.4.8-I602-Win10,有些参数在老版本上是没有的。
下面先给出服务器端的配置文件server.ovpn,配置文件实现客户端固定IP和用户名密码验证。
port 443
proto udp
dev tun
ca ca.crt
cert server.crt
key server.key
dh dh2048.pem
tls-auth ta.key 0
script-security 2
auth-user-pass-verify author.bat via-file
#client-cert-not-required
verify-client-cert
username-as-common-name
server 10.8.0.0 255.255.255.0
push "route 192.168.1.0 255.255.255.0"
client-to-client
keepalive 10 120
cipher AES-256-CBC
comp-lzo
persist-key
persist-tun
status openvpn-status.log
log-append openvpn.log
verb 3
ifconfig-pool-persist ipp.txt
;client-connect
client-config-dir "C:\\Program Files\\OpenVPN\\ccd"
route 10.9.0.0 255.255.255.252
用户明密码验证需要下面两个参数:
script-security 2 #新版本中必须有这个参数,否则不会调用外部脚本;老版本可以不要,这个在很多的配置文件中都没有
auth-user-pass-verify author.bat via-file #这里面的author.bat用来进行身份验证的脚本,后面via-file表示是通过临时文件来存储用户提交的用户名及密码;
指定IP地址用到的两个参数:
client-config-dir "C:\\Program Files\\OpenVPN\\ccd" #通过指定ccd文件夹下的文件来获取客户端的IP,文件名与生成的客户端 认证文件名相同,不带后缀,我生成的client.key ,这里的文件名为client ,文件内容: ifconfig-push 10.9.0.1 10.9.0.2 则用 client客户端的地址为10.9.0.1
route 10.9.0.0 255.255.255.252
下面是客户端的配置文件:client.ovpn
-
client
;dev tap
dev tun;proto tcp
proto udpremote 117.*.*.* 443 #服务器端的IP地址或网址+端口号
resolv-retry infinite
nobind
# Downgrade privileges after initialization (non-Windows only)
;user nobody
;group nobodyauth-user-pass
# Try to preserve some state across restarts.
persist-key
persist-tun
ca ca.crt
cert client.crt
key client.key
remote-cert-tls servertls-auth ta.key 1
cipher AES-256-CBC
comp-lzo
verb 3
其中的auth-user-pass 说明向服务器发送用户名及密码来进行认证。
下面是进行身份验证的脚本author.bat,放到服务器端,为了方便起见,这里放到了与配置文件一个目录下面,你也可以放到任意的地方,只需修改服务器配置文件server.ovpn中的相应参数即可。
- @echo off
- rem get username and password from temp file as %1
- set v=1
- for /f %%i in (%1) do (
- if !v!==1 (
- set user=%%i
- set v=2
- )else set pass=%%i
- )
- rem check username and password with password.txt file
- for /f "tokens=1,2,3 delims=, " %%i in (password.txt) do if %%i==%user% if %%j==%pass% if %%k==1 exit /B 0
- echo 1
批处理文件中的第3行到第9行是用来读取临时文件中存储的客户机提交上来的用户名及密码,文件名做为一个参数传入到批处理文件里来,因此在for 语句中用了%1来获取文件名,临时文件中第一行是客户提交用户名,第二行密码,文件在脚本结束后自动删除;另外在循环里面要修改参数v的值,为此需要cmd即命令行使用延时加载(具体内容可以参见前面的文章:批处理问题:SET 命令在 FOR 循环中失效 / SET 环境变量生存域/作用域),延时加载可以用 cmd /v:on来启动,也可在注册表做以下设定来启动:
在机器上和/或用户登录会话上启用或停用 CMD.EXE 所有调用的延迟扩展,这要通过设置使用 REGEDT.EXE 的注册表中的一个或两个 REG_DWORD 值,如果没有可以新建:
HKEY_LOCAL_MACHINE/Software/Microsoft/Command Processor/DelayedExpansion
和/或
HKEY_CURRENT_USER/Software/Microsoft/Command Processor/DelayedExpansion
值为0x1(启用延时加载) 或 0x0(不启用延时加载)
批处理的13到15行是通过读取服务器上用户名及密码的文件password.txt,来查找是否有与客户机相匹配的用户,如果有就返回0,如果没有就返回1。
passowrd.txt文件内容如下:
- client, password, 1
- a1,123,0
第一个是用户名,第二个是密码,第三个是帐户是否启用(1为启用,0为禁用);每个参数之间用,(逗号)分开;
完成以上工作后,就可以启动服务器了,然后再启动客户端了。