CentOS 7下OpenVPN 2.4.8安装配置详解
CentOS 7下OpenVPN 2.4.8安装配置详解
本文将详细介绍如何在CentOS 7系统上安装和配置OpenVPN 2.4.8。文章内容包括环境准备、服务器配置、用户管理以及客户端配置等步骤。
1. 安装环境
注意:公司网络必须有公网IP,尽量是静态公网IP,动态公网IP慎用(由于的动态IP会随时发生改变,客户端也要跟着进行修改)。
名称 | 版本 | 说明 |
---|---|---|
系统 | Centos 7.7.1908 | centos7各个版本差别不大 |
OpenVPN | 2.4.8 | |
easy-rsa | 3.0.3 |
2. OpenVPN 服务器安装配置
(1)环境配置
关闭防火墙:
$ systemctl disable firewalld
$ systemctl stop firewalld
禁用 SElinux:
$ sed -i "/^SELINUX/s/enforcing/disabled/" /etc/selinux/config
$ setenforce 0
开启转发:
$ echo net.ipv4.ip_forward = 1 >> /etc/sysctl.conf
$ sysctl -p # 配置生效,如果还是出现IP无法转发的情况,请重启电脑
(2)安装软件
$ yum -y install epel-release
$ yum -y install openvpn easy-rsa
(3)生成 OpenVPN 所需证书以及文件
生成 CA 根证书:
$ cp -r /usr/share/easy-rsa/ /etc/openvpn/
$ cd /etc/openvpn/easy-rsa/3/
$ vim vars # 该文件不存在的话,新建
export KEY_COUNTRY="China"
export KEY_PROVINCE="HeNan"
export KEY_CITY="ZhenZhou"
export KEY_ORG="xiodi"
export KEY_EMAIL="ca@aishangwei.net"
$ source ./vars # 导入变量
$ ./easyrsa init-pki # 初始化 pki相关目录
$ ./easyrsa build-ca nopass # 不需要密码,生成 CA 根证书
生成 OpenVPN 服务器证书和密钥:
./easyrsa build-server-full server nopass # server 为证书名称,可随意写
生成 Diffie-Hellman 算法需要的密钥文件:
./easyrsa gen-dh # 耐心等待一会
生成 tls-auth Key,主要用来防止 Dos 和 TLS 攻击(可选):
$ openvpn --genkey --secret ta.key
日志目录配置:
$ mkdir -p /var/log/openvpn
$ chown openvpn:openvpn /var/log/openvpn
相关文件整理(为了维护方便):
$ mkdir /etc/openvpn/server/certs && cd /etc/openvpn/server/certs/
$ cp /etc/openvpn/easy-rsa/3/pki/{dh.pem,ca.crt} ./
$ cp /etc/openvpn/easy-rsa/3/pki/issued/server.crt ./
$ cp /etc/openvpn/easy-rsa/3/pki/private/server.key ./
$ cp /etc/openvpn/easy-rsa/3/ta.key ./
(4)配置 OpenVPN
openvpn 启动配置文件:
$ vim /etc/openvpn/server.conf
port 1194
proto udp
dev tun
ca /etc/openvpn/server/certs/ca.crt
cert /etc/openvpn/server/certs/server.crt
key /etc/openvpn/server/certs/server.key
dh /etc/openvpn/server/certs/dh.pem
tls-auth /etc/openvpn/server/certs/ta.key 0
server 10.8.0.0 255.255.255.0
ifconfig-pool-persist ipp.txt
push "route 192.168.10.0 255.255.255.0"
push "route 192.168.20.0 255.255.255.0"
push "route 192.168.30.0 255.255.255.0"
push "route 192.168.40.0 255.255.255.0"
push "route 172.31.115.0 255.255.255.0"
push "dhcp-option DNS 192.168.20.250"
push "dhcp-option DNS 114.114.114.114"
compress lzo
duplicate-cn
keepalive 10 120
comp-lzo
persist-key
persist-tun
user openvpn
group openvpn
log /var/log/openvpn/server.log
log-append /var/log/openvpn/server.log
status /var/log/openvpn/status.log
verb 3
explicit-exit-notify 1
server.conf文件也可以通过拷贝 /usr/share/doc/openvpn-2.4.8/sample/sample-config-files/server.conf 进行修改
开机自启:
$ systemctl start openvpn@server
$ systemctl enable openvpn@serve
(5)添加一个 Openvpn 用户
创建一个 openvpn 用户配置文件模板:
$ vim /etc/openvpn/client/agent_template.ovpn
client
proto udp
dev tun
remote <公网IP> 1194
ca ca.crt
cert user.crt
key user.key
tls-auth ta.key 1
remote-cert-tls server
persist-tun
persist-key
comp-lzo
verb 3
mute-replay-warnings
创建一个生成用户的脚本:
$ vim /etc/openvpn/client/create_user.sh
#!/usr/bin/env bash
# 如果脚本执行报错,则停止
set -e
# 配置目录
USER_KEYS_DIR=/etc/openvpn/client/keys
EASY_RSA_VER=3
EASY_RSA_DIR=/etc/openvpn/easy-rsa
PKI_DIR=${EASY_RSA_DIR}/${EASY_RSA_VER}/pki
# 安装 zip
rpm -qa|grep ^zip || yum -y install zip
# 循环创建多个用户
for user in "$@"
do
# 如果用户已存在,跳出本次循环
if -d ${USER_KEYS_DIR}/${user} ; then
echo "[Warning] $user already exists!"
break
fi
# 创建用户
cd ${EASY_RSA_DIR}/${EASY_RSA_VER}
./easyrsa build-client-full ${user} nopass
mkdir -p ${USER_KEYS_DIR}/${user}
cp ${PKI_DIR}/ca.crt ${USER_KEYS_DIR}/${user}
cp ${PKI_DIR}/issued/${user}.crt ${USER_KEYS_DIR}/${user}
cp ${PKI_DIR}/private/${user}.key ${USER_KEYS_DIR}/${user}
cp /etc/openvpn/client/agent_template.ovpn ${USER_KEYS_DIR}/${user}/${user}.ovpn
sed -i 's/user/"${user}"/g' ${USER_KEYS_DIR}/${user}/${user}.ovpn
cp /etc/openvpn/server/certs/ta.key ${USER_KEYS_DIR}/${user}/ta.key
# 打包用户文件
cd ${USER_KEYS_DIR}
zip -r ${user}.zip ${user}
done
exit 0
执行脚本创建用户:
$ chmod +x /etc/openvpn/client/create_user.sh
$ /etc/openvpn/client/create_user.sh jackzang
$ tree /etc/openvpn/client/keys/*
/etc/openvpn/client/keys/jackzang
├── ca.crt
├── jackzang.crt
├── jackzang.key
├── jackzang.ovpn
└── ta.key
/etc/openvpn/client/keys/jackzang.zip [error opening dir]
(6)删除一个用户
吊销用户的证书:
$ cd /etc/openvpn/easy-rsa/3/
$ ./easyrsa revoke <username>
$ ./easyrsa gen-crl
$ rm -rf /etc/openvpn/client/keys/<username>
重启服务:
$ systemctl restart openvpn@server
3. SSG5 防火墙配置
一般情况下,公司内部都会有防火墙或路由器充当企业网络入口,因此,我们需要在此设备上放行外网对 OpenVPN 服务器端口的访问。
由于我们这次 OpenVPN 采用的是 UDP 协议,所以需要在防火墙上放行 UDP 协议,设备的不同有可能造成配置方法的不同,如果不会或无权限的用户,建议咨询本公司的 IT 人员。
创建自定义服务
自定义服务端口的映射,把公网的端口映射到虚拟机(OpenVPN的监听端口)的端口
防火墙放行策略
4. 客户端配置
下载地址:https://swupdate.openvpn.org/community/releases/openvpn-install-2.4.8-I602-Win10.exe
百度网盘:链接:https://pan.baidu.com/s/1rzxHf-HQJ_N_1VaI_MH81A提取码:m8bk
安装步骤,一路下一步
进入到安装目录:C:\Program Files\OpenVPN ,把从 OpenVPN 服务器下载的 jackzang.zip 文件解压到当前文件夹。
删除原有的 config 目录,把解压后的文件夹 jackzang 重命名为 config,启动 openvpn客户端即可
所有安装脚本可参考:https://gitee.com/hanfeng_edu/script.git
5. 扩展知识
(1)如果配置完成后,出现能通过公网内网IP连接 OpenVPN 服务器,但是无法连接其他内网服务器IP
解决方法:
1)使用 snat 规则:这种需要停止firewall,安装iptables
$ yum -y install iptables
$ systemctl enable iptables
$ systemctl start iptables
$ iptables -f # 清除所有防火墙规则
$ iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -j MASQUERADE
$ iptables-save > /etc/sysconfig/iptables # iptables 规则保存
- 在核心交换机上添加路由规则,类似于:10.8.0.0/24 192.168.20.241
思科3560:
switch3560-1# config terminal
switch3560-1(config)# ip route 10.8.0.0 255.255.255.0 192.168.20.241
switch3560-1(config)# exit
switch3560-1# exit
(2) 为 openvpn 客户端固定静态IP
定义客户端使用的配置:
$ vi /etc/openvpn/server.conf
...
client-config-dir /etc/openvpn/ipconfig
定义客户端的配置,
$ mkdir /etc/openvpn/ipconfig
$ echo "ifconfig-push 10.8.0.200 10.8.0.201" > /etc/openvpn/ipconfig/jackzang #200为客户端IP,201为服务器端IP
$ systemctl restart openvpn@server