在 Windows Server 安裝 OpenVPN Server 並透過 AD (LDAP) 做帳號驗證

◎ Server OS: Windows Server 2019
◎ OpenVPN: OpenVPN 2.4.9 (Community)
◎ AD 驗證元件: Auth4OpenVPNv2.0
◎ Client OS: Windows 10

 

  由於公司的 VPN 硬體設備老舊最近在 survey VPN 的解決方案想說先從開源的解決方案下手一開始想到的就是五年前測試過的 OpenVPN但到官網下載 VM 映像檔並建置完成後才發現此版本僅開放兩個 client 免費連線要更多就要訂閱心想原來開始收費了難怪 Server 跟 client 端 (OpenVPN Connect) 的軟體介面都變得這麼漂亮印象以前都是要透過記事本去改設定的

  之後找到來自日本的 SoftEther VPN花了些時間研究及建置後原本以為這套應該可以用了沒想到最後在做測試時發現 SoftEther VPN 有個 drop SQL 連線的 bug且網友已經回報 issue 兩年了官方還是沒有修正因此只好忍痛放棄SoftEther VPN 的設定方式可參考【筆記】SoftEther VPN Server 設定

  後來回過頭找 OpenVPN 的相關授權資訊結果才找到 Community 的版本下載安裝後熟悉的文字檔設定畫面再度出現下方為本次建置的目標與設定方式

【目標】
◎ Server 使用 Windows 系統
◎ 使用 AD 做為帳戶驗證方式
◎ Client 端使用獨立網段並可自動取得 IP
◎ Client 端僅針對特定網段的流量會流量 VPN上網 (Internet) 不會
◎ Client 端可以連到企業內部的其他網段

 

◎ 首先 OpenVPN Community Downloads 頁面下載最新版本

 

◎ 接著參考社群的 Easy_Windows_Guide完成 Server 與 Client 設定以下擷錄重點設定


 

【前置作業】

◎ 安裝時請自行勾選EasyRSA 2 Certificate Management Scripts元件

◎ 以「系統管理員身分」執行 cmd並依序執行下列指令

cd "C:\Program Files\OpenVPN\easy-rsa"
init-config
notepad vars.bat

 

◎ 修改預設的憑證資訊改完後存檔

set KEY_COUNTRY=US
set KEY_PROVINCE=CA
set KEY_CITY=SanFrancisco
set KEY_ORG=OpenVPN
set KEY_EMAIL=mail@host.domain

 

◎ 依序執行下列指令

vars
clean-all

 

【建置憑證與金鑰】
◎ 執行下列指令

build-ca

 

◎ 輸入憑證資訊

Country Name (2 letter code) [US]:
State or Province Name (full name) [CA]:
Locality Name (eg, city) [SanFrancisco]:
Organization Name (eg, company) [OpenVPN]:
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server’s hostname) []:
Email Address [mail@host.domain]:

 

◎ 依序執行下列指令

build-key-server server
build-key client
# Guide 上是建議用 client 端的電腦名稱,然後為每一台電腦產生一份憑證,
# 但因為我主要是要用 AD 驗證,所以我這邊是只產生一份名為 client 的憑證,然後讓所有電腦一起使用。
build-dh
"C:\Program Files\OpenVPN\bin\openvpn.exe" --genkey --secret "C:\Program Files\OpenVPN\easy-rsa\keys\ta.key"

 

【設定 Server config 檔】

◎ 執行下列指令

copy "C:\Program Files\OpenVPN\sample-config\server.ovpn" "C:\Program Files\OpenVPN\easy-rsa\keys\server.ovpn"
notepad "C:\Program Files\OpenVPN\easy-rsa\keys\server.ovpn"

 

◎ 找到以下文字

ca ca.crt
cert server.crt
key server.key

dh dh2048.pem

 

◎ 取代成

caC:\\Program Files\\OpenVPN\\config\\ca.crt
certC:\\Program Files\\OpenVPN\\config\\server.crt
keyC:\\Program Files\\OpenVPN\\config\\server.key

dhC:\\Program Files\\OpenVPN\\config\\dh2048.pem

 

◎ 存檔並關閉

◎ 找到以下文字並拿掉前面的註解分號(;)。由於我打算只做一個憑證給大家共用如此可能會造成不同 Client 取得同一組 IP 的現象因此要將此設定開啟讓大家可以拿到不同的 IP

;duplicate-cn

 

【設定 Client config 檔】

◎ 執行下列指令

copy "C:\Program Files\OpenVPN\sample-config\client.ovpn" "C:\Program Files\OpenVPN\easy-rsa\keys\client.ovpn"
notepad "C:\Program Files\OpenVPN\easy-rsa\keys\client.ovpn"

 

◎ 找到以下文字

ca ca.crt
cert server.crt
key server.key

tls-auth ta.key 1

 

◎ 取代成

caC:\\Program Files\\OpenVPN\\config\\ca.crt
certC:\\Program Files\\OpenVPN\\config\\client.crt
keyC:\\Program Files\\OpenVPN\\config\\client.key

tls-authC:\\Program Files\\OpenVPN\\config\\ta.key” 1
# Guide 沒有這段這是我在運行 client 時跳錯而進行修正的

 

◎將下面的my-server-1修改為 OpenVPN 實際的 FQDN 或 IP 位址

remote my-server-1 1194

 

◎ 存檔並關閉

 

【複製憑證金鑰到正確的目錄】

◎ 執行下列指令

robocopy "C:\Program Files\OpenVPN\easy-rsa\keys\" "C:\Program Files\OpenVPN\config\" ca.crt ta.key dh2048.pem server.crt server.key server.ovpn

 

◎ 在C:\Program Files\OpenVPN\easy-rsa\keys\”,複製以下檔案

ca.crt
ta.key
client.crt
client.key
client.ovpn

 

◎ 貼到 client 電腦的C:\Program Files\OpenVPN\config\
PS. client 的安裝檔跟 Server 一樣

 

【啟動 OpenVPN】

◎ 在 Server 以「系統管理員身分」執行 OpenVPN GUI如果不以「系統管理員身分」運行也可以但可能部份 log 會沒有寫入權限也可以在「Windows 服務」OpenVPNService的「啟動類型」改成自動”,並按右鍵「啟動」

◎ Client 端直接執行 OpenVPN GUI並在右下角的圖示按右鍵選擇「連線」即可Client 亦可安裝介面比較好看得 OpenVPN Connect並將設定檔 (client.opvn) 拖曳進視窗即可


 

  以上為 Easy_Windows_Guide 的主要教學內容完成上面設定後就可以憑證方式完成連線接下來則是將設定調整為我想要的環境

◎ Client 端可以連到企業內部的其他網段
◎ 使用 AD 做為帳戶驗證方式

 

【讓 Client 端可以連到企業內部的其他網段】

  OpenVPN 在完成建置後預設 Server 會產生一張虛擬網卡其 IP 為 10.8.0.1,而 Client 則是會拿到 10.8.0.6,此時 Client 去 ping 10.8.0.1 應該要通

  接下來要 ping 伺服器的實體網路卡 ( 192.168.53.1) 會發現不通此時除了要加入路由外還要開啟「網際網路連線共用」功能這邊我卡好久後來才終於在 ViRb3 網友的「Create an OpenVPN Windows server that proxies internet traffic · GitHub」這篇找到「網際網路連線共用」這個關鍵設定

◎ 找到 server.opvn 裡的 「;push route “192.168…
◎ 依其格式加入下面一筆並存檔

push "route 192.168.53.0 255.255.255.0"
# 如果要讓 Client 連到企業內部的其他網段,
# 可以在這邊加入其他網段的資訊。

 

◎ 進入介面卡設定開啟實體網路卡 (192.168.53.1 這張) 的「網際網路連線共用」功能 (勾選允其他網路使用者透過這台電腦的網際網路連線來連線”)。
PS. 找了很多文章才知道要做這個動作在這邊卡關卡很久

 

  開啟「網際網路連線共用」功能後OpenVPN 虛擬網卡的 IP 將會被改成 192.168.137.1,因此我們如果要沿用 OpenVPN 預設的 10.8.0.1,需要修改機碼
◎ 執行 regedit到下列路徑

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\SharedAccess\Parameters

 

◎ 將 ScopeAddress 的值改成 10.8.0.1。

◎ 重啟 OpenVPN Server並讓 Client 重新連線即可

【使用 AD 做為帳戶驗證方式】

  首先很感謝 J. Ortega. 寫的 VBScript讓我們可以很方便讓 OpenVPN 夠過 AD 做驗證感謝感謝再感謝在「Active Directory Authentication for OpenVPN For Windows Implementationsamigo4life2」這個網頁有很詳盡的設定說明不過因為年代久遠所以後續在 Windows 2008、2012 以後的版本還有些動作要做以下為整理後的設定方式

◎ 下載 Auth4OpenVPNv2.0.zip並將內容解壓縮至C:/Program Files/OpenVPN/Config

 

◎ 修改 Auth4OpenVPN.ini輸入 AD 的相關資訊範例如下

Server = "192.168.53.20"
Domain = "abc"
DN = "dc=abc,dc=com,dc=tw"
Group = "(Group)OpenVPN"
Logging = "On"

 

  接下來的動作會與 J. Ortega. 網頁上稍有不同此為 iceh 網友在 OpenVPN Community 論壇 針對新版 Windows Server 安全性的問題做的修正在此也很感謝 iceh 網友

◎ 開啟記事本貼上以下內容

set LOCALAPPDATA=C:\Users\%USERNAME%\AppData\Local
set CommonProgramFiles=C:\Program Files\Common Files
set CommonProgramFiles(x86)=C:\Program Files (x86)\Common Files
set CommonProgramW6432=C:\Program Files\Common Files
C:\Windows\System32\cscript.exe "C:\Program Files\OpenVPN\config\Auth4OpenVPN.vbs"
exit %errorlevel%

◎將檔案儲存到C:\Program Files\OpenVPN\config”,檔名為Auth4OpenVPN-64bitWrapper.cmd”。

◎ 在 server.ovpn 加入下面兩行指令

script-security 3
auth-user-pass-verify Auth4OpenVPN-64bitWrapper.cmd via-env

◎ 在 Client 端的 client.ovpn 加入下面兩行指令

auth-user-pass
auth-retry interact

◎ 如此Client 在連線時便會跳出帳號密碼視窗來登入

 

【補充資訊】

◎ Auth4OpenVPN 有提供測試功能建議可以先以下面指令測試連線 AD 沒問題後再來進行後續動作

auth4openvpn.vbs <user> <password>

◎ Auth4OpenVPN 會在 Windows 應用程式記錄留下驗證結果如果依照原本網頁方式設定可能會出現Auth4OpenVPN: -2147221164, 類別未登錄的錯誤訊息此時依照 iceh 網友提供的Auth4OpenVPN-64bitWrapper.cmd的修復方式便可解決環境參數的問題

◎ 如果要讓 client 可以透過企業的網路上網 (Internet),只需在 server.ovpn 檔找到下面字串並將前面的註解(;)拿掉即可

;push "redirect-gateway def1 bypass-dhcp"

◎ OpenVPN Connect 在匯入 client.ovpn 檔時會檢查憑證與金鑰檔有沒有跟 client.ovpn 檔在同個目錄如果沒有會跳錯完成匯入後後續進行連線時OpenVPN Connect 才會依照 client.ovpn 的設定去指令路徑讀取憑證跟金鑰檔OpenVPN GUI 則沒有這個問題

◎ 如果要讓 OpenVPN 與 Windows 本機的帳戶驗證可參考網友 smiley22 分享的 SAMAuth4OpenVPN 元件

◎ 我後來還是沒有採用這個解決方案因為大陸有針對 OpenVPN 進行過濾因此連線過程會出現一些奇奇怪怪的問題

 

【參考連結】

3 則留言

  1. Paul says:

    Bonjour. Merci pour votre tuto mais j’avoue galérer. Je m’explique :
    J’arrive à créer un fichier server sur mon Windows ( server essentials 2016) et je me connecte dessus depuis Windows 10 avec mon fichier client. La connexion se fait.
    Mais arrivé à l’étape du ping, quand je ping l’adresse 10.8.0.1 depuis mon poste client, résultat négatif.
    Par ailleurs, dès que j’arrive à connecter mon client et lin serveur, je n’ai plus de connexion internet sur mon poste client.
    Auriez vous une piste pour m’aider à sortir de ce…..
    Est ce que le fait que ce soit une version essentials peut empêcher le ping ?

    1. Anson says:

      您好如果連10.8.0.1都ping失敗的話那麼蠻有可能VPN連線是建立失敗的預設的情況下,10.8.0.1是可以被ping的
      或許可以參考我文章的步驟一步一步設定看看祝您好運謝謝

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.