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
# Author: jackzang
# mail: jackzang@aishangwei.net
# Date: 2020/2/9

# 如果脚本执行报错,则停止
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 规则保存

2) 在核心交换机上添加路由规则,类似于: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