前言

本文档由陈德2020年4月25日星期六开始整理而成。

这里部署的环境基于OpenVPN 2.4.X等后续版本。

第一部分:OpenVPN 3.X的安装和制作证书

  1. OpenVPN的安装

安装很简单,zypper in opevpn 即可

还要找到证书制作的工具包:easy-rsa,可以去官网下载,有2.X和3.X的版本,制作证书的过程差异比较大。我们这里采用最新的3.0.8版本制作证书。

用zypper或者yum安装easy-rsa的包,或者到官网下载:

https://github.com/OpenVPN/easy-rsa/releases

  1. 证书制作

这里记录下OpenVPN证书的生成配置过程,我们先将程序copy到两个不同的目录,一个当做server,另一个当做client。

总结:实际就是按照下面这个顺序,依次执行脚本即可。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
server:

./easyrsa init-pki
./easyrsa build-ca nopass
./easyrsa gen-req server nopass
./easyrsa sign server server
./easyrsa gen-dh

client:

./easyrsa init-pki
./easyrsa gen-req client001 nopass
./easyrsa gen-req client002 nopass
./easyrsa gen-req clientxxx nopass

server:

./easyrsa import-req ../../client/3.0.7/pki/reqs/client001.req client001
./easyrsa sign client client001

参考:

https://blog.rj-bai.com/post/136.html

先到server端:

img

img

img

img

img

img

到 client 端执行:

img

img

上面开始手工添加很多个客户端。

之后回到 server:

img

img

img

img

第二部分:OpenVPN网络互通配置关键技巧

  1. 路由转发的设置(这是很常见的服务)

#记住,一定要在OpenVPN Server上面加入下面的转发设置,

#否则客户端无法访问服务器内网其它机器。

#echo 1 > /proc/sys/net/ipv4/ip_forward

同时服务器一定要加:/etc/sysctl.conf net.ipv4.ip_forward = 1

  1. 一个典型的配置

这里截图是一个典型的服务器端配置:

img

一般不要开启,duplicate-cn,这样一个证书就不能同时登录了。

如果客户端想要固定IP地址,可以在ccd文件夹中创建客户端名称对应的文件,里面加入对固定IP的设置,ipp.txt的方式可能过时了,有时候不起作用。ccd文件夹中的IP配置如下:

img

对应客户端的配置文件:

img

这里客户端的IP地址可以配置多个,客户端会自动检测一个可用的连接上。这样可以实现VPN的高可用功能。

  1. 更复杂的互联互通

参考:

http://www.linuxfly.org/post/86/ https://www.bbsmax.com/A/GBJrl93qd0/ https://www.ilanni.com/?p=9847 http://blog.chinaunix.net/uid-31139844-id-5757034.html

A. 给所有客户端加路由:

img

在server.conf中加入上面的语句,所有客户端都可以访问服务器内网段10.10.200.xxx和10.10.11.xxx的服务器了。

B. 只给特定的客户端加特定的路由:

如果把server.conf中的路由去掉,而在ccd配置文件中给某个单独的客户端证书加入路由,这样可以实现只有具体的客户端能通服务器的内网网段。比如下面client001的证书:

img

注意:这个不能作为安全控制方式,client001没有自动添加路由信息的话,客户端使用者可以在自己的pc上手工加入路由信息,一样能通服务器内网段机器。如果想要控制访问,最好的办法可能还是利用防火墙。

C. 如果客户端是windows系统,固定IP只能指定对应的值:

为了兼容Windows的TAP驱动,所以每对tun都必须在/30子网中,如下列表:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
 [ 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]

第三部分:常见问题

如何吊销其中一个证书

新版的openvpn比较简单,比如我们吊销掉client004的证书:

1
2
3
4
# cd /openvpn/easy-rsa/server/3.0.7

./easyrsa revoke client004
./easyrsa gen-crl

上面进入server端的证书安装目录,执行2条语句就行了。

image-20210831193032747

将生成的crl.pem文件copy出来,放在openvpn服务器端的相应目录,之后修改配置文件,重启openvpn即可。

1
2
3
4
5
# openvpn服务器server.conf加入下面的配置
crl-verify  /etc/openvpn/ccd/crl.pem

# 在服务器的连接日志文件中可以看到下面的提示,该证书已被吊销
VERIFY ERROR: depth=0, error=certificate revoked: CN=client004

错误CRL has expired

有一次周末突然所有VPN都连接不上了,吓出一身冷汗,上Server端查看日志出现如下提示:

VERIFY ERROR: depth=0, error=CRL has expired

上网查询发现是server端引入了吊销的机制,加入了crl-verify /etc/openvpn/ccd/crl.pem这个一行配置文件;这里的crl.pem默认是有有效期的,系统默认是180天。大家可以查看varseasyrsa这两个文件,搜索CRL_DAYS关键字就可以看到配置的默认是180天了。

解决办法两个:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# 方法1
# 将配置文件中的crl-verify  /etc/openvpn/ccd/crl.pem 注释掉,然后重启openvpn server
# 此方法导致你以前吊销部分凭证的功能失效了。出现安全隐患,不推荐使用。

# 方法2
# 修改上面 vars 和 easyrsa 文件中的参数,由 180 天改成 3650天
set_var EASYRSA_CRL_DAYS        3650
# 然后命令重新生成 crl.pem 文件 
./easyrsa gen-crl
# 将新生成的crl.pem文件内容更新 /etc/openvpn/ccd/crl.pem 文件,重启openvpn server

参考:

https://developer.aliyun.com/article/808039

(完)