服务器域环境:windows2012 r2(推荐使用win2012r2,2019会有点小问题)
服务版本:OpenVPN 2.4.12
客户端:windows10
安装包下载:https://openvpn.net/community-downloads/
以下教程引用出处:https://www.softool.cn/blog-91.html
服务端安装部署:
打开安装包进行安装,客户端跟服务器安装方式一样,都需要安装:
接受(I Agree)下一步:
下面选项默认不勾选,我们需要勾选证书生成程序 ,不然安装完无法命令行制作证书操作:
选择安装目录:
Eastar’s Tips:
如果默认安装C盘,后续操作会简单一些;
如果选择安装D盘,需要记下此路径,后面需要调整HOME值;
安装完成:
安装完成后系统会多出一张网卡 TAP的 本地连接:
要想 客户端 能够通过 服务端 上网需要调整 服务端的物理网卡 共享:
Eastar’s Tips:
在物理网卡上右键选择属性,共享选项卡中勾选“允许其他网络用户通过此计算机的 Internet 连接来连接”;
家庭网络连接的下拉列表中选择上面TAP对应的连接名称;
生成配置:
OpenVPN支持基于加密证书的双向认证。
在OpenVPN中,不管是服务器还是客户端,所有的证书和私钥都需要由服务器端生成
,客户端要先获得服务器端分配给它的加密证书和密钥才能成功连接。
客户端只需要安装好软件,然后复制服务端生成的配置到客户端即可。
所以直接打开 cmd ,进入 OpenVPN 的安装目录:
D:\Program Files\OpenVPN\easy-rsa
然后在服务器端运行以下命令:
- 运行 DOS 命令,初始化执行环境。
下面的第1条批处理执行前,建议考虑以下因素:
由于 init-config 会把 vars.bat.sample 复制为 var.bat,所以可以根据自己需要先修改 vars.bat.sample 模板文件中的一些变量;
vars.bat.sample 部分默认值为:
set HOME=%ProgramFiles%OpenVPN\easy-rsa
set KEY_COUNTRY=US
set KEY_PROVINCE=CA
set KEY_CITY=SanFrancisco
set KEY_ORG=FortFunston
set KEY_EMAIL=mail@domain.com
修改为:
set HOME=D:\Program Files\OPENVPN\easy-rsa #(此路径就是上面安装时,自己选择的安装路径)
set KEY_COUNTRY=CN #(国家)
set KEY_PROVINCE=ShangHai #(省份)
set KEY_CITY=ShangHai #(城市)
set KEY_ORG=softool.cn #(组织)
set KEY_EMAIL=kefu@softool.cn #(邮件地址)
上面#开始的是注释,请不要写到 vars.bat.sample 文件中。
执行命令:
init-config #init-config 默认会执行当前目录下的 init-config.bat,以下同理。 功能:把 vars.bat.sample 复制为 var.bat
vars #vars.bat 用来设置一些变量,主要就是配置文件中修改的那部分
clean-all #如果之前有keys目录,会先删除D:\Program Files\OpenVPN\easy-rsakeys目录,再把 index.txt 和 serial 文件放进来
- 创建CA根证书:
注:
build-ca # 生成根证书;
build-dh.bat # 生成 dh2048.pem 文件,Server 使用 TLS(OpenSSL) 必须要有的文件;
D:\Program Files\OpenVPN\easy-rsa>build-ca
#此处的错误待研究:
Can't load D:\Program Files\OPENVPN\easy-rsa/.rnd into RNG
5712:error:2406F079:random number generator:RAND_load_file:Cannot open file:crypto/rand/randfile.c:98:Filename=D:\Program Files\OPENVPN\easy-rsa/.rnd
Generating a RSA private key
.............................................++++
............................++++
writing new private key to 'keysca.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
#下面我直接回车默认,因为我在 init-config 之前,已经修改了 vars.bat.sample 文件。
Country Name (2 letter code) [CN]:
State or Province Name (full name) [ShangHai]:
Locality Name (eg, city) [ShangHai]:
Organization Name (eg, company) [softool.cn]:
Organizational Unit Name (eg, section) [changeme]:
Common Name (eg, your name or your server's hostname) [changeme]:CA
Name [changeme]:
Email Address [kefu@softool.cn]:
D:\Program Files\OpenVPN\easy-rsa>build-dh
Generating DH parameters, 2048 bit long safe prime, generator 2
This is going to take a long time
...............................................................................................+...............................................+..............................................................................................+................+.................................................................................................................................................................................+..........................................................................................................................................................................................................+.................+.......................................................................................................................................................+......................................................................................................................................................+.......................+...............................................................................+...................................................................+...................................................................................+.........+...........+...........................................+............................................................................................................................................................................................................................+.........................................................................................................................................................................................................................................+..........................................................................................................................................................................................................+................................................................................+.................................................................................................+..........................+.......................................................................................................................................+................................+..............................................................................................................+.+............................................................................+.................................................+...+........................................................................................................................+...............+......................................................................................................................................................................................................................+..........................................................................................................................................................................................................................................................+.....................................................................................................................................................+.....................................................................................................+................................................................................................+.....................................................................................................+.........................................+....+................................................................................................................+................................................................................................................................................................................................................................................+..............................................................................................+....................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+...................................................................................................................................................................................................................................................................................................................................................................................+...................................................................................................................................+................................................................+........+................................................................................................................................................................................................................................................+................................+.................................................................................................................................................................................................................................................................................................+.................................................................................................................................................................................................................................+................................+..............................................................................................................................................+.............................................................+.................................................+................................++*++*++*++*
注:
build-ca 的时候需要输入一些注册信息。在输入信息的时候,如果你不输入任何信息,就表示采用默认值(前面[]中的内容就是默认值)
- 创建 服务器端 证书:
build-key-server server #生成服务端密钥和证书
注:
builid-key-server 后面指定的参数名 server 指的是生成的证书和密钥文件的名称(E.g server.key、server.csr 和 server.crt,这些文件保存在 keys 目录中),你可以按照自己的需要进行修改,不过后面的 Common Name 也应保持一致;
如果需要生成多个服务端的密钥和证书则继续 build-key-server server02 … … ; - 创建 客户端 证书:
build-key client
注:
和build-key-server一样要输入一堆东西,注意的是 Common Name 不能与执行 build-key-server 时输入的一样;
如果需要生成其他的客户端密钥和证书,可以继续 build-key client02 … … ;
5.生成ta.key秘钥"C:\Program Files\OpenVPN\bin\openvpn.exe"
--genkey --secret "C:\Program Files\OpenVPN\easy-rsa\keys\ta.key"
服务端的配置
- 首先,在 OpenVPN 安装目录(D:\Program Files\OpenVPN\config)下创建 server.ovpn ;
server.ovpn 模板文件如下,可根据需要调整:
# local 用于监听本机(作为服务器端)已安装网卡对应的IP地址,该命令是可选的,如果不设置,则默认监听本机的所有IP地址;
local 192.168.3.1
# 如果你想在同一台计算机上运行多个 OpenVPN 实例,你可以使用不同的端口号来区分它们,同时需要在防火墙上开放这些端口;
# 如果是用 http 代理连接,建议使用默认值 1194 ,如果使用 https 代理,建议使用大家常用值 443
port 1194
# 通过 TCP 协议连接
proto tcp
# 如果想使用 UDP 协议:
# proto udp
# win 下必须设为 tap ,将会创建一个以太网隧道;
# tap 处理二层,tun 处理三层,虽然 tun 两端ip是同一个子网,但是其二层却不是,广播是无法进行的,但是 tap 可以传输广播;
# 由于windows的虚拟网卡驱动的特殊性,为了让windows也能进入vpn,OpenVPN和虚拟网卡驱动作了特殊且复杂的处理。
# 怎么理解 tun 设备建立的是“点对点”链路,因为tun隧道是三层隧道,没有二层链路,更不必说二层广播链路了,我们知道数据链路层有两种通信方式,一种是点对点的方式,比如ppp协议,另一种是广播的方式,比如以太网,tun设备建立的隧道只有两个端点,隧道中封装的是IP数据报,虽然也需要arp协议来定位隧道对端tun设备的mac,然而如果有n台机器同时连接进一个虚拟网络并且属于同一个网段的话,其它机器是不会收到这个arp报文的,因为根本就没有二层链路帮忙广播转发这个arp报文
dev tap
# 设置 服务器端 模式,并提供一个 VPN 子网,以便于从中为 客户端 分配IP地址,假设 服务器端 自己占用了 192.168.0.1,所以其他的将提供 客户端 使用;
# 如果你使用的是 以太网桥接 模式,请注释掉该行;
# ★★★ 当客户端连接到此处的服务端时,为 客户端的以太网适配器分配的IPv4地址从此处指定的网段中指定一个;
server 192.168.0.0 255.255.255.0
# 设置 SSL/TLS 根证书(CA)、证书(cert)和私钥(key)。
# 每个 客户端 和 服务器端 都需要它们各自的证书和私钥文件。
# 服务器端和所有的客户端都将使用相同的CA证书文件。
#
# 通过 easy-rsa 目录下的一系列脚本可以生成所需的证书和私钥。
# 记住,服务器端和每个客户端的证书必须使用唯一的 Common Name。
#
# 你也可以使用遵循X509标准的任何密钥管理系统来生成证书和私钥。
# OpenVPN 也支持使用一个PKCS #12格式的密钥文件(详情查看站点手册页面的”pkcs12″指令)
ca ca.crt
cert server.crt
# 该文件应该保密
key server.key
# 指定 迪菲·赫尔曼参数,你可以使用如下名称命令生成你的参数:
# openssl dhparam -out dh2048.pem 2048
# 如果你使用的是1024位密钥,使用1024替换其中的2048。
dh dh2048.pem
# 指定用于记录客户端和虚拟IP地址的关联关系的文件。
# 当重启OpenVPN时,再次连接的客户端将分配到与上一次分配相同的虚拟IP地址
ifconfig-pool-persist ipp.txt
# 该指令仅针对以太网桥接模式。
# 首先,你必须使用操作系统的桥接能力将以太网网卡接口和TAP接口进行桥接。
# 然后,你需要手动设置桥接接口的IP地址、子网掩码;
# 在这里,我们假设为10.8.0.4和255.255.255.0。
# 最后,我们必须指定子网的一个IP范围(例如从10.8.0.50开始,到10.8.0.100结束),以便于分配给连接的客户端。
# 如果你不是以太网桥接模式,直接注释掉这行指令即可。
;server-bridge 10.8.0.4 255.255.255.0 10.8.0.50 10.8.0.100
# 该指令仅针对使用DHCP代理的以太网桥接模式,
# 此时客户端将请求服务器端的DHCP服务器,从而获得分配给它的IP地址和DNS服务器地址。
#
# 在此之前,你也需要先将以太网网卡接口和TAP接口进行桥接。
# 注意:该指令仅用于OpenVPN客户端,并且该客户端的TAP适配器需要绑定到一个DHCP客户端上。
;server-bridge
# 推送 路由信息 到 客户端 ,以允许 客户端 能够连接到 服务器 背后的其他私有子网(简而言之,就是允许 客户端 访问 VPN服务器 自身所在的其他局域网);
# 记住,这些私有子网也要将 OpenVPN客户端 的地址池(10.8.0.0/255.255.255.0)反馈回 OpenVPN服务器。
# ★★★ 为客户端 指定路由表:
;push "route 172.31.3.0 255.255.255.0"
;push "route 172.31.5.0 255.255.255.0"
# 如果启用该指令,所有 客户端的默认网关 都将重定向到VPN,这将导致诸如web浏览器、DNS查询等所有客户端流量都经过VPN。
# (为确保能正常工作,OpenVPN服务器所在计算机可能需要在 TUN/TAP 接口与以太网之间使用NAT或桥接技术进行连接)
;push "redirect-gateway def1 bypass-dhcp"
# 某些具体的 Windows网络设置 可以被推送到客户端,例如DNS或WINS服务器地址。
# 下列地址来自 opendns.com 提供的 Public DNS 服务器。
## 下面2句:客户端连接到此处的服务端时,会给 客户端的以太网适配器 的DNS服务器设置为此处指定的IP
push "dhcp-option DNS 114.114.114.114"
push "dhcp-option DNS 223.5.5.5"
# keepalive指令将导致类似于ping命令的消息被来回发送,以便于服务器端和客户端知道对方何时被关闭。
# 每10秒钟ping一次,如果120秒内都没有收到对方的回复,则表示远程连接已经关闭。
keepalive 10 120
# 选择一个密码加密算法。
# 该配置项也必须复制到每个客户端配置文件中。
;cipher BF-CBC # Blowfish (默认)
;cipher AES-128-CBC # AES
;cipher DES-EDE3-CBC # Triple-DES
cipher AES-256-CBC
# 在VPN连接上启用压缩。
# 如果你在此处启用了该指令,那么也应该在每个客户端配置文件中启用它。
comp-lzo
# 去掉该指令的注释将允许不同的客户端之间相互”可见”(允许客户端之间互相访问)。
# 默认情况下,客户端只能”看见”服务器。为了确保客户端只能看见服务器,你还可以在服务器端的TUN/TAP接口上设置适当的防火墙规则。
client-to-client
# 持久化选项可以尽量避免访问那些在重启之后由于用户权限降低而无法访问的某些资源。
persist-key
persist-tun
# 输出一个简短的状态文件,用于显示当前的连接状态,该文件每分钟都会清空并重写一次。
status openvpn-status.log
# 为日志文件设置适当的冗余级别(0~9)。冗余级别越高,输出的信息越详细。
#
# 0 表示静默运行,只记录致命错误。
# 4 表示合理的常规用法。
# 5 和 6 可以帮助调试连接错误。
# 9 表示极度冗余,输出非常详细的日志信息。
verb 3
explicit-exit-notify 1
push route表示推送的具体路由,就是这些路由是走VPN,其他流量还是走默认网关,然后就可以启动服务了。
把 D:\Program Files\OpenVPN\easy-rsakeys 目录下的ca.crt、ca.key、server01.crt、server01.csr、server01.key、dh2048.pem、ta.key 复制到 D:\Program Files\OpenVPN\config 目录下。
据说某些运营商封锁了UDP的数据链路,所以建议 openVPN 采用TCP协议连接;
贴一个个人的配置:
port 11188
proto udp
dev tap
ca ca.crt
cert Openvpn01.crt
key Openvpn01.key # This file should be kept secret
;crl-verify vpncrl.pem
dh dh2048.pem
server 10.56.0.0 255.255.255.0
ifconfig-pool-persist ipp.txt
client-to-client
push "route 172.17.76.0 255.255.254.0"
push "route 10.10.77.0 255.255.255.0"
push "route 172.17.88.0 255.255.254.0"
push "route 10.10.88.0 255.255.255.0"
push "dhcp-option DNS 10.10.77.30"
push "dhcp-option DNS 10.10.77.31"
;duplicate-cn
keepalive 10 120
;tls-auth ta.key 1
comp-lzo
;max-clients 100
user nobody
group nobody
persist-key
persist-tun
status openvpn-status.log
verb 3
script-security 3
auth-user-pass-verify Auth4OpenVPN-64bitWrapper.cmd via-env
客户端的配置
把配置文件 client.ovpn 放到客户端机器的 D:\Program Files\OpenVPN\config 目录下,并且把服务器 D:\Program Files\OpenVPN\easy-rsakeys 目录下的
client01.crt、client01.csr、client01.key、ca.key、ca.crt、ta.key 文件一起复制到客户端D:\Program Files\OpenVPN\config目录下 (以上文件为服务端生成,客户端需要在服务端拷贝这7个文件过来)。
client.ovpn的配置如下:
client
dev tun
proto tcp
remote 服务端IP 1194
;remote my-server-2 1194
;remote-random
resolv-retry infinite
nobind
user nobody
group nobody
;route 192.168.0.0 255.255.252.0
persist-key
persist-tun
;http-proxy-retry # retry on connection failures
;http-proxy [proxy server] [proxy port #]
ca ca.crt
cert client.crt
key client.key
ns-cert-type server
tls-auth ta.key 1
comp-lzo
# Set log file verbosity.
verb 4
贴一个个人客户端配置:
client
dev tap
proto udp
remote 你的域名 11188
;remote my-server-2 1194
;remote-random
resolv-retry infinite
nobind
user nobody
group nobody
route 172.17.76.0 255.255.254.0
route 10.10.77.0 255.255.255.0
persist-key
persist-tun
;http-proxy-retry # retry on connection failures
;http-proxy [proxy server] [proxy port #]
ca ca.crt
cert Client.crt
key Client.key
ns-cert-type server
;tls-auth ta.key 1
comp-lzo
verb 4
auth-user-pass
auth-retry interact
route-method exe
route-delay 2
AD认证出处来自:
https://it-help.tips/zh/install-openvpn-server-in-windows-server-and-authentication-by-ad-ldap/
【使用 AD 做为帐户验证方式】
首先,很感谢 J. 奥尔特加. 写的 VBScript,让我们可以很方便让 OpenVPN 够过 AD 做验证,谢谢再次谢谢。在「适用于Windows的OpenVPN的Active Directory身份验证 – amigo4life2」这个网页有很详尽的设定说明,不过因为年代久远,所以后续在 Windows 2008、2012 以后的版本,还有些动作要做,以下为整理后的设定方式:
◎ 下载 (https://sites.google.com/site/amigo4life2/openvpn)Auth4OpenVPNv2.0.zip,并将内容解压缩至 “Ç:/程序文件/ OpenVPN /配置”
◎ 修改 Auth4OpenVPN.ini,输入 AD 的相关资讯,范例如下:?
Server = "192.168.53.20" Domain = "abc" DN = "dc=abc,dc=com" Group = "(Group)OpenVPN" Logging = "On" |
接下来的动作,会与 J. 奥尔特加. 网页上稍有不同,此为 iceh 网友在 OpenVPN Community 论坛 针对新版 Windows Server 安全性的问题做的修正,在此也很感谢 iceh 网友。(https://forums.openvpn.net/viewtopic.php?t=17787)
◎ 开启记事本,贴上以下内容:
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 |
以上服务端文档都放置到config文件夹。
◎ 在 Client 端的 client.ovpn 加入下面两行指令:?
auth-user-pass auth-retry interact |
◎ 如此,Client 在连线时,便会跳出帐号密码视窗来登入。
【补充资讯】
◎ Auth4OpenVPN 有提供测试功能,建议可以先以下面指令测试连线 AD 没问题后,再来进行后续动作。?
1 | auth4openvpn.vbs <user> <password> |
◎ Auth4OpenVPN 会在 Windows 应用程式记录留下验证结果,如果依照原本网页方式设定,可能会出现 “Auth4OpenVPN: -2147221164, 类别未登录” 的错误讯息,此时依照 iceh 网友提供的 “Auth4OpenVPN-64bitWrapper.cmd” 的修复方式,便可解决环境参数的问题。
◎ 如果要让 client 可以透过企业的网路上网 (互联网),只需在 server.ovpn 档找到下面字串,并将前面的注解(;)拿掉即可。?
1 | ;push "redirect-gateway def1 bypass-dhcp" |
◎ OpenVPN Connect 在汇入 client.ovpn 档时,会检查凭证与金钥档有没有跟 client.ovpn 档在同个目录,如果没有会跳错。完成汇入后,后续进行连线时,OpenVPN Connect 才会依照 client.ovpn 的设定去指令路径读取凭证跟金钥档;OpenVPN GUI 则没有这个问题。
◎ 如果要让 OpenVPN 与 Windows 本机的帐户验证,可参考网友 smiley22 分享的 SAMAuth4OpenVPN (https://github.com/smiley22/SAMAuth4OpenVPN/releases/tag/v1.0.0.2)元件。