OpenVPN之Linux端搭建

标签: Openvpn 分类: 软件 创建时间:2021-05-24 04:55:53 更新时间:2023-10-20 11:23:26

windows端成功搭建了OpenVPN虚拟专用网,本文主要写在linux上安装和配置服务端和客户端,使用yum安装的话,可能都是安装的3.x版本

1.服务端安装

执行下面的一系列操作,进行openvpn安装

1
2
3
4
5
6
7
yum install -y epel-release 
yum update -y
## 这里有些文章没有提到,根据需要安装
yum install -y openssl lzo pam openssl-devel lzo-devel pam-devel

yum install -y easy-rsa
yum install -y openvpn
参考文章:
1.CentOS 7 搭建OpenVPN服务器
2.Centos7.x 安装Openvpn详解 (这里有easy-rsa 3.x和2.x不同版本的配置)

2.生成服务端和客户端密钥

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
# easy-rsa 版本是3.x,直接从安装路径copy一份工具出来,放到etc/openvpn/server目录下,然后生成密钥
cp -rf /usr/share/easy-rsa/3.0.3 /etc/openvpn/server/easy-rsa
cd /etc/openvpn/server/easy-rsa
./easyrsa init-pki
./easyrsa build-ca nopass
## 无密码创建密钥,如果需要密码的话,就是把后面的nopass去掉
./easyrsa build-server-full server nopass

## 新增客户端,只需要执行下面的生成客户端密钥就可以了
./easyrsa build-client-full client1 nopass
./easyrsa build-client-full client2 nopass

./easyrsa gen-dh

## OpenVPN提供了TLS-auth功能,可以用来抵御Dos、UDP端口淹没攻击。出于安全考虑,你可以启用该功能;启用该功能,你需要执行以下命令
openvpn --genkey --secret ta.key

## 整理服务端证书
mkdir -p /etc/openvpn/server/
cp -a pki/ca.crt /etc/openvpn/server/
cp -a pki/private/server.key /etc/openvpn/server/
cp -a pki/issued/server.crt /etc/openvpn/server/
cp -a pki/dh.pem /etc/openvpn/server/

## 拷贝ta证书
cp -a ta.key /etc/openvpn/server/

## 客户端证书
mkdir -p /etc/openvpn/client/
cp -a pki/private/client1.key /etc/openvpn/client/
cp -a pki/issued/client1.crt /etc/openvpn/client/

3.创建目录

根据需要创建相应的用户密码,日志目录,在编写配置文件的时候,根据需要进行填写

1
2
3
4
5
6
# 日志存放目录
mkdir -p /var/log/openvpn/
# 用户管理目录
mkdir -p /etc/openvpn/server/user
# 配置权限
chown openvpn:openvpn /var/log/openvpn

4.生成服务端配置文件

服务端配置文件,在windows上安装的时候,会自动生成一个默认的server.ovpn和client.ovpn文件,但是在linux上没有生成,只能自己写了,/etc/openvpn/server/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
78
79
80
81
82
83
84
85
86
;表示openvpn服务端的监听地址
local 0.0.0.0

;监听的端口,默认是1194
port 1194

;使用的协议,有udp和tcp。建议选择tcp
proto tcp

;使用三层路由IP隧道(tun)还是二层以太网隧道(tap)。一般都使用tun
dev tun

;ca证书、服务端证书、服务端密钥和密钥交换文件。如果它们和server.conf在同一个目录下则可以不写绝对路径,否则需要写绝对路径调用
ca /etc/openvpn/server/ca.crt
cert /etc/openvpn/server/server.crt
key /etc/openvpn/server/server.key
dh /etc/openvpn/server/dh.pem

;vpn服务端为自己和客户端分配IP的地址池
;服务端自己获取网段的第一个地址(此处为10.8.0.1),后为客户端分配其他的可用地址。以后客户端就可以和10.8.0.1进行通信
;注意:该网段地址池不要和已有网段冲突或重复。其实一般来说是不用改的。除非当前内网使用了10.8.0.0/24的网段
server 10.9.0.0 255.255.255.0

;使用一个文件记录已分配虚拟IP的客户端和虚拟IP的对应关系,以后openvpn重启时,将可以按照此文件继续为对应的客户端分配此前相同的IP。也就是自动续借IP的意思。
ifconfig-pool-persist ipp.txt

;使用tap模式的时候考虑此选项
;server-bridge XXXXXX

;vpn服务端向客户端推送vpn服务端内网网段的路由配置,以便让客户端能够找到服务端内网。多条路由就写多个Push指令
;push "route 172.16.10.0 255.255.255.0"

;让vpn客户端之间可以互相看见对方,即能互相通信。默认情况客户端只能看到服务端一个人,默认是注释的,不能客户端之间相互看见
client-to-client

;允许多个客户端使用同一个VPN帐号连接服务端,默认是注释的,不支持多个客户登录一个账号
;duplicate-cn

;每10秒ping一次,120秒后没收到ping就说明对方挂了
keepalive 10 120

;加强认证方式,防攻击。如果配置文件中启用此项(默认是启用的)
;需要执行openvpn --genkey --secret ta.key,并把ta.key放到/etc/openvpn/server目录
;服务端第二个参数为0;同时客户端也要有此文件,且client.conf中此指令的第二个参数需要为1
tls-auth /etc/openvpn/server/ta.key 0

;选择一个密码。如果在服务器上使用了cipher选项,那么您也必须在这里指定它。注意,v2.4客户端/服务器将在TLS模式下自动协商AES-256-GCM。
cipher AES-256-CBC

;openvpn 2.4版本的vpn才能设置此选项。表示服务端启用lz4的压缩功能,传输数据给客户端时会压缩数据包
;Push后在客户端也配置启用lz4的压缩功能,向服务端发数据时也会压缩。如果是2.4版本以下的老版本,则使用用comp-lzo指令
compress lz4-v2
push "compress lz4-v2"

;启用lzo数据压缩格式。此指令用于低于2.4版本的老版本。且如果服务端配置了该指令,客户端也必须要配置
;comp-lzo

;并发客户端的连接数
max-clients 1000

;user nobody
;group nobody

;通过ping得知超时时,当重启vpn后将使用同一个密钥文件以及保持tun连接状态
persist-key
persist-tun

;在文件中输出当前的连接信息,每分钟截断并重写一次该文件
status openvpn-status.log

;默认vpn的日志会记录到rsyslog中,使用这两个选项可以改变。
;log指令表示每次启动vpn时覆盖式记录到指定日志文件中,
;log-append则表示每次启动vpn时追加式的记录到指定日志中。
;但两者只能选其一,或者不选时记录到rsyslog中
;如果设置了这个,那么在使用 openvpn --config 的时候,可能在控制台就不会立即显示日志了
log /var/log/openvpn/openvpn.log

;日志记录的详细级别
verb 3

;沉默的重复信息。最多20条相同消息类别的连续消息将输出到日志。
;mute 20


;当服务器重新启动时,通知客户端,以便它可以自动重新连接。仅在UDP协议是可用
;explicit-exit-notify 1

关于如何配置用户名密码登录,我这里就不写了,因为还要编写密码检查脚本。

5.启动服务

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
## 启动服务
## systemctl start openvpn.service,这个没有了,不知道为什么

openvpn --config /etc/openvpn/server/server.conf

## 后台启动
openvpn --daemon --config /etc/openvpn/server/server.conf

## 查看是否开启
ps -ef | grep 'open'
## nobody 19095 1 0 01:19 ? 00:00:00 /usr/local/openvpn/sbin/openvpn --config server.conf

## 查看端口
netstat -lntup | grep '19095'
## tcp 0 0 0.0.0.0:1194 0.0.0.0:* LISTEN 19095/openvpn

6.CentOS8上安装客户端

(1) 在Centos8上安装其实挺简单的
在Centos8上安装openvpn,使用dnf命令,Centos7使用yum命令安装。

1
2
3
4
5
6
## 安装依赖
dnf install epel-release -y
## 安装客户端
dnf install openvpn -y
## 安装密钥工具,单纯的客户端,可以不用安装这一步
dnf install easy-rsa

(2) 在服务器上生成客户端密钥:ca.crt、client.crt、client.key,复制到客户端的 /etc/openvpn/client 目录下。除了通过拷贝的文件的方式之外,还可以将ca.crt、client.crt和client.key的内容都复制到.ovpn文件中,只需要将ca,crt,key节点换成

1
2
3
4
5
6
7
8
9
10
11
12
13
<ca>
ca.crt 文件内容
</ca>
<cert>
client.crt 文件内容
</cert>
<key>
client.key 文件内容
</key>

<tls-auth>
ta.key 文件内容
</tls-auth>

(3) 编辑client.conf,指定ca、key、crt等参数,复制到 /etc/openvpn/client 目录下ps

(4) 在 /etc/openvpn/client 目录下启动

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
## 启动
openvpn --config client.conf

## 后台启动
openvpn --daemon --config /etc/openvpn/client/client.conf

--daemon # 后台运行
--cd # 配置文件目录路径
--config # 配置文件名称
--auth-user-pass # 指定账号密码文件
--log-append # 日志文件


## 查看ip地址
ifconfig tun0
## 没有ifconfig
yum install net-tools

查了很多的资料,发现为什么没有地方说如何关闭linux的openvpn客户端的呢?

1
sudo pkill openvpn

7.客户端配置文件

文件名 windows为client.ovpn,Linux为client.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
client

dev tun
;远程服务协议
proto tcp

;远程服务地址和端口
remote 10.0.0.190 1194

resolv-retry infinite
nobind

;user nobody
;group nobody

persist-key
persist-tun

ca ca.crt
cert client.crt
key client.key

remote-cert-tls server

tls-auth ta.key 1

cipher AES-256-CBC
compress lz4-v2
verb 3
;mute 20
参考文章:
1.OpenVPN client端配置文件详细说明(转)
2.Centos7 搭建OpenVPN 基于证书认证 服务端,windows10客户端、苹果客户端等等配置

为了实现访问,可能需要远程服务器的防火墙,或者是阿里云的安全组要相应的开启

参考文章:
1.OpenVPN 使用账号+密码方式登陆 (编写checkpsw.sh脚本,配置服务端auth-user-pass-verify,配置客户端auth-user-pass,输入密码登录)
2.OpenVPN 设置账号密码登录 (和上面基本一致)

问题

(1) 丢包问题
不知道为什么,使用linux客户端总是会有很高的丢包率。当我使用ifconfig命令查看的时候,发现了两个tun0,所以将openvpn客户端停止,然后重启一个客户端就可以了。

参考文章:
1.如何排查 VPN 连接上的数据包丢失问题? (我没有用这个方法)
2.解决openvp丢包问题 (这里提到了服务端将同一个ip分配给了不同的两台服务器,我就想是不是这个问题,果然有两个客户端启动了。)
3.CentOS7部署OpenVPN实现内网互通 (用户管理脚本)

(2) error: packet HMAC authentication failed
认证错误

(3) SIGINT[hard,init_instance] received, process exiting
注意可能还是上面的问题,就是用户认证的部分,这个时候还是要处理好ta.key文件的位置问题

7.Ubuntu系统安装

1
2
3
## 安装依赖
sudo apt-get install openssl libssl-dev
sudo apt-get install lzop
参考文章:
1.3分钟快速在 Ubuntu 上安装 OpenVPN (下载了源码,使用源码安装的)
2.Ubuntu 搭建 OpenVPN 服务 (使用apt-get安装和配置的openvpn)
小额赞助
本人提供免费与付费咨询服务,感谢您的支持!赞助请发邮件通知,方便公布您的善意!
**光 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.
幸福是年华的沉淀,微笑是寂寞的悲伤。