Windows 下的 OpenVPN 安装

OpenVPN 安装配置

下载地址:
https://github.com/OpenVPN/openvpn
https://openvpn.net/community-downloads/

服务器端和客户端,是同一个安装文件。仅仅是安装后,参数配置不同。

我的环境:
1. Windows 10; Windows 11
2. OpenVPN 2.6.8

我的目标


我的办公室有一个小型的局域网,局域网地址是 192.168.1.x;我希望在外面,可以通过 VPN 连接的方式,直接访问办公室局域网的其它电脑。

使用 OpenVPN 的实现方法有两种:
1. 使用默认的模式,也叫路由模式;
2. 使用网桥模式;网上读了一些资料,发现网桥模式配置起来比较复杂,还需要配置电脑本身的 Windows 的路由表。但没一篇文章把这个问题说清楚。所以这次我没采用这个模式。 

OpenVPN 安装以后,它给 Windows 系统安装了一个虚拟的网卡,并且这个网卡有自己的地址。默认安装的话,服务器的地址是 10.8.0.1

采用路由模式的网络架构:
1. 内网各电脑的 IP 是 192.168.1.x;
2. 使用一台电脑作为 OpenVPN 服务器,默认安装后的 VPN 地址是 10.8.0.1;
3. 假设这台服务器的内网 IP 是 192.168.1.123;OpenVPN 默认工作在 UDP 1194 端口(当然在做配置时也可以选择 TCP)。因此,设置局域网的出口 NAT 路由器的端口转发(有些路由器的配置界面上叫做虚拟服务器),将对公网的 UDP 1194 端口,映射到局域网的 192.168.1.123 的 UDP 1194 端口。这样外面进来的的 OpenVPN 的数据就可以到达 192.168.1.123 这台 OpenVPN 服务器。
4. 安装 OpenVPN 的电脑,都使用默认的 UDP 1194 端口,因此每台电脑都要设置防火墙允许外来的 UDP 包通过这个端口。
5. 内网的其它电脑,如果需要让外网的电脑通过 VPN 访问,就安装 OpenVPN 客户端,连接到 192.168.1.123 这台 OpenVPN 服务器电脑。作为客户端,它能够被服务器分配一个 VPN 的地址,默认是 10.8.0.x;
6. 因为多台电脑通过 OpenVPN 连接到同一个 OpenVPN 服务器,获得的 VPN 地址都是 10.8.0.x 段,因此可以互相通过 10.8.0.x 段的 IP 地址进行通讯。比如电脑A是 10.8.0.2, 另外一台电脑B是 10.8.0.6,则 A 可以 ping 通 10.8.0.6;假设 10.8.0.6 这台电脑上有一个 WEB SERVER,则可以通过 http://10.8.0.6 的方式访问到。通过 OpenVPN 的连接,此时外网电脑访问内网资源,就完全是局域网的方式了。

备注:办公室局域网的出口,是 ADSL;现在很多地方安装 ADSL,可能电信分配给你的 IP 地址本身就是电信的大局域网的地址而不是公网地址,那上述网络方案就不行了。解决办法是在公网上找一个服务器安装 OpenVPN Server。上述方案的前提是办公室局域网的出口的网络地址是公网 IP 地址。

以下的安装过程,是采用 OpenVPN 的默认的路由模式。


首先是服务器的安装,过程如下:


1. 在作为服务器的电脑上,安装 OpenVPN。也就是运行安装文件,等它自己跑完。安装服务器稍微特殊一点,在安装运行起来的第一个界面,Choose setup type 这里,选择 Customize 模式;也就是用户自定义安装。
2. 点了 Customize 按钮后,进入下一个界面,出来一堆选择,默认的都选择了,只剩下最底下的 OpenSSL,点它下拉开,底下是 EasyRSA,把这个也勾选上。也就是把所有东西都选上了。然后开始安装。服务器端安装 EasyRSA 是用来创建各种证书文件和key文件的。
3. 让它一路跑,就顺利安装完成。安装完成后软件默认位置 C:\Program Files\OpenVPN 目录。以下就简称为 VPN 目录。然后就开始配置,首先是创建证书文件和 key 文件;然后配置 config 文件。
4. 创建证书:在 VPN 目录底下,有一个 Easy-RSA 目录。打开命令行窗口,进入该目录,执行该目录下的一个 bat 文件:EasyRSA-Start.bat;执行后进入 EasyRSA 的(#)提示符状态,也就是光标前面有一个 # 号。
5. 在上述命令行提示符里面,输入命令: ./easyrsa build-ca nopass 回车二,生成无密码CA证书,生成过程中会要求输入证书名称,随意输入即可。生成的证书文件在 VPN 目录底下:easy-rsa\pki\ca.crt;这个 ca.crt 就是这个 OpenVPN 服务器的 ca 证书。
6. 创建服务器端证书,在上述命令行提示符后面,输入命令:./easyrsa build-server-full server nopass 创建无密码的服务器端证书。创建完成后的证书文件在:C:\Program Files\OpenVPN\easy-rsa\pki\issued 目录下。文件名叫 seerver.crt;
7. 为客户端创建证书,方法同上,输入命令:./easyrsa build-client-full client nopass (命令里面的 client 是客户端的名字,如果有多个客户端,想要区分,可以是 client1, client2);命令执行完毕后创建的证书文件同样是在 C:\Program Files\OpenVPN\easy-rsa\pki\issued  目录下,文件名是 client.crt (根据输入的客户端名字不同,可能是 client1.crt);
8. 创建 DH.pem 密钥交换文件:上述命令行提示符后面输入命令:./easyrsa gen-dh,创建好的文件是:在C:\ProgramFiles\OpenVPN\easy-rsa\pki\dh.pem
9. 创建好证书后,证书对应的 key 文件在:C:\Program Files\OpenVPN\easy-rsa\pki\private 目录里面。到此,创建证书完成。将来需要增加客户端证书,还可以通过这里描述的过程创建新的证书。
10. 开始配置服务器:C:\Program Files\OpenVPN\sample-config 目录下有服务器端配置文件模板 server.ovpn,把它拷贝到 C:\Program Files\OpenVPN\config 目录下,然后用文本编辑器打开,修改它的配置参数。

服务器配置文件修改:

0. 设置 OpenVPN 工作在路由模式。配置文件里面有两行:

;dev tap
dev tun

第一行 tap 前面是分号,注释掉。如果用 tap 就是桥接模式;第二行 tun 前面如果有注释就去掉注释,这里使用 tun 也就是路由模式。


1. 端口:port UDP 1194,找到这一行,如果前面有分号,去掉分号。配置里面,说明文字前面的 # 号。注释掉的参数,前面是分号。
2. 协议文件名,找到 dh2048.pem 去掉前面分号,修改为 dh.pem (也就是我们刚才创建的那个 dh.pem);
3. 运行多客户端使用同一个客户端证书,找到 ;duplicate-cn,去掉分号。
4. 找到 tls-auth ta.key 0 这一行,注释掉(前面加分号)。
5. 证书文件:把服务器端需要的证书文件 ca.crt, dh.pem, server.crt, server.key 都拷贝到 config 目录下。到这里,服务器端配置完成。
6. 启动服务器:安装 OpenVPN 后,Windows 底部工具栏右下方的一堆加载的程序的图标里面,有一个 OpenVPN 的图标。如果没有,就去启动 OpenVPN GUI 这个程序。右键点这个图标,在弹出菜单里面选择【连接】。如果连接成功,则说明服务器跑起来了。如果有问题,则检查前述的各种配置文件和配置参数。

总结:服务器端的配置,就是把 server.ovpn 这个配置参数文件放到 config 目录下,把服务器端的证书文件放到 config 目录下,就可以启动 OpenVPN 作为 VPN 服务器了。

客户端安装:


1. 在客户端机器上运行 OpenVPN 的安装文件,这次直接选择【Install now】按钮。因为客户端布需要安装 EasyRSA,不用特意去选择这个。一路跑完,就安装成功;
2. 客户端配置:把在服务器上为客户端创建的证书文件:ca.crt, client.crt, client.key 都拷贝到 config 目录底下;
3. 把 sample-config 目录下的 client.ovpn 文件拷贝到 config 目录底下,然后用文本编辑器打开编辑修改里面的参数。

客户端的参数配置文件修改:


1. 在配置文件里面找到: remote my-server-1 1194,将 my-server-1 修改为remote 服务器公网ip(如果客户端是局域网内部的电脑,可以直接写服务器的局域网 IP);
2. 找到 tls-auth ta.key 1,注释掉(前面加分号或者 # 号);
3. 关于这个客户端使用的证书文件,在配置文件里面找到 client.crt 等几行和证书文件有关的配置,修改为正确的文件名。如果前面创建客户端证书的时候使用的文件名是 client.crt 则无需修改。


启动客户端:和启动服务器端相同,右键 OpenVPN 的图标,弹出菜单里面选择【连接】。不出意外的话,连接成功。这时候,打开客户端电脑的命令行窗口,输入 ipconfig 命令,可以看到 IP 地址大概是 10.8.0.6 或者其它 10.8.0.x 的地址。在这里输入命令 ping 10.8.0.1 能够 ping 通。说明 OpenVPN 网络建立成功。

问题:服务器和客户端都连接成功了,但互相 ping 不通。


解决办法:用管理员模式打开命令行窗口,在里面输入命令:
netsh advfirewall firewall add rule name="Allow ICMPv4-In" protocol=icmpv4:8,any dir=in action=allow
执行完上述命令后,就能 ping 通了。亲测有效。

两台客户端电脑互相 ping 通

接下来,用同一套客户端证书,我在第二台电脑上,安装 OpenVPN 作为客户端,连接服务器成功。并且可以和服务器互相 ping 通。但是,两个客户端的电脑,一台是 10.8.0.6 一台是 10.8.0.14 互相不能 ping 通,也无法互相访问。网上搜了很多答案,有各种说法。其中一个说法最简单:服务器端配置文件里面有一行,client-to-client  默认是被注释的。打开这个注释。问题解决。

两台客户端电脑互通的问题解决后,不单单是能够互相 ping 通,从一台客户端电脑,使用另外一台客户端电脑的 VPN IP 地址去打开远程桌面,也是没有问题的。亲测有效。
也就是说,通过这样的配置,外网的电脑,可以远程桌面访问内网的任意一台电脑(前提:该内网电脑安装了 OpenVPN 并且连接到该内网的 OpenVPN 服务器);

如何设置客户端的 IP 为固定 IP

网络通了,另外一个问题来了:我怎么知道某台电脑的 VPN IP 是什么?每次它连接,它从服务器端获得的 VPN IP 都会变。
对于变化的 IP,可以采用类似 DDNS 的机制,让我们有办法通过查询的方式获知某台电脑当前的 IP;


另外一种方式:设置固定 IP;

如何给 OpenVPN 的客户端电脑设置固定 IP?网上查出来一堆文章,大概的意思是服务器端启用 ccd 功能(修改服务器端配置文件的:),然后在服务器端的 config 目录底下,建立一个子目录:ccd,然后,在这个 ccd 目录底下,为每个客户端创建一个以该客户端的名字(common Name)为文件名,没有后缀的文本文件,文件内容是:
说法一:ifconfig-push 10.8.0.10 10.8.0.9
说法二:ifconfig-push 10.8.0.10 2255.255.255.0

要启用 ccd 模式,服务器端配置文件的修改如下:
1. client-config-dir ccd
2. 在 ccd 文件夹底下为该客户端名字(common Name,也就是为该客户端创建客户端证书时使用的名字)为文件名(没有扩展名)的文件里面添加 ifconfig-push 10.8.0.10 10.8.0.9 则是为该客户端固定了 IP 为 10.8.0.10;

关于客户端的名字

启动 ccd 模式,就要求需要被固定 IP 的客户端,有个独立的名字,而不是都用 client 这个名字。这个名字不是简单修改客户端的名字,而是要为该客户端单纯创建证书。创建证书时的命令:./easyrsa build-client-full client nopass 里面的这个【client】就要改为其它名字,比如 client1 或者其它字符串。这个 client1 就是它的 common Name;因此,这个客户端的 config 底下,相应的证书文件和 key 文件就是用这条命令创建的 client1.crt 和 client1.key;对于的客户端的配置参数文件,文件名最好修改为 client1.ovpn,并且里面的内容,关于证书文件的地方,要从 client.crt 改为 client1.crt;client.key 改为 client1.key。
另外,客户端配置文件的开头,有一个【client】字符串作为名称,这个没必要改。我的理解,服务器端是根据客户端的证书来确认客户端的名字。


问 ChatGPT-4,给出的答案是说法二。
按照说法二提示,一定会出错,导致 OpenVPN 启动连接失败。错误提示如下:
There is a problem in your selection of --ifconfig endpoints [local=10.8.0.10, remote=255.255.255.0].  The local and remote VPN endpoints must exist within the same 255.255.255.252 subnet.  This is a limitation of --dev tun when used with the TAP-WIN32 driver.  Try 'openvpn --show-valid-subnets' option for more info.

实际上,按照说法一,后面两个 IP 地址也不能随便写,否则也会出现上述错误。

因为关系到【subnet】,网上查询到 OpenVPN 有如下命令,在命令行窗口执行一下,输出以下结果:
--------------------
C:\Program Files\OpenVPN\bin>openvpn --show-valid-subnets
On Windows, point-to-point IP support (i.e. --dev tun)
is emulated by the TAP-Windows driver.  The major limitation
imposed by this approach is that the --ifconfig local and
remote endpoints must be part of the same 255.255.255.252
subnet.  The following list shows examples of endpoint
pairs which satisfy this requirement.  Only the final
component of the IP address pairs is at issue.

As an example, the following option would be correct:
    --ifconfig 10.7.0.5 10.7.0.6 (on host A)
    --ifconfig 10.7.0.6 10.7.0.5 (on host B)
because [5,6] is part of the below list.

[  1,  2] [  5,  6] [  9, 10] [ 13, 14] [ 17, 18]
[ 21, 22] [ 25, 26] [ 29, 30] [ 33, 34] [ 37, 38]
[ 41, 42] [ 45, 46] [ 49, 50] [ 53, 54] [ 57, 58]
[ 61, 62] [ 65, 66] [ 69, 70] [ 73, 74] [ 77, 78]
[ 81, 82] [ 85, 86] [ 89, 90] [ 93, 94] [ 97, 98]
[101,102] [105,106] [109,110] [113,114] [117,118]
[121,122] [125,126] [129,130] [133,134] [137,138]
[141,142] [145,146] [149,150] [153,154] [157,158]
[161,162] [165,166] [169,170] [173,174] [177,178]
[181,182] [185,186] [189,190] [193,194] [197,198]
[201,202] [205,206] [209,210] [213,214] [217,218]
[221,222] [225,226] [229,230] [233,234] [237,238]
[241,242] [245,246] [249,250] [253,254]
--------------------------------------------------------

根据上述结果,这里需要两个 IP 地址配对。至于哪个放前面,哪个放后面,都不会出现错误提示,连接成功,当前客户端获得的 IP 是第一个。
ifconfig-push 10.8.0.10 10.8.0.9 //-- 这里的两个 IP 地址,第一个是 local,第二个是 remote
按照上面的配对的 IP 地址写入后,客户端能够启动连接,并且每次连接获得的地址都是 10.8.0.10 也就是为一个客户端设置固定IP成功。

https://fastyw.com/2023/01/10/openvpn%E5%AE%A2%E6%88%B7%E7%AB%AFping%E4%B8%8D%E9%80%9A/  这篇文章也提到子网的问题。


客户端的某台电脑开机自动连接 VPN;

问题描述:当前的 VPN 连接,是用户开机登录进入桌面后,在桌面右下角的 OpenVPN 图标右键点击菜单里面选择【连接】,它才建立和服务器的连接,获得 VPN 的 IP 地址。然后其它电脑才能通过 VPN 地址访问它。
如果我们想要那台电脑开机后自动连接 VPN 服务器,做以下操作:
1. 把客户端的配置文件从 config 文件夹,搬移到 config-auto 文件夹底下就可以了。
2. Windows 系统里面的 OpenVPN 服务(Windows Service),设置为自动启动。
做完上述操作,亲测,重新启动电脑后不登录,ping 它的 VPN IP 成功。说明它自动连接 VPN 了。
 

  • 34
    点赞
  • 84
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值