OpenVPN之Window端搭建

标签: Openvpn 分类: 软件 创建时间:2021-05-10 08:39:16 更新时间:2023-10-20 11:23:26

1.前言

我曾经写过一篇为了科学上网而总结的各种免费和付费的vpn技术(Post not found: 科学上网之VPN 科学上网之VPN),那一片主要用来介绍的是科学上网,还有一篇是Teamviewer自建VPN连接两个网络 是为了从家里的网络,连接到公司的内网中,本篇文章,也是这个主旨,就是为了构建一个虚拟专用网,通过VPN将内网和阿里云的网络连接到一起,成为一个统一的内网系统。

参考文章:
1.VPN网关 (阿里云也提供了相应的VPN产品,除了贵一点,其他的都好说啊)
2.Linux 搭建OpenVPN服务器和客户端(一)——最简配置 (在linux上实现的OpenVPN客户端和服务端)
3.Windows 10 平台搭建 OpenVPN
4.WINDOWS+OPENVPN服务器的架设
5.Windows防火墙开启ping,禁ping的配置方法 (Windows Server 2008中配置Windows防火墙,控制面板–>安全–> Windows防火墙–> 更改设置->例外 –> 在列表里找到“文件和打印机共享” –> 将前面的勾选中,启用规则)
6.OpenVPN 是什么?【附作用|下载/教程|配置|协议解析等】

1.下载

官方给出的地址,让我有点懵,就是没有windows版本的下载安装包,有一个Hypery-V的安装包,我觉得两者应该不一样,最后是在社区下载的安装包。

参考文章:
1.OpenVPN Windows 平台安装部署教程 (这篇文章的排版比较好看)

2.安装

有了安装包,双击安装就可可以,但是实际上,比较费事都就是配置。因为是要在Server2008 Standard版本上安装,所以我选择了OpenVPN 2.4.6版本。安装之后,我第一次打开OpenVPN GUI,弹出一个提示,就是使用导入功能,导入一个配置文件,我还是挺懵的,和参考文章中的一点不一样啊。

刚开始,我没有找到参考文章中说的那个easy-rsa文件夹,于是我卸载了,又重新安装,才发现,默认的OpenVPN安装界面,没有选中easy-rsa这个选项

参考文章:
1.OpenVPN客户端(Windows/Linux/MacOS)连接OpenVPN服务器 (.crt、.key、ca.crt证书文件可以内嵌到ovpn文件中,因此有时候会只有一个ovpn文件)
2.Windows下openVPN GUI的安装与配置 (和我安装的OpenVPN不一样,我没有C:\Program Files\OPENVPN\easy-rsa\vars.bat.sample 文件)
3.Setting up an Open VPN server on Windows Server 2008/2012 (在Sever2008中安装和配置OpenVPN,都是英文的)

3.初始化

1
2
cd "C:\Program Files\OpenVPN\easy-rsa"
init-config.bat

4.vars.bat

编辑C:\Program Files\OpenVPN\easy-rsa\vars.bat文件(linux端的安装路径:/usr/share/easy-rsa/),多数文章中都是只有下面的一些配置参数,其实还有PKCS11_MODULE_PATH、PKCS11_PIN两个参数,但是具体去查这两个参数的含义,有人说可以忽略。

1
2
3
4
5
6
7
8
9
10
11
set KEY_COUNTRY=US
set KEY_PROVINCE=CA
set KEY_CITY=SanFrancisco
set KEY_ORG=OpenVPN
set KEY_EMAIL=mail@host.domain
set KEY_CN=changeme
set KEY_NAME=changeme

## 可以忽略的地方
set PKCS11_MODULE_PATH=changeme
set PKCS11_PIN=1234
参考文章:
1.Can someone please explain easyrsa vars options for PKI generation (我猜你使用的是easy-rsa;如果你没有设置这些变量,当你运行工具生成证书时,它会向你询问这些变量。)
2.OpenVPN: What are the “PKCS11_MODULE_PATH” and “PKCS11_PIN” variables? (如果你不需要PKCS11_MODULE_PATH、PKCS11_PIN这些参数,可以忽略)

5.执行清理任务

1
2
3
cd "C:\Program Files\OpenVPN\easy-rsa"
vars.bat
clean-all.bat

进入到easy-rsa目录,以后所有的命令行操作,都在这个目录中运行。这样初始化工作就结束了,以后需要执行vars.bat命令,才能继续生成客户端和服务端密钥。

6.生成根证书

1
2
3
4
build-ca.bat

## 生成密钥
build-dh.bat

根据出现的提示,您只需按Enter。唯一的例外是KEY_CN(公用名)字段-请确保指定一个唯一的名称,并在“名称”字段中插入相同的名称:

7.生成服务端密钥

1
.\build-key-server.bat server

现在将询问所有生成的密钥,是否代表证书颁发机构对生成的证书进行签名(对证书签名)。回答y(是)。

8.生成客户端密钥

1
.\build-key.bat client1

在“通用名称”字段中,指定客户端的名称(在我们的示例中为client1)。

9.复制文件

(1) 生成的证书位于C:\ Program Files \ OpenVPN \ easy-rsa \ keys目录中,将下面列出的文件复制到目录C:\ Program Files \ OpenVPN \ config 文件夹中。

  • ca.crt
  • dh2048.pem/dh1048.pem
  • server.crt
  • server.key

(2) 默认配置文件在:C:\Program Files\OpenVPN\sample-config中,将下面列出的文件复制到目录C:\ Program Files \ OpenVPN \ config 文件夹中。

  • server.ovpn
  • client.ovpn

10.修改服务端配置

打开C:\ Program Files \ OpenVPN \ config\service.ovpn文件,修改下面的内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
port 443                                                     # 端口号,根据需要,自行修改,如果是用http代理连接,请不要修改
proto tcp-server
dev tun
server 10.0.0.0 255.255.255.0 # 虚拟局域网网段设置,请根据需要自行修改
keepalive 20 180
ca "C:\\Program Files\\OpenVPN\\config\\ca.crt" #CA证书存放位置,请根据实际情况自行修改
cert "C:\\Program Files\\OpenVPN\\config\\server.crt" #服务器证书存放位置,请根据实际情况自行修改
key "C:\\Program Files\\OpenVPN\\config\\server.key" #服务器密钥存放位置,请根据实际情况自行修改
dh "C:\\Program Files\\OpenVPN\\config\\dh2048.pem" #dh1024.pem存放位置,请根据实际情况自行修改
push "redirect-gateway def1"
push "dhcp-option DNS 223.5.5.5" #DNS,请根据实际情况自行修改
mode server ## 没有就新键一行
tls-server ## 没有就新键一行
status "C:\\Program Files\\OpenVPN\\log\\openvpn-status.log" #LOG记录文件存放位置,请根据实际情况自行修改
comp-lzo ## 将前面的分号去掉
verb 4 ## 将前面的分号去掉

11.客户端安装

客户端安装OpenVPN软件,然后复制以下文件
(1) 将服务器生成的客户端密钥ca.crt client1.crt client1.key三个文件,复制到客户端的C:\Program Files\OpenVPN\config文件夹中。

(2) 复制客户端的C:\Program Files\OpenVPN\sample-config\client.ovpn到C:\Program Files\OpenVPN\config文件夹。

12.修改客户端配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
dev tun
proto tcp-client
remote www.oovc.com 443 #服务器域名/IP 和端口
resolv-retry infinite
nobind
http-proxy 192.168.1.1 80 #这里填入你的代理服务器地址和端口,没有代理可以不填
mute-replay-warnings
ca "C:\\Program Files\\OpenVPN\\config\\ca.crt"
cert "C:\\Program Files\\OpenVPN\\config\\client241.crt" #这里改成每个客户端相应的证书
key "C:\\Program Files\\OpenVPN\\config\\client241.key" #这里改成每个客户端相应的密钥
comp-lzo
verb 4
status "C:\\Program Files\\OpenVPN\\log\\openvpn-status.log"
参考文章:
1.OpenVPN客户端配置

13.连接

打开OpenVPN GUI,然后在右下角的图标中右键选择连接。在连接时需要注意以下几点:
(1) 客户端的remote是否配置正确,端口号,网络地址是否能通过端口扫描。
(2) 客户端的proto是否和服务器配置一致,最好是tcp协议,因为使用udp,我没有成功。

如果还是有问题,请参考下面几个问题总结。

问题

(1) –cipher set to ‘AES-256-CBC’ but missing in –data-ciphers (AES-256-GCM:AES-128-GCM). Future OpenVPN version will ignore –cipher for cipher negotiations. Add ‘AES-256-CBC’ to –data-ciphers or change –cipher ‘AES-256-CBC’ to –data-ciphers-fallback ‘AES-256-CBC’ to silence this warning

服务器是OpenVPN 2.4,客户端时是2.5,换成一样的版本尝试。

参考文章:
1.OpenVPN client no longer connects, cipher not recognized and missing in –data-ciphers (You’re using OpenVPN 2.5 which ONLY allows AES-256-GCM AES-128-GCM by default. The config files provided by PIA only set up CBC ciphers.You need to either fall back to OpenVPN 2.4, or follow the directions in the error message and change your configuration and explicitly enable the CBC ciphers.)

(2) –tls-auth fails with ‘ta.key’: No such file or directory (errno=2)

有两种解决方法,找到客户端的client.ovpn文件,将其中的 tls-auth注释掉,

1
# tls-auth ta.key 1

或者是生成ta.key文件,然后指定ta.key的位置(这个我没试)

1
openvpn --genkey --secret /etc/openvpn/easy-rsa/keys/ta.key
参考文章:
1.Open VPN options error: –tls-auth fails with ‘ta.key’: no such file or directory (drop the tls-auth instruction altogether. This is not a major dent in your security: the Manual in fact states)

(3) TLS Error: TLS key negotiation failed to occur within 60 seconds (check your network connectivity)
我尝试了用端口扫描工具,扫描阿里云的端口开放程度,发现1194端口没有开放,但是在查询进程的时候,发现1194端口已经由openvpn.exe在使用了。

1
2
3
4
## 查看端口进程
netstat -aon|findstr "1194"
## 查看进程号所代表的程序
tasklist|findstr "21004"

我将防护墙关闭,重新扫描端口开启,还是出现了关闭问题。

我在阿里云的安全组中,将端口加入进去,还是出现了问题。

解决方法

最后,我将server端的proto改为了tcp模式,配置的阿里云安全组以及防火墙都生效了,然后将客户端的proto和remote改为服务器的相应配置,最后实现了openvpn连接

(4) openvpn all tap-windows adapters on this system are currently in use

解决方式一:禁用,再启用
在windows 2008上,打开网络和共享中心->管理网络连接,找到TAP-Windows Adaper,先右键禁用,然后再启用。

解决方式二:重新安装
C:\Program Files\TAP-Windows,卸载,然后重新安装。

这两个方案我都尝试过了,没有重启电脑,都不行。

解决方法
最后解决方法,就是在系统服务中,将我启动的OpenVPNService和OpenVPN Legacy Service两个服务停掉,就可以了。

(5) –explicit-exit-notify can only be used with –proto udp
当我配置proto tcp的时候,弹出这个错误,只能用udp。

解决方法:把server.ovpn中的:explicit-exit-notify 1,注释掉。

14.端口转发

(1) 在我成功将内外网联通之后,服务器的ip为:10.0.0.1,客户端的ip为:10.0.0.6。我执行了ping操作,从客户端ping服务端,以及从服务端ping客户端都可以访问。

(2) 另外,我在客户端安装了hmailserver服务器,开放了25和110端口,我使用telnet 10.0.0.6 25 在客户端上查看端口是否开放,发现有回应,也就是说客户端的邮件服务器正常运行。但是在服务器端同样尝试这个命令,却没有回应,说明服务器和客户端没有联通。

(3) 同样的,我在服务端开启了3306端口以及9201端口,在客户端使用:telnet 10.0.0.1 9201,以及telnet 10.0.0.1 3306,都可以连接上,也就是说,只能一方通行,从客户端可以访问服务端,但是无法从服务端访问客户端。

(4) 为了测试,我使用teamviewer提供的vpn选项连接了内外网,在服务器端使用telnet查看安装了邮件服务器的客户端25端口时,也有了正确的回应,问题就是出在了openvpn的设置中。但是根据telnet的说明:

If the port is Open, you will see a blank screen. This means that the connection is successful.(如果端口开放了,你将会看到一个黑屏,意味着你已经连接成功了。)
If the port is closed, you will receive a Connect failed message. (如果端口没有开放,你将收到一个连接失败的提示)

所以我在服务端,随便测试一个端口:telnet 10.0.0.6 89,确实不通,也就是说,25端口开放了,但是没有回应任何信息。

(5) 在内网openvpn客户端有一个80端口,部署了IIS网站,在openvpn服务端可以直接输入在浏览器地址栏中输入:10.0.0.6 访问客户端的网站。

参考文章:
1.openvpn实现内网 映射到 外网 (先是在linux系统上创建了openvpn链接了内外网,然后是使用了iptables进行了端口转发)
2.OpenVPN搭建管道为内网地址映射公网端口
3.烂泥:openvpn tun模式下客户端与内网机器通信
4.利用云服务器通过OpenVPN将内网的地址发布到外网 (除了介绍了端口转发之外,还介绍了如何搭建openvpn连接虚拟专用网)
5.ArticlesHow to use Telnet (to Check the Status of Ports) (如何判读是否连接成功)
小额赞助
本人提供免费与付费咨询服务,感谢您的支持!赞助请发邮件通知,方便公布您的善意!
**光 3.01 元
Sun 3.00 元
bibichuan 3.00 元
微信公众号
广告位
诚心邀请广大金主爸爸洽谈合作
每日一省
isNaN 和 Number.isNaN 函数的区别?

1.函数 isNaN 接收参数后,会尝试将这个参数转换为数值,任何不能被转换为数值的的值都会返回 true,因此非数字值传入也会返回 true ,会影响 NaN 的判断。

2.函数 Number.isNaN 会首先判断传入参数是否为数字,如果是数字再继续判断是否为 NaN ,不会进行数据类型的转换,这种方法对于 NaN 的判断更为准确。

每日二省
为什么0.1+0.2 ! == 0.3,如何让其相等?

一个直接的解决方法就是设置一个误差范围,通常称为“机器精度”。对JavaScript来说,这个值通常为2-52,在ES6中,提供了Number.EPSILON属性,而它的值就是2-52,只要判断0.1+0.2-0.3是否小于Number.EPSILON,如果小于,就可以判断为0.1+0.2 ===0.3。

每日三省
== 操作符的强制类型转换规则?

1.首先会判断两者类型是否**相同,**相同的话就比较两者的大小。

2.类型不相同的话,就会进行类型转换。

3.会先判断是否在对比 null 和 undefined,是的话就会返回 true。

4.判断两者类型是否为 string 和 number,是的话就会将字符串转换为 number。

5.判断其中一方是否为 boolean,是的话就会把 boolean 转为 number 再进行判断。

6.判断其中一方是否为 object 且另一方为 string、number 或者 symbol,是的话就会把 object 转为原始类型再进行判断。

每日英语
Happiness is time precipitation, smile is the lonely sad.
幸福是年华的沉淀,微笑是寂寞的悲伤。