在 Windows Server 安装 OpenVPN Server 并透过 AD (LDAP) 做帐号验证

◎服务器操作系统: Windows Server 2019
◎OpenVPN: 开放VPN 2.4.9 (社区)
◎ AD 验证元件: Auth4OpenVPNv2.0
OS客户端OS: 窗口 10

 

  由于公司的 VPN 硬体设备老旧,最近在 survey VPN 的解决方案,想说先从开源的解决方案下手,一开始想到的就是五年前测试过的 OpenVPN,但到官网下载 VM 映像档并建置完成后,才发现此版本仅开放两个 client 免费连线,要更多就要订阅。心想原来开始收费了,难怪 Server 跟 client 端 (OpenVPN连接) 的软体介面都变得这么漂亮,印象以前都是要透过记事本去改设定的。

  之后找到来自日本的 SoftEther VPN,花了些时间研究及建置后,原本以为这套应该可以用了,没想到最后在做测试时,发现 SoftEther VPN 有个 drop SQL 连线的 bug,且网友已经回报 issue 两年了,官方还是没有修正,因此只好忍痛放弃。 SoftEther VPN 的设定方式,可参考【笔记】SoftEther VPN Server 设定

  后来回过头找 OpenVPN 的相关授权资讯,结果才找到 Community 的版本,下载安装后,熟悉的文字档设定画面再度出现,哈。下方为本次建置的目标与设定方式:

【目标】
◎ Server 使用 Windows 系统。
◎ 使用 AD 做为帐户验证方式。
◎ Client 端使用独立网段,并可自动取得 IP。
◎ Client 端仅针对特定网段的流量会流量 VPN,上网 (互联网) 不会。
◎ Client 端可以连到企业内部的其他网段。

 

◎ 首先,到 OpenVPN社区下载 页面下载最新版本。

 

◎ 接着参考社群的 Easy_Windows_Guide,完成 Server 与 Client 设定,以下撷录重点设定。


 

[前期工作]

◎ 安装时请自行勾选 “EasyRSA 2 证书管理脚本” 元件。

◎ 以「系统管理员身分」执行 cmd,并依序执行下列指令:

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

 

◎ 修改预设的凭证资讯,改完后存档。

设置KEY_COUNTRY = US
设置KEY_PROVINCE = CA
设置KEY_CITY =旧金山
设置KEY_ORG = OpenVPN
设置[email protected]

 

◎ 依序执行下列指令:

  vars  clean-all  

 

【建置凭证与金钥】
◎ 执行下列指令:

  build-ca  

 

◎ 输入凭证资讯:

国家的名字 (2 字母代码) [我们]:
州或省名称 (全名) [加利福尼亚]:
地区名称 (例如, 市) [旧金山]:
机构名称 (例如, 公司) [开放VPN]:
组织单位名称 (例如, 部分) []:
通用名 (例如, 您的名称或服务器的主机名) []:
电子邮件地址 [[email protected]]:

 

◎ 依序执行下列指令:

  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 cart
cert server.crt
密钥服务器

dh dh2048.pem

 

◎ 取代成:

那 “Ç:\\程序文件\ OpenVPN \ config \ ca.crt”
证书 “Ç:\\程序文件\ OpenVPN \ config \ server.crt”
键 “Ç:\\程序文件\ OpenVPN \ config \ server.key”

即 “Ç:\\程序文件\ OpenVPN \ config \ dh2048.pem”

 

◎ 存档并关闭。

◎ 找到以下文字,并拿掉前面的注解分号(;)。由于我打算只做一个凭证给大家共用,如此可能会造成不同 Client 取得同一组 IP 的现象,因此要将此设定开启,让大家可以拿到不同的 IP。

;复制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 cart
cert server.crt
密钥服务器

tls-auth ta.key 1

 

◎ 取代成:

那 “Ç:\\程序文件\ OpenVPN \ config \ ca.crt”
证书 “Ç:\\程序文件\ OpenVPN \ config \ client.crt”
键 “Ç:\\程序文件\ OpenVPN \ config \ client.key”

身份验证 “Ç:\\程序文件\ OpenVPN \ config \ ta.key” 1
# Guide 没有这段,这是我在运行 client 时跳错,而进行修正的。

 

◎将下面的 “我的服务器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  

 

◎ 在 “Ç:\程序文件 OpenVPN easy-rsa keys ”,复制以下档案:

证书
ta.key
client.crt
客户端密钥
客户程序

 

◎ 贴到 client 电脑的 “Ç:\程序文件 OpenVPN config ”
聚苯乙烯. client 的安装档跟 Server 一样。

 

【启动 OpenVPN】

◎ 在 Server 以「系统管理员身分」执行 OpenVPN GUI。如果不以「系统管理员身分」运行也可以,但可能部份 log 会没有写入权限。也可以在「Windows 服务」,将 “OpenVPN服务” 的「启动类型」改成”自动”,并按右键「启动」。

◎ Client 端直接执行 OpenVPN GUI,并在右下角的图示按右键选择「连线」即可。Client 亦可安装介面比较好看得 OpenVPN Connect,并将设定档 (客户程序) 拖曳进视窗即可。


 

  以上为 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 网友的「创建代理Internet流量的OpenVPN Windows服务器 · GitHub」这篇找到「网际网路连线共用」这个关键设定。

◎ 找到 server.opvn 里的 「;推入路线 “192.168…“
◎ 依其格式,加入下面一笔,并存档。

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

 

◎ 进入介面卡设定,开启实体网路卡 (192.168.53.1 这张) 的「网际网路连线共用」功能 (勾選”允其他网路使用者透过这台电脑的网际网路连线来连线”)。
聚苯乙烯. 找了很多文章才知道要做这个动作,在这边卡关卡很久。

 

  开启「网际网路连线共用」功能后,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. 奥尔特加. 写的 VBScript,让我们可以很方便让 OpenVPN 够过 AD 做验证,谢谢再次谢谢。在「适用于Windows的OpenVPN的Active Directory身份验证 – amigo4life2」这个网页有很详尽的设定说明,不过因为年代久远,所以后续在 Windows 2008、2012 以后的版本,还有些动作要做,以下为整理后的设定方式:

◎ 下载 Auth4OpenVPNv2.0.zip,并将内容解压缩至 “Ç:/程序文件/ OpenVPN /配置”

 

◎ 修改 Auth4OpenVPN.ini,输入 AD 的相关资讯,范例如下:

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

 

  接下来的动作,会与 J. 奥尔特加. 网页上稍有不同,此为 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%  

◎将档案储存到 “Ç:\程序文件 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 可以透过企业的网路上网 (互联网),只需在 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 进行过滤,因此连线过程会出现一些奇奇怪怪的问题。

 

【參考連結】

发表评论

请注意:: 评论审核已启用,可能会耽误您的评论. 有没有必要重新提交您的评论.