说明:
本文只是学习研究,是用来对于国内公司员工出差远程连接公司进行办公的方法研究,并无翻墙之意,请读者遵守法律,科学上网。
本次实验是在windows 10(服务端)和windows server 2020(客户端)上分别搭建OpenVPN服务端和客户端,都是使用OpenVPN这个软件(因为这个软件即可做服务端也可做客户端),笔者也是刚开始接触的,慢慢再摸索了好久ヾ(≧▽≦*)o,希望这篇文章可以给困惑的你一些帮助,感谢。
一般的网络部署中,公司总部是经常用ikuai做服务端(L2TP、OpenVPN),出差办公员工通过远程连接到公司,可以使用windows(这里主要是windows系统)自带的VPN登录选项,也可以使用软件来远程连接(OpenVPN GUI)。
本实验适用于2.4.X版本,2.5.X和这个有点出入,但是大致思路是一样的。
实验环境
VMware Workstation Pro17:
windows 10(服务端):
windows server(客户端):
OpenVPN GUI(2.4.8)
下载
上面3个软件和镜像包在网上可以自行找寻;
OpenVPN
官网安装包下载地址(各系统版本):
第三方安装包下载地址(各系统版本):https://www.techspot.com/downloads/5182-openvpn.html
本次实验是OpenVPN 2.4.X版本(openvpn-install-2.4.8-I602-Win10.exe,下载地址:OpenVPN 2.4.8 (npackd.org)),2.4和2.5两个版本的操作是有以下不一样的,请注意仔细查看版本,以防最后出现问题。切记!!!
实验步骤
一、服务端安装
打开安装包进行安装,客户端跟服务器安装方式一样,都需要安装:
(Next)下一步:
I Agree下一步:
下面选项默认是不勾选的,我们需要勾选证书生成程序,不然安装完无法命令行制作证书操作:
选择安装目录:
如果默认安装C盘,后续操作会简单一些;
如果选择安装其他盘,需要记下此路径,后面需要调整HOME值;
(这里选择C盘,如果选择其他盘的话,到下面调整HOME值的时候有说明)
安装完成:
安装完成后系统会多出一张网卡 TAP的 本地连接:
PS:这里的网卡到后面通过服务端上网会用到
二、生成配置
OpenVPN支持基于加密证书的双向认证,如果是L2TP的话,是可以不需要证书,用密钥即可。
在 OpenVPN 中,服务器端生成所有的证书和私钥,并将加密证书和密钥分配给客户端。客户端只需要安装好软件,然后复制服务端生成的配置到客户端即可。
服务器端(windows 10)运行以下命令:
所以直接打开 cmd(以管理员的身份运行) ,进入 OpenVPN 的安装目录C:\Program Files\OpenVPN\easy-rsa
然后运行以下命令:
1、环境初始化
下面的命令执行前,请先做一些操作:
打开资源管理器,找到C:\Program Files\OpenVPN\easy-rsa 下的vars.bat.sample
由于 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=C:\Program Files\OpenVPN\easy-rsa #(此路径就是上面安装时,自己选择的安装路径)
set KEY_COUNTRY=CN #(国家)
set KEY_PROVINCE=ZJ #(省份)
set KEY_CITY=NB #(城市)
set KEY_ORG=Openvpn #(组织)
set KEY_EMAIL=test@vpn #(邮件地址)
// 国家是建议是CN,其他的随意,乱写也行。注意,#后面的内容不要拷贝进
vars.bat.sample, 要记得删掉。
// HOME一定要改,否则会出错
修改完后关闭文件,然后执行命令:
在cmd(管理员模式)界面输入下面命令
①:init-config #会执行当前目录下的 init-config.bat,将 vars.bat.sample 复制为 var.bat
②:vars #vars.bat 用来设置一些变量,主要就是配置文件中修改的那部分
③:clean-all
2、创建CA根证书
生成CA证书主要是下面的命令,如果server使用TLS的话,就需要创建dh文件
build-ca # 生成根证书;
build-dh.bat # 生成 dh2048.pem 文件,Server 使用 TLS(OpenSSL) 必须要有的文件;
PS:下面创建CA证书的时候,需要在Common Name的时候设置名称为CA
C:\Program Files\OpenVPN\easy-rsa>build-ca.bat
Generating a RSA private key
................................................................................................................................................................................................................++++
...........................................++++
writing new private key to 'keys\ca.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.
-----
Country Name (2 letter code) [CN]:
State or Province Name (full name) [ZJ]:
Locality Name (eg, city) [NB]:
Organization Name (eg, company) [vpn]:
Organizational Unit Name (eg, section) [changeme]:
Common Name (eg, your name or your server's hostname) [changeme]:CA
Name [changeme]:
Email Address [vpn@qq.com]:C:\Program Files\OpenVPN\easy-rsa>build-dh.bat
Generating DH parameters, 2048 bit long safe prime, generator 2
This is going to take a long time
...............................................................................+.................+....+..............................................................................................................................+...................+......+................................................................................................+..........................................................+...............................................................+....+.................................................................................................+..................................................................+............................................................................................................................+..............................................................+...........................................+.........................+................................................................................................................................................................................................+..+............................+........................................+................+........................+..............................................................+.......................................................................................................................................+...............................................+.........................................+..........................................................................+.........................................+....................................................................................................................................................................................................................+....+..........................+..................+....................................................................................................................................................................+.........................................................................+.................................................................+.............................................................................................................................................................................................................................+......................................+....................................+...............................................................................................................................................................................................................................................................+..................................................................................................................................+.........................................................+..........................................+....................................................................+...................+............................+............................................+..........................................+...............+...............+...........+......................................................................................+.......+.............................................+.................................................................................+......................+.................++*++*++*++*
build-ca 的时候需要输入一些注册信息。在输入信息的时候,如果你不输入任何信息,就表示采用默认值(前面[]中的内容就是默认值)
3、创建ta.key文件
在服务端cmd(管理员模式)输入:
cd C:\Program Files\OpenVPN\bin
openvpn --genkey --secret "C:\Program Files\OpenVPN\config\ta.key" #路径自定义
文件会在C:\Program Files\OpenVPN\config\生成。
4、创建服务端证书
build-key-server server #生成服务端密钥和证书(server是服务端证书和密钥文件的名称)
注:
builid-key-server 后面指定的参数名 server 指的是生成的证书和密钥文件的名称(会生成 server.key、server.csr 和 server.crt这几个文件,保存在 keys 目录中)
如果需要生成多个服务端的密钥和证书则继续 build-key-server server01 … … ;
5、创建客户端证书
build-key client #生成客户端密钥和证书(client是服务端证书和密钥文件的名称)
注:
client和build-key-server一样,也是需要输入相似的配置,但是 Common Name 不能与执行 build-key-server 时输入的一样;
如果需要生成其他的客户端密钥和证书,可以继续 build-key client01 … … ;
三、服务端的配置文件
首先,找到位置C:\Program Files\OpenVPN\sample-config,里面有客户端和服务端的模板,用记事本打开,以#开头的是注释,以;开头的是不生效命令,可以翻译一下,就知道大概是什么作用了。最好是使用软件自带的模板,这样兼容性好一点,只需要改一些参数就可以了,下面给出需要的命令(#省去了,;保留并解释作用)
; local 用于监听本机(作为服务器端)已安装网卡对应的IP地址,该命令是可选的,如果不设置,则默认监听本机的所有IP地址;
local 0.0.0.0# 开放端口号
port 1194# 使用TCP还是UDP(server和client要保持一致,建议都是UDP,TCP可能会连接失败)
;proto tcp
proto udp# win 必须使用tap,具体解释模板里有,翻译一下即可
dev tap
;dev tun# 不使用
;dev-node MyTap# 证书和DH
ca ca.crt
cert server.crt
key server.keydh dh2048.pem
# 不使用
;topology subnet# 设置分配给客户端的网段地址
server 10.8.0.0 255.255.255.0# 记录客户端与分配给分配客户端IP的关系
ifconfig-pool-persist ipp.txt# 针对以太网桥接模式
;server-bridge 10.8.0.4 255.255.255.0 10.8.0.50 10.8.0.100# 桥接模式,不使用
;server-bridge# 推送路由信息到客户端,允许客户端能访问VPN服务器自身所在的其他网段,看个人情况选择是否开启,这里默认不使用
;push "route 192.168.10.0 255.255.255.0"
;push "route 192.168.20.0 255.255.255.0"# 不使用
;client-config-dir ccd
;route 192.168.40.128 255.255.255.248
# 不使用
;client-config-dir ccd
;route 10.9.0.0 255.255.255.252
# 不使用
;learn-address ./script# 不开启,这是将客户端的默认网关重定向到VPN
;push "redirect-gateway def1 bypass-dhcp"# 推送DNS,开启使用
push "dhcp-option DNS 223.5.5.5"
# 默认不开启,允许客户端之间互访,默认不允许
;client-to-client# 不使用
;duplicate-cn# 每10sping一次,如果120s内没有收到对方的回复,则表示连接已关闭
keepalive 10 120# TLS,服务端是为0,客户端是为1
tls-auth ta.key 0
# 密码加密算法,两端要保持一致
cipher AES-256-CBC# 默认不使用
;compress lz4-v2
;push "compress lz4-v2"# 在VPN连接上启动压缩,两端要保持一致
;comp-lzo# 最大客户端限制
;max-clients 100# 默认不开启使用
;user nobody
;group nobody# 开启使用
persist-key
persist-tun# 开启使用
status openvpn-status.log# 默认不开启
;log openvpn.log
;log-append openvpn.log# 日志冗余级别。级别越高,输出越详细(数字越大级别越高)
verb 3# 不开启
;mute 20# 默认
explicit-exit-notify 1
PS:注意,如果要想让客户端通过自己上网,可以给客户端推送路由:
push "route 0.0.0.0 0.0.0.0"
这样的话客户端可以直接通过服务端上网,下面的五测试,客户端通过服务端上网就可以略过
将上面的文件复制到server.txt中,接着将文件类型改成server.ovpn,把在key文件中的所有文件都复制到目录:C:\Program Files\OpenVPN\config下,如下所示:
PS:这里的ta.key文件是从C:\Program Files\OpenVPN\config\复制而来的,一定不要忘了。
然后把客户端的需要的文件(ca.crt、ca,key、client.crt、client.csr、client.key、ta.key)复制给windows server.
四、客户端的配置文件
配置客户端文件:client.ovpn
现在记事本中把下面内容复制过去,然后保存,把文件名和类型改成:client.ovpn,接着把送服务端复制过来的文件和这个client.ovpn(一共7个文件,自己看一下是否少了)放在客户端的:C:\Program Files\OpenVPN\config目录下。客户端的安装和服务端一致,这里便不再讲述了。
client
dev tap
;dev tun# 不使用
;dev-node MyTap# 建议UDP
;proto tcp
proto udp# 服务器地址和端口号
remote 192.168.188.129 1194
;remote my-server-2 1194# 不使用
;remote-random# 默认开始使用
resolv-retry infinite# 默认开启
nobind# 不使用
;user nobody
;group nobody# 默认开启
persist-key
persist-tun# 默认不使用
;http-proxy-retry # retry on connection failures
;http-proxy [proxy server] [proxy port #]# 默认不使用
;mute-replay-warnings# ca等文件
ca ca.crt
cert client.crt
key client.key# 开启使用
remote-cert-tls server# 开启使用
tls-auth ta.key 1# 要和服务端保持一致
cipher AES-256-CBC# 和服务端保持一致
#comp-lzo# Set log file verbosity.
verb 3# Silence repeating messages
;mute 20
具体文件如下:
这7个文件是必须的,其他的便无所谓了。
五、测试
1、测试网络连通性
windows 10和windows server两台虚拟机,桥接到同一网卡上(192.168.188.0/24),网卡开启DHCP分配地址,如下所示:(windows是服务端,windows server是客户端)
Windows 10:
Windows server:
关闭防火墙,测试连通性:
通信正常。
2、导入配置文件
运行OpenVPN软件最好是以管理员的方式运行,不然的话有可能出错。
服务端(windows 10):
打开电脑右下角,找到一个电脑小图标,右键,点击导入文件:
找到文件并导入:
然后会显示成功导入文件:
再次点击电脑右下角,找到电脑小图标,右键点击连接,会显示连接中:
这时候客户端的操作和服务端一样,也是导入文件,点击连接:
等待一会,显示连接成功
测试一下连通性:
3、客户端通过服务端上网
在服务端安装的时候,会在网卡中显示多一张TAP网卡,现在来看两张网卡:
windows 10(server):
这时,TAP网卡已经有地址了:
再看windows server(client):
可以看到,两张网卡都有地址,我们现在来实现让客户端通过服务端来上网。
首先服务端需要至少两个网卡,一张是和客户端在同一个网段(192.168.188.0/24),另一张网卡则是NAT或者桥接都行,只要能正常上网(聪明的你肯定知道怎么做,如果不会的话,可以百度一下,总会用办法的q(≧▽≦q))。
服务端(windows 10):
在能正常上网的网卡上右键点击属性,找到共享,点击开启,下面的家庭网络连接选择TAP网卡,这里的本地连接就是TAP网卡,点击确定即可。
然后能上网的网卡上就可以看到有共享的,至此,服务端配置为完毕
PS:对于服务端给客户端下发的DNS在客户端的配置文件里有,如果不下发的话就需要在客户端的网卡上手动更改DNS地址。
客户端(windows server):
在客户端还剩最后一个问题,即路由,如果在服务端下发了网关重定向,那么应该是不会产生这个问题的,但是笔者没有搞定,所以只能在客户端上配置路由。o(*^@^*)o
打开cmd(以管理员模式运行)命令行:
先看一下路由表:(-4是查看IPv4路由,-6是IPv6路由)
可以看到,缺少一条静态路由,我们手动添加即可:
route add 0.0.0.0 mask 0.0.0.0 10.8.0.1 #添加路由
route delete 0.0.0.0 mask 0.0.0.0 10.8.0.1 #删除路由
如果不清楚后面跟什么参数,可以输入一下空格,再输入--help回车查看即可
添加路由后:
ping一下百度:
可以正常上网了。
注意:如果出现添加路由后还是不能上网,就需要重新连接一下server和client。
参考文章:
https://www.softool.cn/blog-91.htmlhttps://www.softool.cn/blog-91.html
https://blog.51cto.com/u_9829390/5190623https://blog.51cto.com/u_9829390/5190623