我這裡用的最新的版本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 udp
remote 117.*.*.* 443 #伺服器端的IP位址或網址+端口号
resolv-retry infinite
nobind
# Downgrade privileges after initialization (non-Windows only)
;user nobody
;group nobody
auth-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 server
tls-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為禁用);每個參數之間用,(逗号)分開;
完成以上工作後,就可以啟動伺服器了,然後再啟動用戶端了。