Windows 10 搭建 开放虚拟专用网络实验(客户端与服务端)

 说明:

本文只是学习研究,是用来对于国内公司员工出差远程连接公司进行办公的方法研究,并无翻墙之意,请读者遵守法律,科学上网。

本次实验是在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.key  

dh 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

  • 7
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
GatewayWorker 是一款基于PHP语言开发的高性能的TCP长连接框架,可以通过它来实现高并发的网络应用。而ThinkPHP是一款流行的PHP开发框架,提供了丰富的功能,包括MVC架构、ORM、模板引擎等等。 下面介绍如何使用ThinkPHP搭建GatewayWorker TCP客户端服务端。 ### 环境准备 - PHP 5.3以上版本(推荐PHP7) - GatewayWorker 3.0以上版本 - ThinkPHP 5.0以上版本 ### 客户端实现 在ThinkPHP的控制器中,我们可以使用GatewayClient类来实现对GatewayWorker服务端的连接和通信。以下是一个简单的示例: ```php use GatewayClient\Gateway; class IndexController extends \think\Controller { public function index() { Gateway::$registerAddress = '127.0.0.1:1238'; $client_id = Gateway::getClientIdByUid(1); Gateway::sendToClient($client_id, 'hello world'); } } ``` 在上面的代码中,我们首先设置了GatewayWorker服务端的注册地址,然后通过getClientIdByUid方法来获取客户端的连接ID,最后通过sendToClient方法向客户端发送消息。 ### 服务端实现 在ThinkPHP的控制器中,我们可以使用GatewayWorker的Gateway类来实现TCP服务端搭建和消息处理。以下是一个简单的示例: ```php use GatewayWorker\Gateway; class Test extends \think\Controller { public function index() { $gateway = new Gateway("websocket://0.0.0.0:7272"); $gateway->name = 'MyWebsocketGateway'; $gateway->count = 4; $gateway->onConnect = function($connection){ echo "new client connected\n"; }; $gateway->onMessage = function($connection, $data){ $connection->send('hello ' . $data); }; $gateway->onClose = function($connection){ echo "client closed\n"; }; $gateway->start(); } } ``` 在上面的代码中,我们首先创建了一个Gateway实例,并设置了监听地址和端口、名称、进程数等参数。然后我们定义了三个回调函数:onConnect、onMessage和onClose,分别处理客户端连接、消息接收和连接关闭的事件。最后我们调用start方法启动服务端。 ### 总结 本文介绍了如何使用ThinkPHP搭建GatewayWorker TCP客户端服务端。通过这种方式,我们可以很方便地实现高并发的网络应用。当然,GatewayWorker还提供了很多其他的功能,例如支持WebSocket协议、支持分布式部署等等。如果您想深入了解GatewayWorker的使用,可以参考官方文档。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值