Centos 架设 openvpn

安装 openvpn 和 easyrsa

可以直接从 yum 安装,也可以通过源码安装。下面以 yum 安装为例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 首先安装 epel 源,如果已经安装可以省略
yum install epel-release

# yum 安装,简单粗暴
yum install openvpn easyrsa

# 安装完成后,默认的服务无法正常加载
# 首先将其重命名
mv /usr/lib/systemd/system/openvpn\@.service /usr/lib/systemd/system/openvpn.service
# 编辑服务配置文件
vim /usr/lib/systemd/system/openvpn.service
# 将 ExecStart 所在行的内容替换为下列内容
# ExecStart=/usr/sbin/openvpn --cd /etc/openvpn/server --config server.conf
# 重新加载服务
systemctl daemon-reload
# 设置服务为自动启动
systemctl enable openvpn
# 启动服务
systemctl start openvpn

生成服务器证书

利用 easyrsa 生成服务器端所需证书,具体操作如下:

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
# 切换到 openvpn 目录下
cd /etc/openvpn
# 拷贝 easyrsa 相关目录
cp -r /usr/share/easy-rsa/3.0.8/ ./easy-rsa
# 进入 easyrsa 目录开始操作
cd easy-rsa
# 编辑参数设置文件
vim vars
# 输入以下内容
# 国家简称
set_var EASYRSA_REQ_COUNTRY "CN"
# 省份名称
set_var EASYRSA_REQ_PROVINCE "ChongQing"
# 城市名称
set_var EASYRSA_REQ_CITY "ChongQing"
# 所属组织
set_var EASYRSA_REQ_ORG "OpenVPN CA"
# 联系邮箱
set_var EASYRSA_REQ_EMAIL "[email protected]"
# 所属单位
set_var EASYRSA_REQ_OU "xxx"
# 密钥长度
set_var EASYRSA_KEY_SIZE 2048
# 密钥算法
set_var EASYRSA_ALGO rsa
# CA证书过期时间,单位:天
set_var EASYRSA_CA_EXPIRE 36500
# 签发证书过期时间,单位:天
set_var EASYRSA_CERT_EXPIRE 36500

# 初始化 pki 目录
./easyrsa init-pki
# 创建 CA 根证书,过程中需要输入密码,
# 以后签发证书时会使用该密码,
# common name 可以输入一个方便记忆的名称
./easyrsa build-ca

# 签发服务器证书
./easyrsa build-server-full server nopass
# 创建 Diffie Hellman 参数
./easyrsa gen-dh
# 拷贝服务器端所需要的文件
cp pki/issued/server.crt ../server/
cp pki/private/server.key ../server/
cp ca.crt ../server/
cp dh.pem ../server/

# 生成 ta.key 文件
cd ../server
openvpn --genkey --secret ta.key

生成客户端证书

下列操作均需要输入 ca 的密码,请根据提示操作:

1
2
3
4
5
# 生成 cn 为 somebody 的证书,并且不需要密码
./easyrsa build-client-full somebody nopass

# 生成 cn 为 somebody2 的证书,并且需要输入密码
./easyrsa build-client-full somebody2

创建服务器端配置

1
2
cd /etc/openvpn/server
vim 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
server
# 监听地址
local 0.0.0.0

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

# 使用的协议,可选值为 udp 和 tcp
proto tcp

# 隧道模式,可选值为 tun 和 tap,服务器和客户端设置须为一致
dev tun

# 证书路径
ca ca.crt
cert server.crt
key server.key
dh dh.pem
# tls 握手阶段使用的证书,其中第二个参数在服务器端值为 0,客户端值为 1
tls-auth ta.key 0

# IP 池配置,服务器将占用第一个 IP(10.8.0.1),需要注意的是,该网段不能和现有网段重复以免造成冲突
server 10.8.0.0 255.255.255.0

# 记录客户端的 IP 地址
ifconfig-pool-persist ipp.txt

# 允许客户端之前互相可以访问
client-to-client

# 允许同一个用户从多个设备同时登录
duplicate-cn

# 心跳检测,每 10 秒检测一次,120 秒连接超时
keepalive 10 120

# 密码格式
cipher AES-256-CBC

# 压缩算法
compress lz4-v2
push "compress lz4-v2"

# 客户端并发连接数
max-clients 100

# 客户端超时重连时使用之前的证书和隧道连接状态
persist-key
persist-tun

# 记录连接信息文件
status openvpn-status.log

# 日志记录方式,以下选项二选一,如果都不选,则将日志写入 rsyslog
# 以覆盖方式写入指定文件
;log openvpn.log
# 以追加方式写入指定文件
;log-append openvpn.log

# 日志记录等级,0:静默,只记录严重错误;4:合理的普通信息;5、6:可以用来调试连接上遇到的问题;9:啰嗦模式
verb 3

# 设置最多输出连续 20 条的相同信息
;mute 20

# 通知客户端服务器端重启完毕以便重连,仅用于 udp 模式下
explicit-exit-notify 1

如果需要指定客户端的 IP,还可以增加以下配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 创建并进入客户端配置目录
mkdir -p /etc/openvpn/client
cd /etc/openvpn/client

# 指定 cn 名为 somebody 的客户端的 IP
echo "ifconfig-push 10.8.0.4 255.255.255.0" > somebody
# 指定 cn 名为 somebody2 的客户端的 IP
echo "ifconfig-push 10.8.0.8 255.255.255.0" > somebody2

# 修改服务器端配置
vim /etc/openvpn/server/server.conf
# 注释以下配置
;ifconfig-pool-persist ipp.txt
# 增加以下配置
client-config-dir /etc/openvpn/client
topology subnet
# 保存并退出

以上配置完成后就可以正常启动服务了,常用命令如下:

1
2
3
4
5
6
7
8
9
10
11
# 查看服务状态
systemctl status openvpn

# 启动服务
systemctl start openvpn

# 停止服务
systemctl stop openvpn

# 重启服务
systemctl restart openvpn

配置客户端

下面以 somebody2 为例,演示如何配置客户端。

客户端需要的文件如下:

  1. /etc/openvpn/easy-rsa/pki/ca.crt
  2. /etc/openvpn/easy-rsa/pki/issued/somebody2.crt
  3. /etc/openvpn/easy-rsa/pki/private/somebody2.key
  4. client.ovpn(手动编辑)

其中 client.ovpn 文件的内容参考如下:

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
# 说明该配置是客户端
client

# 使用 tun 隧道,必须与服务器端保持一致
dev tun

# 使用协议,必须与服务器端保持一致
proto tcp

# 服务器 IP 地址和端口
remote 124.70.9.171 1194

# 解析服务器地址次数,设置为无限则表示每次连接时均重新解析
resolv-retry infinite

# 不绑定端口
nobind

# 超时重连时使用之前的证书和隧道连接状态
persist-key
persist-tun

# 证书所在路径
ca ca.crt
cert dev.crt
key dev.key
tls-auth ta.key 1

# 远端证书通过服务器验证
remote-cert-tls server

# 密码格式,必须与服务器端保持一致
cipher AES-256-CBC

# 压缩算法,必须与服务器端保持一致
compress lz4-v2

# 日志记录等级,0:静默,只记录严重错误;4:合理的普通信息;5、6:可以用来调试连接上遇到的问题;9:啰嗦模式
verb 3

编辑保存后即可使用 openvpn 客户端导入连接了。