虎泰克博客

centos7搭建openvpn服务器


OpenVPN 服务端安装配置由于不同环境及软件版本命令使用略有差异,特别是 easy-rsa 的使

OpenVPN 服务端安装配置

由于不同环境及软件版本命令使用略有差异,特别是 easy-rsa 的使用在 2.0 和 3.0 的差别有点大,所以在此先说明下安装环境及相关软件版本:

  • 系统平台:Centos7
  • OpenVPN 版本:2.4.9
  • easy-rsa 版本:3.0.7

尽管不同环境及软件版本命令使用略有所差异,但是整个搭建过程都是一致的

安装相关软件—>生成相关证书:CA 根证书、服务器证书—>配置 open VPN 服务端—>添加防火墙规则:snat—>启动 open VPN 服务端—>创建一个用户测试连接:创建客户端 CA 证书、生成 .ovpn 配置文件、打包相关文件供客户端使用。

安装 openvpn、easy-rsa、iptables-services

1
2
yum -y install epel-release
yum -y install openvpn easy-rsa iptables-services

使用 easy-rsa 生成需要的证书及相关文件,在这个阶段会产生一些 key 和证书:

  • CA 根证书
  • OpenVPN 服务器 ssl 证书
  • Diffie-Hellman 算法用到的 key

将 easy-rsa 脚本复制到/etc/openvpn/,该脚本主要用来方便地生成 CA 证书和各种 key

1
cp -r /usr/share/easy-rsa/ /etc/openvpn/

进入 easy-rsa 目录并编辑 vars 文件,添加一些生成证书时用到的变量

1
2
3
4
5
6
7
8
9
10
cd /etc/openvpn/easy-rsa/3.0.7/
vi vars # 没这个文件的话新建,填写如下内容(变量值根据实际情况随便填写):

export KEY_COUNTRY="china"
export KEY_PROVINCE="shanghai"
export KEY_CITY="shanghai"
export KEY_ORG="bwcx"
export KEY_EMAIL="1624717019@qq.com"

source ./vars # 使变量生效

生成 CA 根证书

1
2
./easyrsa init-pki    #初始化 pki 相关目录
./easyrsa build-ca nopass #生成 CA 根证书, 输入 Common Name,名字随便起。

生成 OpenVPN 服务器证书和密钥
第一个参数 server 为证书名称,可以随便起,比如 ./easyrsa build-server-full openvpn nopass

1
./easyrsa build-server-full server nopass

生成 Diffie-Hellman 算法需要的密钥文件

1
./easyrsa gen-dh   #创建Diffie-Hellman,这可能得等一小会儿

生成 tls-auth key,这个 key 主要用于防止 DoS 和 TLS 攻击,这一步其实是可选的,但为了安全还是生成一下,该文件在后面配置 open VPN 时会用到。

1
openvpn --genkey --secret ta.key

将上面生成的相关证书文件整理到/etc/openvpn/server/certs(这一步完全是为了维护方便)

1
2
3
4
5
6
mkdir /etc/openvpn/server/certs && cd /etc/openvpn/server/certs/
cp /etc/openvpn/easy-rsa/3/pki/dh.pem ./ # SSL 协商时 Diffie-Hellman 算法需要的 key
cp /etc/openvpn/easy-rsa/3/pki/ca.crt ./ # CA 根证书
cp /etc/openvpn/easy-rsa/3/pki/issued/server.crt ./ # open VPN 服务器证书
cp /etc/openvpn/easy-rsa/3/pki/private/server.key ./ # open VPN 服务器证书 key
cp /etc/openvpn/easy-rsa/3/ta.key ./ # tls-auth key

创建 open VPN 日志目录

1
2
mkdir -p /var/log/openvpn/
chown openvpn:openvpn /var/log/openvpn

配置 OpenVPN

创建一个新的配置文件cd /etc/openvpn/
vi server.conf 填入如下内容(很多配置项不需要特别了解,重要的配置这里注释出来了,其他相关配置项想了解的话见 这里):
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
port 1194   # 监听的端口号
proto udp # 服务端用的协议,udp 能快点,所以我选择 udp
dev tun
ca /etc/openvpn/server/certs/ca.crt # CA 根证书路径
cert /etc/openvpn/server/certs/server.crt # open VPN 服务器证书路径
key /etc/openvpn/server/certs/server.key # open VPN 服务器密钥路径,This file should be kept secret
dh /etc/openvpn/server/certs/dh.pem # Diffie-Hellman 算法密钥文件路径
tls-auth /etc/openvpn/server/certs/ta.key 0 # tls-auth key,参数 0 可以省略,如果不省略,那么客户端
# 配置相应的参数该配成 1。如果省略,那么客户端不需要 tls-auth 配置
server 10.8.0.0 255.255.255.0 # 该网段为 open VPN 虚拟网卡网段,不要和内网网段冲突即可。open VPN 默认为 10.8.0.0/24
push "dhcp-option DNS 8.8.8.8" # DNS 服务器配置,可以根据需要指定其他 ns
push "dhcp-option DNS 8.8.4.4"
push "redirect-gateway def1" # 客户端所有流量都通过 open VPN 转发,类似于代理开全局
compress lzo
duplicate-cn # 允许一个用户多个终端连接
keepalive 10 120
comp-lzo
persist-key
persist-tun
user openvpn # open VPN 进程启动用户,openvpn 用户在安装完 openvpn 后就自动生成了
group openvpn
log /var/log/openvpn/server.log # 指定 log 文件位置
log-append /var/log/openvpn/server.log
status /var/log/openvpn/status.log
verb 3
explicit-exit-notify 1

防火墙相关配置(使用 iptables 添加 snat 规则)
禁用 Centos7 默认的 firewalld,使用经典的 iptables 防火墙管理软件:

1
2
systemctl stop firewalld
systemctl disable firewalld

禁用 SELinux

1
2
setenforce 0
sed -i ‘s/SELINUX=enforcing/SELINUX=disabled/g’ /etc/selinux/config

启用iptables

1
2
3
systemctl enable iptables
systemctl start iptables
iptables -F # 清理所有防火墙规则

添加防火墙规则,将 openvpn 的网络流量转发到公网:snat 规则

1
2
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -j MASQUERADE
iptables-save > /etc/sysconfig/iptables # iptables 规则持久化保存

Linux 服务器启用地址转发

1
2
echo net.ipv4.ip_forward = 1 >> /etc/sysctl.conf
sysctl -p # 这一步一定得执行,否则不会立即生效。

启动 open VPN

1
2
3
systemctl start openvpn@server  # 启动
systemctl enable openvpn@server # 开机自启动
systemctl status openvpn@server # 查看服务状态

添加一个 OpenVPN 用户

其实创建用户的过程就是生成客户端 SSL 证书的过程,然后将其他相关的证书文件、key、.ovpn 文件(客户端配置文件)打包到一起供客户端使用。由于创建一个用户的过程比较繁琐,所以在此将整个过程写成了一个脚本 ovpn_user.sh,脚本内容比较简单,一看就懂:

首先创建一个客户端配置模板文件 sample.ovpn,该文件在脚本中会用到,放到/etc/openvpn/client/目录,内容如下:
sample.ovpn:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
client
proto udp
dev tun
remote [open VPN服务端公网 ip,根据实际情况填写] 1194
ca ca.crt
cert server.crt
key server.key
tls-auth ta.key 1
remote-cert-tls server
persist-tun
persist-key
comp-lzo
verb 3
mute-replay-warnings

下面为创建 open VPN 用户脚本:
./ovpn_user.sh:

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
# ! /bin/bash

set -e

OVPN_USER_KEYS_DIR=/etc/openvpn/client/keys
EASY_RSA_VERSION=3
EASY_RSA_DIR=/etc/openvpn/easy-rsa/
PKI_DIR=$EASY_RSA_DIR/$EASY_RSA_VERSION/pki

for user in "$@"
do
if [ -d "$OVPN_USER_KEYS_DIR/$user" ]; then
rm -rf $OVPN_USER_KEYS_DIR/$user
rm -rf $PKI_DIR/reqs/$user.req
sed -i '/'"$user"'/d' $PKI_DIR/index.txt
fi
cd $EASY_RSA_DIR/$EASY_RSA_VERSION
# 生成客户端 ssl 证书文件
./easyrsa build-client-full $user nopass
# 整理下生成的文件
mkdir -p $OVPN_USER_KEYS_DIR/$user
cp $PKI_DIR/ca.crt $OVPN_USER_KEYS_DIR/$user/ # CA 根证书
cp $PKI_DIR/issued/$user.crt $OVPN_USER_KEYS_DIR/$user/ # 客户端证书
cp $PKI_DIR/private/$user.key $OVPN_USER_KEYS_DIR/$user/ # 客户端证书密钥
cp /etc/openvpn/client/sample.ovpn $OVPN_USER_KEYS_DIR/$user/$user.ovpn # 客户端配置文件
sed -i 's/admin/'"$user"'/g' $OVPN_USER_KEYS_DIR/$user/$user.ovpn
cp /etc/openvpn/server/certs/ta.key $OVPN_USER_KEYS_DIR/$user/ta.key # auth-tls 文件
cd $OVPN_USER_KEYS_DIR
zip -r $user.zip $user
done
exit 0

执行上面脚本创建一个用户:sh ovpn_user.sh,会在/etc/openvpn/client/keys目录下生成以用户名命名的 zip 打包文件压缩包里面文件有如下,示例:

1
2
3
4
5
6
.
├── ca.crt
├── username.crt
├── username.key
├── username.ovpn
└── ta.key

删除一个 OpenVPN 用户

上面我们知道了如何添加一个用户,那么如果公司员工离职了或者其他原因,想删除对应用户 OpenVPN 的使用权,该如何操作呢?其实很简单,OpenVPN 的客户端和服务端的认证主要通过 SSL 证书进行双向认证,所以只要吊销对应用户的 SSL 证书即可。

为了方便,也将上面步骤整理成了一个脚本,可以一键删除用户:
del_ovpn_user.sh

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# ! /bin/bash

set -e
OVPN_USER_KEYS_DIR=/etc/openvpn/client/keys
EASY_RSA_VERSION=3
EASY_RSA_DIR=/etc/openvpn/easy-rsa/
for user in "$@"
do
cd $EASY_RSA_DIR/$EASY_RSA_VERSION
echo -e 'yes\n' | ./easyrsa revoke $user
./easyrsa gen-crl
# 吊销掉证书后清理客户端相关文件
if [ -d "$OVPN_USER_KEYS_DIR/$user" ]; then
rm -rf $OVPN_USER_KEYS_DIR/${user}*
fi
systemctl restart openvpn@server
done
exit 0

使用

下载页面

OpenVPN Windows客户端。下载页面

Mac 下推荐使用 Tunnelblick。Tunnelblick 是一个开源、免费的 Mac 版 open VPN 客户端软件。下载页面

参考链接:

https://i4t.com/4481.html

https://qhh.me/2019/06/16/Cenos7-下搭建-OpenVPN-过程记录



Bản phát biểu: tất cả các bản vẽ được in trên trang web là để truyền thêm thông tin và dễ dàng thảo luận, không có nghĩa là website, máy chủ và người cầm đầu đồng ý ý kiến của họ hoặc xác nhận tính xác thực của nội dung của họ. Nội dung các bài báo chỉ có liên quan. Nếu quyền của tác giả gốc bị vi phạm, xin liên lạc với quản trị website.

Ký vào để ghi chú

Ghi chú

    Không có dữ liệu