open vpn多客户端连接服务端配置

前言

本文提供多vpn客户端连接到公网vpn服务端的配置流程,从而建立位于不同局域网的客户端设备之间的网络连接。

服务端配置

服务端通常基于linux系统搭建,但不管是服务端还是客户端,都是通过openvpn来开启,只不过使用的配置文件不同

本教程中,服务端基于linux系统搭建,两个客户端分别基于linux和windows搭建,在下方链接中也提供windows配置openvpn服务端流程

1
2
# windows配置openvpn服务端
https://blog.eyyyye.com/article/39

安装openvpn

1
apt install -y openvpn

安装证书生成工具easy-rsa

1
apt install -y openvpn

制作证书

CA证书

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 进入openvpn文件夹
cd /etc/openvpn/

# 将easy-rsa文件夹复制到openvpn文件家下
cp -r /usr/share/easy-rsa/ /etc/openvpn/

# 进入/etc/openvpn/easy-rsa/目录下
cd /etc/openvpn/easy-rsa/

# 初始化目录
./easyrsa init-pki

# 创建根证书,添加“nopss”参数表示不加密
# 遇到“Common Name (eg: your user, host, or server name) [Easy-RSA CA]:”回车即可
./easyrsa build-ca nopass

image-20231117211116994

Server端证书

1
2
3
4
5
# 创建服务端证书,server111是自定义的服务端名称,中间遇到“Common Name (eg: your user, host, or server name) [server111]:”回车即可
./easyrsa gen-req server111 nopass

# 给服务端证书签名,中间遇到“ Confirm request details:”输入yes即可
./easyrsa sign-req server server111
1
2
# 使用build-server-full参数可直接完成上述创建证书和签名两个步骤
./easyrsa build-server-full server111 nopass
image-20231117211835352 image-20231117212008372

Client端-1证书

1
2
3
4
5
# 创建客户端证书,client1为自定义的客户端名称,执行过程中间回车即可
./easyrsa gen-req client1 nopass

# 给客户端证书签名,中间遇到“ Confirm request details:”输入yes即可
./easyrsa sign-req client client1
1
2
# 使用build-client-full参数可直接完成上述创建证书和签名两个步骤
./easyrsa build-client-full client1 nopass
image-20231117213031616 image-20231117213943937

Client端-2证书

1
2
3
4
5
# 创建客户端证书,client2为自定义的客户端名称,中间回车即可
./easyrsa gen-req client2 nopass

# 给客户端证书签名,中间遇到“ Confirm request details:”输入yes即可
./easyrsa sign-req client client2
1
2
# 使用build-client-full参数可直接完成上述创建证书和签名两个步骤
./easyrsa build-client-full client2 nopass

创建Diffie-Hellman

1
./easyrsa gen-dh
image-20231117213126070

创建TLS认证密钥

1
openvpn --genkey --secret ta.key
image-20231117213227353

整理所有证书到指定文件夹

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
mkdir /etc/openvpn/keys

cp /etc/openvpn/easy-rsa/ta.key /etc/openvpn/keys/

cp /etc/openvpn/easy-rsa/pki/ca.crt /etc/openvpn/keys

cp /etc/openvpn/easy-rsa/pki/dh.pem /etc/openvpn/keys

cp /etc/openvpn/easy-rsa/pki/issued/server111.crt /etc/openvpn/keys
cp /etc/openvpn/easy-rsa/pki/private/server111.key /etc/openvpn/keys

cp /etc/openvpn/easy-rsa/pki/issued/client1.crt /etc/openvpn/keys
cp /etc/openvpn/easy-rsa/pki/private/client1.key /etc/openvpn/keys

cp /etc/openvpn/easy-rsa/pki/issued/client2.crt /etc/openvpn/keys
cp /etc/openvpn/easy-rsa/pki/private/client2.key /etc/openvpn/keys

创建服务端配置文件

1
2
3
4
5
6
7
8
9
# 进入指定文件夹下,解压出server.conf
cd /usr/share/doc/openvpn/examples/sample-config-files
gzip -d /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz

# 复制server.conf到/etc/openvpn/keys
cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf /etc/openvpn/keys/

# server.conf配置文件内容如下,根据注释内容按实际情况修改
# ";"是注释符号,加";"的行不会起作用
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
;local a.b.c.d

port 1194

proto tcp
;proto udp

;dev tap
dev tun

;dev-node MyTap

# 如果执行openvpn开启命令时所在的路径就是下列文件的所在路径,只写文件名即可,否则需要写绝对路径
ca ca.crt
cert server111.crt
key server111.key
dh dh.pem

;topology subnet

server 10.8.0.0 255.255.255.0

ifconfig-pool-persist /var/log/openvpn/ipp.txt

;server-bridge 10.8.0.4 255.255.255.0 10.8.0.50 10.8.0.100

;server-bridge

;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

;push "redirect-gateway def1 bypass-dhcp"

;push "dhcp-option DNS 208.67.222.222"
;push "dhcp-option DNS 208.67.220.220"

;client-to-client

# 不允许多用户使用同一客户端证书
;duplicate-cn

keepalive 10 120

# 如果执行openvpn开启命令时所在的路径就是ta.key的所在路径,只写文件名即可,否则需要写绝对路径
tls-auth ta.key 0

cipher AES-256-CBC

;compress lz4-v2
;push "compress lz4-v2"

;comp-lzo

;max-clients 100

;user nobody
;group nogroup

persist-key
persist-tun

status /var/log/openvpn/openvpn-status.log

;log /var/log/openvpn/openvpn.log
log-append /var/log/openvpn/openvpn.log

verb 3

;explicit-exit-notify 1
1
2
3
4
# 服务端配置流程结束后,生成许多证书文件和配置文件,在此总结说明
# 经过上面的“整理所有证书到指定文件夹”步骤和“创建服务端配置文件”步骤,现在所有所需文件都集中到了“/etc/openvpn/keys”路径下

其中ta.key、ca.crt、dh.pem、server111.crt、server111.key、server.conf是服务端所需文件;ta.key、ca.crt、client1.crt(client2.crt)、client1.key(client2.key)是客户端1(客户端2)所需文件,需要拷贝到客户端设备中

客户端配置

1
客户端linux、windows皆可

安装openvpn

1
2
# linux
apt install -y openvpn
1
2
# windows
https://openvpn.net/community-downloads/

从服务端下载客户端所需证书文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 客户端1需要下列文件
ca.crt
ta.key
client1.crt
client1.key

#客户端2需要下列文件
ca.crt
ta.key
client2.crt
client2.key

# linux复制到/etc/openvpn/下
# windows复制到\openvpn\config\下

创建客户端配置文件

1
2
3
4
5
6
7
# linux中,在/etc/openvpn/下创建client1.ovpn或client2.ovpn
cd /etc/openvpn/
vim client1.ovpn

# windows中,在\openvpn\config\下创建client1.ovpn或client2.ovpn

# 配置文件内容如下,根据注释内容按实际情况修改
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
client
dev tun
proto tcp

# 服务端公网ip
remote 192.168.31.92 1194

resolv-retry infinite

nobind
persist-key
persist-tun

# 最好写绝对路径
ca ca.crt
cert client1.crt
key client1.key
tls-auth ta.key 1

key-direction 1

verb 5

开启服务端

1
2
3
4
5
6
# 进入server.conf所在目录下
# 开启服务端
openvpn --config server.conf &

# 打开日志显示,显示“Initialization Sequence Completed”即正常
tail -f /var/log/openvpn/openvpn.log
image-20231117221036814

开启客户端

Linux中开启

1
2
3
# 进入client1.ovpn所在目录下
# 开启客户端
openvpn --config client.ovpn
image-20231117221724520
1
成功开启并连接到服务端后,可查看vpn局域网IP
image-20231117221835264

Windows中开启

1
2
3
打开openvpn后,在任务栏中找到openvpn图标,右键选择“选项”,打开如下界面,并选择“高级”

在“配置文件”处选择存放客户端相关文件的文件夹路径,点击确定
image-20231117222757811
1
再次双击任务栏中openvpn图标,开始连接服务端,图标中电脑屏幕变绿即连接成功
image-20231117223011065
1
可查看vpn局域网ip

image-20231117223106838

客户端路由配置

1
两个客户端开启后都可以ping通服务端,但客户端互相不能ping通,需要添加vpn局域网网段路由
1
2
# linux系统中
route add -net 10.8.0.0 netmask 255.255.255.0 dev tun0
image-20231117223552737
1
2
3
# windows系统中
route add 10.8.0.0 mask 255.255.255.0 10.8.0.9
# 并关闭防火墙

image-20231117223919367

1
之后即可互相ping通
image-20231117224024677

image-20231117224040251