重点:
一键安装 OpenVPN 脚本
后续管理:证书吊销。给新用户颁发证书
关系型数据库相关概念
三个范式
1)OpenVPN 简介
1.1)VPN 介绍
专用网络:专用网就是 在两个网络(例如,北京和广州)之间架设一条专用线路,但是它并不需要真正地去铺设光缆之类的物理线路。虽然没有亲自去铺设,但是需要向电信运营商申请租用专线,在这条专用的线路上只传输自己的信息,所以安全稳定,同时也费用高昂。
VPN:Virtual Private Network,虚拟私有网络,或称为虚拟专用网络,常用于在在公用网络上建立专用网络,进行加密]讯。在企业网络中有广泛应用。VPN 网关通过对数据包的加密和数据包目标地址的转换实现远程访问。VPN 可通过服务器、硬件、软件等多种方式实现。
分公司连接到总部有多种方式,其中两种主要方式是 通过专线连接 和 使用 VPN 连接。
专线连接 是通过物理线路(如光纤、以太网等)直接连接分公司和总部的网络。这种连接通常是由专业的网络提供商提供和管理的,提供更高的带宽和稳定性。专线连接通常有固定的费用,并且在网络安全和性能方面提供较好的保障。
VPN(虚拟专用网络)连接是通过公共网络(如互联网)进行加密通信,允许分公司的网络安全地连接到总部的网络。VPN 通过加密数据流,使其在公共网络中传输时变得安全,可以通过互联网以较低的成本建立连接。
VPN 工作逻辑
在外网的用户可以使用vpn client连接组织搭建的vpn server以建立通信隧道,随后便建立了虚拟的私人网络,处于外网的worker和内网中的server可以相互通信。
1.2)VPN常见应用模式
1.2.1)点对站点 peer to site
允许单个用户或设备通过 VPN 客户端连接到一个已建立的 VPN 网络,实现远程安全访问。( 建议使用 OpenVPN )
1.2.2)站点对站点 site to site
是两个网络之间的连接,用于连接不同地理位置的局域网,提供安全的远程通信。( 建议使用硬件 VPN )
1.3)OpenVPN
OpenVPN是 Linux 下开源 VPN 的应用,提供了良好的性能和友好的用户 GUI。
OpenVPN 是一个基于 OpenSSL 库的应用层 VPN 实现。和传统 VPN 相比,它的优点是简单易用。
OpenVPN 允许参与建立 VPN 的单点使用共享密钥,电子证书,或者用户名/密码来进行身份验证。
OpenVPN 支持在各种系统,如:Linux、Windows、Mac OS X、Solaris、OpenBSD、FreeBSD、NetBSD 上运行,并包含了许多安全性的功能。它并不是一个基于 Web 的 VPN 软件,也不与 IPsec 及其他 VPN 软件包兼容。
官方网站:https://openvpn.net
GitHub 地址:GitHub – OpenVPN/openvpn: OpenVPN is an open source VPN daemon
OpenVPN 常见适用场景
实现远程主机到内网的连接
实现多个远程主机之间的连接
OpenVPN 示意图
2)OpenVPN 部署
2.1)准备 OpenVPN 部署环境
官文文档: https://openvpn.net/community-resources/how-to/
可选择以下两套环境之一实现 OpenVPN
2.1.1)环境 1 :阿里云 OpenVPN 实战环境
准备阿里云网络实验环境
// 1 阿里云创建专有网络 ( “模拟企业网络” )
1.1 指定城市和可用区: 华北 3 张家口可用区 A 区
1.2 网段名 magedu-net1 和地址段 172.16.0.0/12, 默认资源组
1.3 交换机名 magedu-net1-sw1, 可用区 AIPv4 的地址段 172.30.0.0/24
1.4 安全组开放 22 端口
// 2 创建 OpenVPN 服务器有公网 IP 的实例 1个 ( “模拟企业 OpenVPN-Server” )
2.1 指定城市和可用区: 华北 3 张家口可用区 A 区
2.2 计算型 c6 2vCPU 4G
2.3 网络: magedu-net1 交换机: magedu-net1-sw1
2.4 公网 IP 按量收费 10 M
2.5 默认安全组 默认配置 22,3389,icmp
2.6 CentOS8.3
2.7 系统盘: 存储默认高效云盘 40 G
// 3 创建局域网的服务器无公网 IP 的实例 2 个 ( “模拟企业内网 Web-Server” )
3.1 按量付费
3.2 指定城市和可用区: 华北 3 张家口可用区 A 区
3.3 共享型 2vCPU2G
3.4 CentOS8.3
3.5 系统盘 存储默认高效云盘 40 G
网络: magedu-net1 magedu-net1-sw1
无公网 IP
默认安全组
主网卡 sw1
—-
// 4 重设所有实例密码
// 5 修改安全组打开 1194/TCP/UDP
2.1.1.1)购买第一台有公网 IP 的 ECS
OpenVPN-Server:172.30.0.1
Web1:172.30.0.100
Web2:172.30.0.200
Client:0.0.0.0
阿里云购买链接:
阿里云登录 – 欢迎登录阿里云,安全稳定的云计算服务平台
2.1.1.2)需先 创建网络和交换机
模拟 企业专有网络(企业专有网络 )
创建交换机(类似划分 VLAN,划分子网 )
继续配置云服务器
登录凭证
配置概要
停机>> 修改私网 IP 地址
2.1.1.3)再购买 两台 内网无公网的 ECS
注意:需要和第一台主机在同一个地域和可用区( 华北 3 张家口可用区 A)
阿里云登录 – 欢迎登录阿里云,安全稳定的云计算服务平台
购买两台
主机名:web[1,2].magedu.org
2.1.1.4)验证主机配置
创建完成,三台主机
将三台主机关闭>> 批量重置实例密码
将 Web-ServerIP 地址 分别修改为 172.30.0.100,172.30.0.200
更多 >> 网络与安全组 >> 修改私有 IP 地址
远程连接>> 为 Web-Server安装HTTPD 服务
—
// “为两台局域网 Web-Server 安装 HTTPD 服务”
[root@web1 ~] yum install httpd -y;systemctl enable –now httpd;hostname > /var/www/html/index.html
// “验证 HTTPD 服务”
[root@web01 ~] curl 127.0.0.1
web01.magedu.org
—
// “连接 Web2”
[root@web01 ~] ssh 172.30.0.200
[root@web02 ~] yum install httpd -y;systemctl enable –now httpd;hostname > /var/www/html/index.html
[root@web02 ~] curl 127.0.0.1
web02.magedu.org
// “连接 OpenVPN-Server”
[root@web02 ~] ssh 172.30.0.1
[root@open-server ~] hostnamectl set-hostname open-server.magedu.org
大家思考一下:
我们连接 47.92.111.208的云主机时,发现其网络并没有公网 IP 地址。
这是因为在这台主机之上存在一个公网 IP 为 47.92.111.208 的防火墙。
防火墙采用了 DNAT(Destination NAT)技术,当我们通过公网 IP 地址进行连接时,数据包会被转发到我们的内网主机 172.30.0.1 上。
// 基于公网 IP 地址连接 OpenVPN-Server
ssh 47.92.111.208
// “免密认证”
[root@open-server ~] ssh-keygen
[root@open-server ~] ssh-copy-id 172.30.0.100
[root@open-server ~] ssh-copy-id 172.30.0.200
// “验证”
[root@open-server ~] ssh 172.30.0.100
[root@open-server ~] ssh 172.30.0.200
至此~ 我们的主机环境就配置好了!
2.1.1.5)修改网络防火墙规则( 阿里云防火墙 )
默认 VPN 的端口无法访问,需要修改网络防火墙规则
添加规则实现: 1194/TCP/UDP端口允许通过。
云服务器 ECS >> 安全组
安全组规则c
添加 ICMP
添加 1194/TCP/UDP
2.1.2)环境 2:局域网 OpenVPN 实战环境
// 共四台主机
1 openvpnserver:
CentOS 8.2
eth0: 10.0.0.8/24 NAT 模式, 模拟公网 IP
eth1: 172.30.0.1/24 仅主机模式, 私网IP
2 内网主机两台
第一台主机
eth0: 172.30.0.100/24 仅主机模式,私网IP, 无需网关
第二台主机
eth0: 172.30.0.200/24 仅主机模式,私网IP, 无需网关
3 Windows客户端
Windows 10
2.2)安装 OpenVPN 软件包
2.2.1)查看版本
2.2.1.1)查看官网的 OpenVPN 的版本
访问官网:https://openvpn.net
https://openvpn.net/community-downloads/
2.2.1.2)在不同 OS 上 查看 OpenVPN 版本
CentOS EPEL 源存在 OpenVPN 软件包
CentOS 系统上的 EPEL 源 OpenVPN 版本 比 Ubuntu 的仓库中版本更新
以下选择在 CentOS8 上部署 OpenVPN。
范例:CentOS 查看 OpenVPN 版本
[root@centos8 ~] yum list openvpn
[root@centos7 ~] yum list openvpn
[root@centos8 ~] yum list easy-rsa
[root@centos7 ~] yum list easy-rsa
范例:Ubuntu 查看 OpenVPN 版本
root@ubuntu2004:~ apt show openvpn
[root@ubuntu1804 ~] apt list openvpn
[root@ubuntu1804 ~] apt-cache madison openvpn
[root@ubuntu1804 ~] apt-cache madison easy-rsa
2.2.2)安装 OpenVPN
后面环境以 CentOS8 上 基于 EPEL 源安装 OpenVPN 为例
2.2.2.1)安装 OpenVPN 和证书工具
// “OpenVPN 服务器端”
[root@open-server ~] yum install openvpn -y
// “证书管理工具” ( 重要)
// 后续 不管是 都需要使用到大量证书
[root@open-server ~] yum install easy-rsa -y
2.2.2.2)查看包中相关文件
// 查看软件包详细信息
[root@open-server ~] rpm -qi openvpn easy-rsa
// “查看软件包文件信息”
[root@open-server ~] rpm -ql openvpn
/etc/openvpn
/etc/openvpn/client
/etc/openvpn/server
/run/openvpn-client
/run/openvpn-server
/usr/lib/.build-id
/usr/lib/.build-id/01
/usr/lib/.build-id/01/3502e54aa79eca0939ed1b8f99938af3e53db5
/usr/lib/.build-id/5d
/usr/lib/.build-id/5d/20d771a56878de04c0c4938f4a9448fca62fd6
/usr/lib/.build-id/b6
/usr/lib/.build-id/b6/b110decca64a429c86bc861a87ea3101e337c7
/usr/lib/systemd/system/openvpn-client@.service
/usr/lib/systemd/system/openvpn-server@.service
/usr/lib/tmpfiles.d/openvpn.conf
/usr/lib64/openvpn
/usr/lib64/openvpn/plugins
/usr/lib64/openvpn/plugins/openvpn-plugin-auth-pam.so
/usr/lib64/openvpn/plugins/openvpn-plugin-down-root.so
/usr/sbin/openvpn
/usr/share/doc/openvpn
/usr/share/doc/openvpn/AUTHORS
/usr/share/doc/openvpn/COPYING
/usr/share/doc/openvpn/COPYRIGHT.GPL
/usr/share/doc/openvpn/ChangeLog
/usr/share/doc/openvpn/Changes.rst
/usr/share/doc/openvpn/README
/usr/share/doc/openvpn/README.auth-pam
/usr/share/doc/openvpn/README.down-root
/usr/share/doc/openvpn/README.systemd
/usr/share/doc/openvpn/contrib
/usr/share/doc/openvpn/contrib/OCSP_check
/usr/share/doc/openvpn/contrib/OCSP_check/OCSP_check.sh
/usr/share/doc/openvpn/contrib/README
/usr/share/doc/openvpn/contrib/openvpn-fwmarkroute-1.00
/usr/share/doc/openvpn/contrib/openvpn-fwmarkroute-1.00/README
/usr/share/doc/openvpn/contrib/openvpn-fwmarkroute-1.00/fwmarkroute.down
/usr/share/doc/openvpn/contrib/openvpn-fwmarkroute-1.00/fwmarkroute.up
/usr/share/doc/openvpn/contrib/pull-resolv-conf
/usr/share/doc/openvpn/contrib/pull-resolv-conf/client.down
/usr/share/doc/openvpn/contrib/pull-resolv-conf/client.up
/usr/share/doc/openvpn/management-notes.txt
/usr/share/doc/openvpn/sample
/usr/share/doc/openvpn/sample/sample-config-files
/usr/share/doc/openvpn/sample/sample-config-files/README
/usr/share/doc/openvpn/sample/sample-config-files/client.conf
/usr/share/doc/openvpn/sample/sample-config-files/firewall.sh
/usr/share/doc/openvpn/sample/sample-config-files/home.up
/usr/share/doc/openvpn/sample/sample-config-files/loopback-client
/usr/share/doc/openvpn/sample/sample-config-files/loopback-server
/usr/share/doc/openvpn/sample/sample-config-files/office.up
/usr/share/doc/openvpn/sample/sample-config-files/openvpn-shutdown.sh
/usr/share/doc/openvpn/sample/sample-config-files/openvpn-startup.sh
/usr/share/doc/openvpn/sample/sample-config-files/roadwarrior-client.conf
/usr/share/doc/openvpn/sample/sample-config-files/roadwarrior-server.conf
/usr/share/doc/openvpn/sample/sample-config-files/server.conf
/usr/share/doc/openvpn/sample/sample-config-files/static-home.conf
/usr/share/doc/openvpn/sample/sample-config-files/static-office.conf
/usr/share/doc/openvpn/sample/sample-config-files/tls-home.conf
/usr/share/doc/openvpn/sample/sample-config-files/tls-office.conf
/usr/share/doc/openvpn/sample/sample-config-files/xinetd-client-config
/usr/share/doc/openvpn/sample/sample-config-files/xinetd-server-config
/usr/share/doc/openvpn/sample/sample-scripts
/usr/share/doc/openvpn/sample/sample-scripts/auth-pam.pl
/usr/share/doc/openvpn/sample/sample-scripts/bridge-start
/usr/share/doc/openvpn/sample/sample-scripts/bridge-stop
/usr/share/doc/openvpn/sample/sample-scripts/ucn.pl
/usr/share/doc/openvpn/sample/sample-scripts/verify-cn
/usr/share/doc/openvpn/sample/sample-windows
/usr/share/doc/openvpn/sample/sample-windows/sample.ovpn
/usr/share/man/man8/openvpn.8.gz
/var/lib/openvpn
[root@open-server ~] rpm -ql easy-rsa
/usr/share/doc/easy-rsa
/usr/share/doc/easy-rsa/COPYING.md
/usr/share/doc/easy-rsa/ChangeLog
/usr/share/doc/easy-rsa/README.md
/usr/share/doc/easy-rsa/README.quickstart.md
/usr/share/doc/easy-rsa/vars.example
/usr/share/easy-rsa
/usr/share/easy-rsa/3
/usr/share/easy-rsa/3.0
/usr/share/easy-rsa/3.0.8
/usr/share/easy-rsa/3.0.8/easyrsa
/usr/share/easy-rsa/3.0.8/openssl-easyrsa.cnf
/usr/share/easy-rsa/3.0.8/x509-types
/usr/share/easy-rsa/3.0.8/x509-types/COMMON
/usr/share/easy-rsa/3.0.8/x509-types/ca
/usr/share/easy-rsa/3.0.8/x509-types/client
/usr/share/easy-rsa/3.0.8/x509-types/code-signing
/usr/share/easy-rsa/3.0.8/x509-types/email
/usr/share/easy-rsa/3.0.8/x509-types/kdc
/usr/share/easy-rsa/3.0.8/x509-types/server
/usr/share/easy-rsa/3.0.8/x509-types/serverClient
/usr/share/licenses/easy-rsa
/usr/share/licenses/easy-rsa/gpl-2.0.txt
2.2.2.3)准备相关配置文件
// CentOS7 执行如下命令
1. 将 openvpn 目录名修改为 openvpn
[root@open-server~] cd /usr/share/doc && mv openvpn-2.4.12/ openvpn
2. 将 easy-rsa 目录名修改为 easy-rsa
[root@open-server~] cd /usr/share/doc && mv easy-rsa-3.0.8/ easy-rsa
// 1. 生成服务器配置文件 ( “拷贝 模板文件” )
[root@open-server ~] cp /usr/share/doc/openvpn/sample/sample-config-files/server.conf /etc/openvpn/
// 2. 准备证书颁发相关文件 ( “拷贝 证书相关文件”)
[root@open-server ~] cp -r /usr/share/easy-rsa/ /etc/openvpn/easy-rsa-server
// 3. 准备颁发证书相关变量的配置文件 ( “拷贝 证书相关变量配置文件”)
[root@open-server ~] cp /usr/share/doc/easy-rsa/vars.example /etc/openvpn/easy-rsa-server/3/vars
// 4. 建议修改给 CA 和 OpenVPN 服务器 “颁发证书的有效期” ( 可适当加长 )
[root@open-server ~] vim /etc/openvpn/easy-rsa-server/3/vars
// CA 的证书默认有效期为 10 年, 可以适当延长, 比如: 36500 天
# set_var EASYRSA_CA_EXPIRE3650
set_var EASYRSA_CA_EXPIRE 36500
// “服务器证书” 默为为 825 天, 可适当加长, 比如: 3650 天
# set_var EASYRSA_CERT_EXPIRE 825
# 将上面行修改为下面
set_var EASYRSA_CERT_EXPIRE 3650
// 7 个文件夹, 12 个文件
[root@open-server ~] tree /etc/openvpn/
2.3)准备 证书相关文件
2.3.1)初始化 PKI 和 CA 颁发机构环境
2.3.1.1)脚本 easyrsa 帮助用法
[root@open-server ~] cd /etc/openvpn/easy-rsa-server/3/
[root@open-server 3] pwd
[root@open-server 3] file ./easyrsa
./easyrsa: POSIX shell script, ASCII text executable
// 执行 easyrsa 脚本 ( “不加任何选项,默认输出帮助列表” )
[root@open-server 3] ./easyrsa
2.3.1.2)初始化 PKI 生成 PKI 相关目录和文件
“初始化 PKI”
[root@open-server ~] cd /etc/openvpn/easy-rsa-server/3/
[root@open-server 3] pwd
[root@open-server 3] tree
// “调用 init-pki”
// “初始化数据”在当前目录下生成 pki 目录及相关文件
[root@open-server 3] ./easyrsa init-pki
[root@open-server 3] tree
.
├── easyrsa
├── openssl-easyrsa.cnf
├── pki # 生成了该目录及相关文件
│ ├── openssl-easyrsa.cnf
│ ├── private
│ ├── reqs
│ └── safessl-easyrsa.cnf
├── vars
└── x509-types
├── ca
├── client
├── code-signing
├── COMMON
├── kdc
├── server
└── serverClient
4 directories, 13 files
2.3.2)创建 CA 机构环境
// “调用 build-ca”
[root@open-server3] ./easyrsa build-ca nopass
Common Name (eg:your user, host, or server name) [Easy-RSA CA]:# 回车接受默认值即可
Your new CA certificate file for publishing is at:
/etc/openvpn/easy-rsa-server/3/pki/ca.crt // 生成自签名的证书文件
// “生成了 CA 的自签名证书文件”
[root@open-server3] tree pki
pki
├── ca.crt # 生成的自签名的证书文件
├── certs_by_serial
├── index.txt
├── index.txt.attr
├── issued
├── openssl-easyrsa.cnf
├── private
│ └── ca.key # 生成的私钥文件
├── renewed
│ ├── certs_by_serial
│ ├── private_by_serial
│ └── reqs_by_serial
├── reqs
├── revoked
│ ├── certs_by_serial
│ ├── private_by_serial
│ └── reqs_by_serial
├── safessl-easyrsa.cnf
└── serial
12 directories, 7files
// 查看生成 CA 相关的文件
[root@open-server3] cat pki/serial
[root@open-server3] ll pki/index.txt
[root@open-server3] ll pki/ca.crt pki/private/ca.key
// “查看生成的自签名证书”
[root@open-server3] cat pki/ca.crt
[root@open-server3] openssl x509 -in pki/ca.crt -noout -text
// 基于 Windows 系统查看证书
[root@open-server3] sz pki/ca.crt
2.3.3)创建 OpenVPN服务端证书申请
[root@open-server ~] cd /etc/openvpn/easy-rsa-server/3
[root@open-server 3] pwd
/etc/openvpn/easy-rsa-server/3
// “创建 OpenVPN 服务器证书申请文件”
// 其中 server 是文件前缀
[root@open-server 3] ./easyrsa gen-req server nopass
Common Name (eg: your user, host, or server name) [server]: # 接受 Common Name 的默认值, 直接回车
Keypair and certificate request completed. Your files are:
req: /etc/openvpn/easy-rsa-server/3/pki/reqs/server.req# 生成的请求文件
key: /etc/openvpn/easy-rsa-server/3/pki/private/server.key # 生成的私钥文件
[root@open-server 3] tree pki
pki
├── ca.crt
├── certs_by_serial
├── index.txt
├── index.txt.attr
├── issued
├── openssl-easyrsa.cnf
├── private
│ ├── ca.key
│ └── server.key# 生成私钥文件
├── renewed
│ ├── certs_by_serial
│ ├── private_by_serial
│ └── reqs_by_serial
├── reqs
│ └── server.req# 生成请求文件
├── revoked
│ ├── certs_by_serial
│ ├── private_by_serial
│ └── reqs_by_serial
├── safessl-easyrsa.cnf
└── serial
12 directories, 9 files
2.3.4)颁发服务端证书
2.3.4.1)查看颁发证书命令用法
[root@open-server ~] cd /etc/openvpn/easy-rsa-server/3
[root@open-server 3] ./easyrsa help sign
2.3.4.2)颁发服务端证书
// 将上面 server.req 的申请, 颁发 server 类型的证书
[root@open-server ~] cd /etc/openvpn/easy-rsa-server/3
// 第一个 server 表示证书的类型, 第二个 server 表示请求文件名的前缀
[root@open-server 3] ./easyrsa sign server server
Request subject, to be signed as a server certificate for 3650 days:# 可以看到 vars 文件指定的有效期
Type the word ‘yes’ to continue, or anyother input to abort.
Confirm request details: yes // 输入yes 回车
Certificate created at: /etc/openvpn/easy-rsa-server/3/pki/issued/server.crt # 生
成服务器证书文件
2.3.4.3)验证结果
[root@open-server ~] cd /etc/openvpn/easy-rsa-server/3
[root@open-server 3] tree pki
pki
├── ca.crt
├── certs_by_serial
│ └── EDAEBAB8D65066D307AE58ADC1A56682.pem # 生成的服务器证书文件
├── index.txt
├── index.txt.attr
├── index.txt.attr.old
├── index.txt.old
├── issued
│ └── server.crt # 生成的服务器证书文件
├── openssl-easyrsa.cnf
├── private
│ ├── ca.key
│ └── server.key
├── renewed
│ ├── certs_by_serial
│ ├── private_by_serial
│ └── reqs_by_serial
├── reqs
│ └── server.req
├── revoked
│ ├── certs_by_serial
│ ├── private_by_serial
│ └── reqs_by_serial
├── safessl-easyrsa.cnf
├── serial
└── serial.old
12 directories, 14 files
[root@open-server 3] cat pki/issued/server.crt
# 查看证书相关文件
[root@open-server 3] cat pki/serial
[root@open-server 3] cat pki/index.txt
[root@open-server 3] cat pki/serial.old
// “将证书上传至 Windows 系统”
[root@open-server 3] sz pki/issued/server.crt
“安装上级 CA 证书” ( 重要 )
ca.crt
安装完ca.crt上级 CA 证书后,我们的 server.crt 证书就受系统信任啦~
2.3.5)创建 Diffie-Hellman 密钥
2.3.5.1)Diffie-Hellman 算法说明
wiki 参考链接:
https://en.wikipedia.org/wiki/Diffie%E2%80%93Hellman_key_exchange
Diffie-Hellman密钥交换方法是迪菲(Whitefield Diffie)和赫尔曼(Martin Hellman)在 1976 年公布的一种秘钥交换算法,它是一种建立秘钥的方法,而不是加密方法,所以秘钥必须和其他一种加密算法结合使用。这种密钥交换技术的目的在于使两个用户安全地交换一个密钥,用此密钥做为对称密钥来加密后续的报文传输。
2.3.5.2)创建 Diffie-Hellman 密钥
[root@open-server ~] cd /etc/openvpn/easy-rsa-server/3
[root@open-server 3] pwd
// 方法 1
“方法 1: 生成 Diffie-Hellman 密钥”
// 这里需要等待一会儿
[root@open-server 3] ./easyrsa gen-dh
DH parameters of size 2048 created at /etc/openvpn/easy-rsa-server/3/pki/dh.pem
# 查看生成的文件
[root@open-server 3] ll pki/dh.pem
-rw——- 1 root root 424 Dec 23 15:37 pki/dh.pem
[root@open-server 3] cat pki/dh.pem
—–BEGIN DH PARAMETERS—–
MIIBCAKCAQEAu95LCerRrVeGlfpcPKZbDWWOWcEktgLdAx1vwOHGZz+3Vb2itHM9
RFulRrPJRskDDPImTxLXGvbH7QlkXXefKoVLF1o3jMeSvisDdWG1bzK9ewQW/hZP
C+WbyFV8wLc/ZD1Dttbw6VehJtn61lpfGcL4W6xIpbsenqZrsoJXyE4znPEFAdJu
f8knhDKA7ID0jSGXTQhGSmkakBwcxplEJhMCUwhNhbruLvmpcWqEoEYxM3CR6iPx
QZfyflmZs3S9U9qsZFIbUpkXFWXkFE3qcNdwi5F8JsFrMiSZeqObqFnnbki33KTU
lfxHmGdOG0T0+cTpFD/wl6F5dvvsuq4SCwIBAg==
—–END DH PARAMETERS—–
// 方法 2
“方法 2: 生成 Diffie-Hellman 密钥”
[root@open-server ~] openssl dhparam -out /etc/openvpn/dh2048.pem 2048
[root@open-server ~] ll /etc/openvpn/dh2048.pem
2.3.6)准备客户端证书环境
上面服务端证书配置完成,下面是配置客户端证书
// “准备客户端证书环境”
[root@open-server ~] cp -a /usr/share/easy-rsa/ /etc/openvpn/easy-rsa-client
// 可选
[root@open-server 3] cp /usr/share/doc/easy-rsa/vars.example /etc/openvpn/easy-rsa-client/3/vars
[root@open-server ~] cd /etc/openvpn/easy-rsa-client/3/
[root@open-server 3] ls
easyrsa openssl-easyrsa.cnf vars x509-types
// “验证”
[root@open-server 3] tree
.
├── easyrsa
├── openssl-easyrsa.cnf
├── vars
└── x509-types
├── ca
├── client
├── code-signing
├── COMMON
├── kdc
├── server
└── serverClient
1 directory, 11file
// “生成证书申请所需目录pki 和文件”
[root@open-server 3] ./easyrsa init-pki
Your newly created PKI dir is: /etc/openvpn/easy-rsa-client/3/pki # 生成新目录
// “验证”
[root@open-server 3] tree
.
├── easyrsa
├── openssl-easyrsa.cnf
├── pki# 生成的新目录
│ ├── openssl-easyrsa.cnf
│ ├── private
│ ├── reqs
│ └── safessl-easyrsa.cnf
├── vars
└── x509-types
├── ca
├── client
├── code-signing
├── COMMON
├── kdc
├── server
└── serverClient
4 directories,13 files
2.3.7)创建客户端证书申请
// “切换到 easy-rsa-client 目录”
[root@open-server ~] cd /etc/openvpn/easy-rsa-client/3
[root@open-server 3] pwd
/etc/openvpn/easy-rsa-client/3
// 生成 “客户端用户” 的证书
// 注意: “修改用户名”
[root@open-server 3] ./easyrsa gen-req wangxiaochun nopass
Common Name (eg: your user,host, or server name) [wangxiaochun]: # 接受默认值, 直接回车
req: /etc/openvpn/easy-rsa-client/3/pki/reqs/wangxiaochun.req # 私钥文件
key: /etc/openvpn/easy-rsa-client/3/pki/private/wangxiaochun.key# 证书申请文件
// 生成两个新文件
[root@open-server 3] tree
.
├── easyrsa
├── openssl-easyrsa.cnf
├── pki
│ ├── openssl-easyrsa.cnf
│ ├── private
│ │ └── wangxiaochun.key# 私钥文件
│ ├── reqs
│ │ └── wangxiaochun.req# 证书申请文件
│ └── safessl-easyrsa.cnf
├── vars
└── x509-types
├── ca
├── client
├── code-signing
├── COMMON
├── kdc
├── server
└── serverClient
4 directories, 15 files
2.3.8)颁发客户端证书( 重要 )
基于CA的证书信息给 客户端颁发证书。( 因此切换回 easy-rsa-server 目录 )
// “切换到 easy-rsa-server 目录”
[root@open-server ~] cd /etc/openvpn/easy-rsa-server/3
[root@open-server 3] pwd
/etc/openvpn/easy-rsa-server/3
// 将 “客户端证书文件” 请求复制到 CA 的工作目录
# 或者: 直接将客户端证书文件拷贝至 CA 的工作目录也可以
# ( 原理就是将客户端证书文件拷贝到了 CA 的工作目录 )
// 注意: “修改用户名”
[root@open-server 3] ./easyrsa import-req /etc/openvpn/easy-rsa-client/3/pki/reqs/wangxiaochun.req wangxiaochun
// “验证”
[root@open-server 3] tree pki
pki
├── ca.crt
├── certs_by_serial
│ └── EDAEBAB8D65066D307AE58ADC1A56682.pem
├── dh.pem
├── index.txt
├── index.txt.attr
├── index.txt.attr.old
├── index.txt.old
├── issued
│ └── server.crt
├── openssl-easyrsa.cnf
├── private
│ ├── ca.key
│ └── server.key
├── renewed
│ ├── certs_by_serial
│ ├── private_by_serial
│ └── reqs_by_serial
├── reqs
│ ├── server.req
│ └── wangxiaochun.req// “拷贝过来的客户端证书文件 ( 重要 )”
├── revoked
│ ├── certs_by_serial
│ ├── private_by_serial
│ └── reqs_by_serial
├── safessl-easyrsa.cnf
├── serial
└── serial.old
12 directories, 16 files
// 对比两个目录下的客户端证书文件
[root@open-server 3] ll pki/reqs/wangxiaochun.req /etc/openvpn/easy-rsa-client/3/pki/reqs/wangxiaochun.req
-rw——- 1 root root 895 Dec 23 16:10 /etc/openvpn/easy-rsa-client/3/pki/reqs/wangxiaochun.req
-rw——- 1 root root 895 Dec 23 16:10 pki/reqs/wangxiaochun.req
// 修改 “给客户端颁发的证书的有效期” ( “修改vars 配置文件” )
[root@open-server ~] cd /etc/openvpn/easy-rsa-server/3
[root@open-server 3] vim vars
# 建议修改给客户端颁发证书的有效期, 可适当减少, 比如: 90 天
# set_var EASYRSA_CERT_EXPIRE825
# 将上面行修改为下面
set_var EASYRSA_CERT_EXPIRE90
—-
// “颁发客户端证书”
// 注意: “修改用户名”
[root@open-server 3] ./easyrsa sign client wangxiaochun
Confirm request details: yes// 输入 yes 后回车
Certificate created at: /etc/openvpn/easy-rsa-server/3/pki/issued/wangxiaochun.crt # 证书文件
[root@open-server 3] tree pki
pki
├── ca.crt
├── certs_by_serial
│ ├── 5FE114ACC4FE6AB89D17E1B0EECF2B78.pem
│ └── EDAEBAB8D65066D307AE58ADC1A56682.pem
├── dh.pem
├── index.txt
├── index.txt.attr
├── index.txt.attr.old
├── index.txt.old
├── issued
│ ├── server.crt
│ └── wangxiaochun.crt // “生成的客户端证书”
├── openssl-easyrsa.cnf
├── private
│ ├── ca.key
│ └── server.key
├── renewed
│ ├── certs_by_serial
│ ├── private_by_serial
│ └── reqs_by_serial
├── reqs
│ ├── server.req
│ └── wangxiaochun.req
├── revoked
│ ├── certs_by_serial
│ ├── private_by_serial
│ └── reqs_by_serial
├── safessl-easyrsa.cnf
├── serial
└── serial.old
12 directories, 18 files
— “验证” —
[root@open-server 3] cat pki/index.txt
V331220072305ZA3D7C296B478AC274ABC6A4DA5C03724unknown/CN=server
V240322083300ZA2375DB2C6F9E46CA36A42A9C2F7B355unknown/CN=wangxiaochun
[root@open-server 3] ll pki/issued/
total 16
-rw——- 1 root root 4608Dec 23 15:23 server.crt
-rw——- 1 root root 4506Dec 23 16:33 wangxiaochun.crt
[root@open-server 3] ll pki/certs_by_serial/
[root@open-server 3] cat pki/issued/wangxiaochun.crt
如果需要颁发的客户端证书较多,可以使用下面脚本实现客户端证书的批量颁发
客户端证书自动颁发脚本
// 1) 创建脚本存放目录
[root@open-server ~] mkdir /root/Shell -p
—- 客户端证书自动颁发脚本 —-
// 2) 编写脚本
[root@open-server ~] vim /root/Shell/openvpn-user-crt.sh
#!/bin/bash
# 提示用户输入姓名拼音
read -p “请输入用户的姓名拼音(如:\${NAME}): ” NAME
# 检查输入的姓名是否为空
if [ -z “$NAME”]; then
echo “姓名不能为空”
exit 1
fi
# 定义路径变量
CLIENT_PATH=”/etc/openvpn/easy-rsa-client/3″
SERVER_PATH=”/etc/openvpn/easy-rsa-server/3″
LOG_FILE=”/var/log/openvpn-script.log”
# 函数:记录日志
log() {
local log_message=”$1″
echo “$(date): $log_message” >> “$LOG_FILE”
}
# 检查客户端和服务器目录是否存在
if [ ! -d “$CLIENT_PATH” ] || [ ! -d “$SERVER_PATH” ]; then
log “未找到所需的目录”
exit 1
fi
# 在客户端目录生成证书请求
cd “$CLIENT_PATH” || { log “无法进入客户端目录”; exit 1; }
./easyrsa gen-req “${NAME}” nopass || { log “证书请求生成失败”; exit 1; }
# 检查证书请求是否生成成功
if [ ! -f “pki/reqs/${NAME}.req” ]; then
log “证书请求生成失败”
exit 1
fi
# 在服务器目录导入客户端的证书请求
cd “$SERVER_PATH” || { log “无法进入服务器目录”; exit 1; }
./easyrsa import-req “${CLIENT_PATH}/pki/reqs/${NAME}.req””${NAME}” || { log “导入证书请求失败”; exit 1; }
# 签署客户端证书
./easyrsa signclient “${NAME}” <<EOF || { log "客户端证书签署失败"; exit 1; }
yes
EOF
# 检查客户端证书是否签署成功
if [ ! -f “pki/issued/${NAME}.crt” ]; then
log “客户端证书签署失败”
exit 1
fi
log “脚本执行成功”
————————————
// 4) “运行脚本”
[root@open-server ~] bash /root/Shell/openvpn-user-crt.sh
请输入用户的姓名拼音(如:${NAME}): wangjun
Common Name (eg: your user, host, or server name) [wangjun]: # 回车即可
Certificate created at: /etc/openvpn/easy-rsa-server/3/pki/issued/wangjun.crt
// 5) “验证用户证书”
[root@open-server ~] cd /etc/openvpn/easy-rsa-server/3
[root@open-server ~] tree | grep wangjun
// “查看日志”
[root@open-server 3] cat /var/log/openvpn-script.log
2.3.9)将 CA 和服务器证书相关文件复制到服务器相应的目录( 建议 )
创建目录:统一存放 服务器相关证书 文件
[root@open-server ~] mkdir /etc/openvpn/certs
[root@open-server ~] cp /etc/openvpn/easy-rsa-server/3/pki/ca.crt /etc/openvpn/certs/
[root@open-server ~] cp /etc/openvpn/easy-rsa-server/3/pki/issued/server.crt /etc/openvpn/certs/
[root@open-server ~] cp /etc/openvpn/easy-rsa-server/3/pki/private/server.key /etc/openvpn/certs/
[root@open-server ~] cp /etc/openvpn/easy-rsa-server/3/pki/dh.pem /etc/openvpn/certs/
[root@open-server ~] ll /etc/openvpn/certs/
total 20
-rw——- 1 root root 1204 Dec 23 17:03 ca.crt # 根 CA 证书文件
-rw——- 1 root root 424 Dec 23 17:03 dh.pem # Diffie-Hellman 密钥交换的参数文件
-rw——- 1 root root 4608 Dec 23 17:03 server.crt # 服务器端证书文件
-rw——- 1 root root 1704 Dec 23 17:03 server.key # 服务器证书配对的私钥文件
2.3.10)将客户端私钥与证书相关文件复制到服务器相关的目录(建议 )
创建目录:统一存放 用户相关证书 文件
// 创建目录: 统一存放”用户相关证书”文件
// 注意: “修改用户名”
[root@open-server ~] mkdir /etc/openvpn/client/wangxiaochun/
// 命令解析:
// 使用 find 命令搜索与 wangxiaochun 相关的所有证书文件并拷贝到我们上面创建的目录下
[root@open-server ~] find /etc/openvpn/\( -name “wangxiaochun.key” -o -name “wangxiaochun.crt” -o -name ca.crt\) -exec cp {} /etc/openvpn/client/wangxiaochun \;
// “验证”
[root@open-server ~] ll/etc/openvpn/client/wangxiaochun/
total 16
-rw——- 1 root root 1204 Aug 3 21:05 ca.crt
-rw——- 1 root root 4506 Aug 3 21:05 wangxiaochun.crt
-rw——- 1 root root 1704 Aug 3 21:05 wangxiaochun.key
—-
// 作用: 利于我们后续直接将目录打包发送给用户在 Windows 系统下进行使用
2.4)准备 OpenVPN 服务器配置文件
2.4.1)服务器端配置文件 说明
烂泥:openvpn配置文件详解-烂泥行天下
// 服务器配置文件 server.conf 文件中以 # 或 ; 开头的行都为注释
[root@open-server ~] grep -Ev “^#|^$” /etc/openvpn/server.conf
;local a.b.c.d// “本机监听 IP” 默认为本机所有 IP
port 1194// “端口”
;proto tcp// 协议, “生产推荐使用 TCP”
proto udp // 默认使用的协议 UDP
;dev tap // 创建以太网隧道设备, tap 设备实现以太网帧通过 Openvpn 隧道, 可提供非 IP 协议如 IPX 和 AppleTalk 等的支持, tap 等当于一个以太网设备, 它操作第二层数据包如以太网数据帧.
dev tun // 创建 IP 路由隧道, “生产推存使用 tun” 互联网使用 tun, 一个 tun 设备大多时候被用于基于 IP 协议的通讯 tun 模拟了网络层设备, 操作第三层数据包比如 IP 数据封包.
;dev-node MyTap// TAP-Win32 的设备驱动. 非 windows 系统不需要
ca ca.crt// “CA 证书文件路径”
cert server.crt// “服务器证书文件路径”
key server.key// “服务器私钥文件路径”
dh dh2048.pem // “DH 参数文件路径”
;topology subnet
server 10.8.0.0 255.255.255.0 // “OpenVPN 客户端连接后自动分配的 IP 网段” 默认会给服务器分配此网段的第一个 IP 将做为客户端的网关, ( 注意: 不要和内网网段相同 )
ifconfig-pool-persist ipp.txt// 记录客户端和虚拟 IP 地址分配的文件, 无需配置, “建议注释” (; 该符号开头的就是注释 )
;server-bridge 10.8.0.4 255.255.255.0 10.8.0.50 10.8.0.100 // 配置网桥模式, 无需配置, “建议注释”
;server-bridge
;push “route 192.168.10.0 255.255.255.0” // 推送给客户端的到达服务器后面网段的静态路由, 网关是服务器地址 10.8.0.1 ( 实现 VPN 客户端可以连接内网其他网段的主机 )
;push “route 192.168.10.100 255.255.255.255″// 用 255.255.255.255 可实现只能访问内网单个主机的功能, 比如: jumpserver
;push “route 192.168.20.0 255.255.255.0” // 推送路由信息到客户端, 以允许客户端能够连接到服务器背后的其它私有网络
;client-config-dir ccd // 为特定客户端添加路由信息, 此路由是客户端后面的网段而非服务端的网段, “无需设置”
;route 192.168.40.128 255.255.255.248
;client-config-dir ccd
;route 10.9.0.0 255.255.255.252
;learn-address ./script // 指定外部脚本文件, 实现创建不同组的 iptables 规则, “无需配置”
;push “redirect-gateway def1 bypass-dhcp” // 启用此配置后客户端所有流量都将通过 VPN 服务器进行转发, “因此生产一般无需配置此项”
;push “dhcp-option DNS 208.67.222.222″//推送 DNS 服务器地址, “无需配置”
;push “dhcp-option DNS 208.67.220.220”
;client-to-client//允许不同的客户端直接通信,不安全, “生产环境一般无需配置”
;duplicate-cn //”多个用户共用一个证书, 一般用于测试环境,” ( 生产环境建议一个用户一个证书, 无需开启 )
keepalive 10 120//设置服务端活动的检测的间隔和超时时间, 每隔 10 秒 ping 一次, 120 秒没有回应则认为已经断线
tls-auth ta.key 0 //访止 DoS 等攻击的安全增强配置, 服务器和每个客户端都需要拥有此密钥文件. 第二个参数在服务器端为 0, 客户端为 1
cipher AES-256-CBC//加密算法
;compress lz4-v2 //启用 Openvpn2.4.X 新版压缩算法
;push “compress lz4-v2″//推送客户端使用新版压缩算法,和下面的comp-lzo不要同时使用
;comp-lzo//旧户端兼容的压缩配置,需要客户端配置开启压缩,openvpn2.4.X等新版可以不用开启
;max-clients 100//最多支持的客户端数量
;user nobody //指定 openvpn 服务的用户
;group nobody //指定 openvpn 服务的组
persist-key//重启服务时默认会重新读取key文件,开启此配置后保持使用第一次的key文件, 生产环境无需开启
persist-tun //Don’t close and reopen TUN/TAP device or run up/down
scripts across SIGUSR1 or –ping-restart restarts, // 生产环境建议无需开启
status openvpn-status.log // 服务器状态记录文件,每分钟记录一次相关信息
;log openvpn.log// 第一种日志记录方式,并指定日志路径,log会在openvpn启动的时候清空日志文件, 不建议使用
;log-append openvpn.log// 第二种日志记录方式,并指定日志路径,重启openvpn后在之前的日志后面追加新的日志,生产环境建议使用
verb 3// 设置日志级别,0-9,级别越高记录的内容越详细,0 表示静默运行,只记录致命错误,4 表示合理的常规用法,5 和 6 可以帮助调试连接错误。9 表示极度冗余,输出非常详细的日志信息
;mute 20 // 对相同类别的信息只记录前20条到日志文件中
explicit-exit-notify 1// 当服务端重启后通知客户端自动重新连接服务器, 此项配置仅能用于udp模式, tcp 模式无需配置即能实现重新连接功能, 且开启此项后tcp配置后将导致openvpn服务无法启动, 所以 tcp 时必须不能开启此项
script-security 3// 允许使用自定义脚本
auth-user-pass-verify /etc/openvpn/checkpsw.sh via-env // 指定自定义脚本路径
username-as-common-name // 开启用户密码验证
client-cert-not-required // 只支持用户和密码方式验证,不支持证书,无此配置表示需要证书和用户密码多种验证
2.4.2)修改服务器端配置文件
[root@open-server ~] mv /etc/openvpn/server.conf /etc/openvpn/server.conf_bak
[root@open-server ~] vim /etc/openvpn/server.conf
port 1194
proto tcp
dev tun
ca /etc/openvpn/certs/ca.crt
cert /etc/openvpn/certs/server.crt
key /etc/openvpn/certs/server.key# This file should be kept secret
dh /etc/openvpn/certs/dh.pem
server 10.8.0.0 255.255.255.0
push “route 172.30.0.0 255.255.255.0” # 内网网段地址
keepalive 10 120
cipher AES-256-CBC
compress lz4-v2
push “compress lz4-v2”
max-clients 2048
user openvpn
group openvpn
status /var/log/openvpn/openvpn-status.log
log-append /var/log/openvpn/openvpn.log
verb 3
mute 20
// “验证 openvpn 用户”
[root@open-server ~] getent passwd openvpn
openvpn:x:993:990:OpenVPN:/etc/openvpn:/sbin/nologin
// “创建日志相关目录”
[root@open-server ~] mkdir /var/log/openvpn -p && chown openvpn.openvpn /var/log/openvpn
[root@open-server ~] ll -d /var/log/openvpn
drwxr-xr-x 2 openvpn openvpn 6 Dec 23 17:49 /var/log/openvpn
2.4.3)准备 iptables 规则和 内核参数
如图:
10.8.0.0/24 VPN 虚拟网段 的主机,他们基于 VPN-SERVER的 172.30.0.1网卡做 SNAT 转换 去访问 172.30.0.0/24网段的主机。
// “在服务器开启 ip_forward 转发功能”
[root@open-server ~] echo net.ipv4.ip_forward = 1 >> /etc/sysctl.conf
[root@open-server ~] sysctl -p
net.ipv4.ip_forward = 1
// “添加 SNAT 规则”
// 虚拟网络: 10.8.0.0
[root@open-server ~] echo ‘iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -j MASQUERADE’ >> /etc/rc.d/rc.local
// “永久生效”
[root@open-server ~] chmod +x/etc/rc.d/rc.local
[root@open-server ~] /etc/rc.d/rc.local
// “验证规则”
[root@open-server ~] iptables-vnL -t nat
2.5)启动 OpenVPN 服务
2.5.1)启动 OpenVPN 服务
// CentOS7 存在 openvpn-server@.service 文件
[root@centos7 ~] rpm -ql openvpn | grep systemd
/usr/lib/systemd/system/openvpn-client@.service
/usr/lib/systemd/system/openvpn-server@.service
/usr/lib/systemd/system/openvpn@.service
/usr/share/doc/openvpn-2.4.9/README.systemd
// “CentOS8 缺失 openvpn-server@.service 文件”
// 可以从 CentOS7 复制文件
[root@centos8 ~] rpm -ql openvpn | grep systemd
/usr/lib/systemd/system/openvpn-client@.service
/usr/lib/systemd/system/openvpn-server@.service
/usr/share/doc/openvpn/README.systemd
—
// “也可以主动编写 openvpn@.service 文件”
[root@open-server ~] vim /usr/lib/systemd/system/openvpn@.service
[Unit]
Description=OpenVPN Robust And Highly Flexible Tunneling Application On %I
After=network.target
[Service]
Type=notify
PrivateTmp=true
ExecStart=/usr/sbin/openvpn –cd /etc/openvpn/ –config %i.conf
[Install]
WantedBy=multi-user.target
// “启动 OpenVPN 服务”
// 注意 service 名称和文件名不一致
[root@open-server openvpn] systemctl daemon-reload
[root@open-server openvpn] systemctl enable –now openvpn@server
[root@open-server openvpn] systemctl status openvpn@server
2.5.2)验证服务状态
[root@open-server openvpn] systemctl status openvpn@server
# 注意端口号
[root@open-server ~] ss -ntlp | grep vpn
# 日志
[root@open-server ~] cat /var/log/openvpn/openvpn.log
# IP 地址
[root@open-server ~] ip a
# 路由表
[root@open-server ~] route -n
2.6)准备 OpenVPN 客户端配置文件
2.6.1)客户端 默认范例配置文件 说明
[root@open-server ~] grep ‘^[[:alpha:]].*’ /usr/share/doc/openvpn/sample/sample-config-files/client.conf
client # 指明客户端
dev tun # 指定和服务端一致的接口类型
proto udp# 指定和服务端一致的协议类型
remote my-server-1 1194 # 服务器端的 IP 或 FQDN 及端口
resolv-retry infinite# 指定服务器端 FQDN 而非 IP 时, 当客户端重新连接后会重新解 FQDN 对应的 IP
nobind# 客户端不绑定监听端口, 随机打开端口连接到服务端的端口
persist-key
persist-tun
ca ca.crt
cert client.crt
key client.key
remote-cert-tls server # 使用服务器证书校验方式
tls-auth ta.key 1# 安全加强
cipher AES-256-CBC
verb 3
2.6.2)生成客户端 用户的 配置文件
OpenVPN 的 客户端配置文件 是通用的,适用于所有用户;
而 客户端证书文件 则是针对 每个用户单独生成和使用 的。
// 生成客户端文件, 文件后缀必须为 .ovpn ( “查看范例文件” )
[root@open-server ~] grep ‘^[[:alpha:]].*’/usr/share/doc/openvpn/sample/sample-config-files/client.conf > /etc/openvpn/client/wangxiaochun/client.ovpn
// “创建一个给 wangxiaochun 用户进行使用的 OpenVPN 客户端配置文件”
// “OpenVPN 客户端配置文件” 可以复用, 后续其他用户可以使用同样的客户端配置文件
// 注意: “修改用户名”
[root@open-server ~] ll /etc/openvpn/client/wangxiaochun/
[root@open-server ~] vim /etc/openvpn/client/wangxiaochun/client.ovpn
[root@open-server ~] cat /etc/openvpn/client/wangxiaochun/client.ovpn
client
dev tun # 需与服务器端配置文件的信息匹配
proto tcp # 需与服务器端配置文件的信息匹配
remote 10.0.0.8 1194 # 生产中为 OpenVPN 公网 IP 或者 FQDN 域名
resolv-retry infinite
nobind
#persist-key
#persist-tun
ca ca.crt
cert wangxiaochun.crt // “注意修改用户名”
key wangxiaochun.key // “注意修改用户名”
remote-cert-tls server
#tls-auth ta.key 1
cipher AES-256-CBC
verb 3 # 此值不能随意指定, 否则无法通信
compress lz4-v2 # 此项在OpenVPN2.4.X 版本使用, 需要和服务器端保持一致, 如不指定, 默认使用 comp-lz 压缩
2.7)实现 OpenVPN 客户端
2.7.1)Windows配置部署 OpenVPN 客户端
2.7.1.1)Windows安装 OpenVPN 客户端
官方客户端下载地址:
https://openvpn.net/community-downloads/
OpenVPN客户端安装过程:
安装完成
2.7.1.2)Windows客户端配置准备
保存 配置文件与证书到 Windows OpenVPN 客户端安装目录
Windows 右键打开 OpenVPN GUI 文件所在位置
在 OpenVPN 服务器打包 用户证书与配置文件
并下载发送给 Windows 客户端
// 在 OpenVPN 服务器 “打包用户证书与配置文件”
// 并下载发送给 Windows 客户端
[root@open-server ~] cd /etc/openvpn/client/wangxiaochun/
// “打包用户证书与配置文件”
[root@open-server wangxiaochun]tar cf /root/wangxiaochun.tar ./
[root@open-server wangxiaochun]ll /root
-rw-r–r– 1 root root 20480 Dec23 19:13 wangxiaochun.tar
[root@open-server wangxiaochun]sz /root/wangxiaochun.tar
放置到 Windows 客户端默认安装目录下 C:\Program Files\OpenVPN\config目录
OpenVPN 客户端配置文件
2.7.1.3)Windows客户端建立 OpenVPN 连接
在 Windows 中 打开 OpenVPN GUI 工具
稍等一会儿,在状态栏显示以下图标,右键点连接
2.7.1.4)Windows 客户端 验证通信
2.7.1.4.1)在 Windows 客户端 测试访问 OpenVPN 内网服务器
注:内网服务器显示是来自于 OpenVPN 服务器的连接
C:\Users\WangJ> ping 172.30.0.100
C:\Users\WangJ> ssh root@172.30.0.100
2.7.1.4.2)观察 OpenVPN 服务器日志
[root@open-server ~] cat /var/log/openvpn/openvpn.log
[root@open-server ~] cat /var/log/openvpn/openvpn-status.log
2.7.1.4.3)验证 OpenVPN 服务器连接状态
可以在 OpenVPN 服务器看到 公网客户端 IP 地址 连接我们 OpenVPN 服务器 1194 端口的连接
[root@open-server ~] ss -nt
2.7.1.4.4)验证 Windows客户端的 IP地址
2.7.1.4.5)验证 Windows客户端的路由表
Windows客户端的路由表
route print
2.7.2)Linux配置部署 OpenVPN 客户端
2.7.2.1)客户端安装 OpenVPN
[root@openvpn-client ~] yum install openvpn -y
2.7.2.2)下载客户端公钥与私钥以及 CA 证书至客户端
[root@openvpn-client ~] cd /etc/openvpn/
[root@openvpn-client openvpn] scp openvpn-server:/data/easy-rsa-server/pki/ca.crt ./
[root@openvpn-client openvpn] scp openvpn-server:/data/easy-rsa-client/pki/issued/client.crt ./
[root@openvpn-client openvpn] scp openvpn-server:/data/easy-rsa-client/pki/private/client.key ./
2.7.2.3)客户端有了公钥和私钥后,还需要准备对应的客户端配置文件
[root@openvpn-client ~] cat /etc/openvpn/client.ovpn
client# 指定当前 VPN 是客户端
dev tun # 使用 tun 隧道传输协议
proto tcp# 使用 tcp 协议传输数据
remote OpenVPN服务器地址 1194# openvpn 服务器 IP 地址端口号
resolv-retry infinite# 断线自动重新连接, 在网络不稳定的情况下非常有用
nobind# 不绑定本地特定的端口号
ca ca.crt# 指定 CA 证书的文件路径
cert client.crt # 指定当前客户端的证书文件路径
key client.key# 指定当前客户端的私钥文件路径
verb 3# 指定日志文件的记录详细级别, 可选0-9, 等级越高日志内容越详细
persist-key # 重启服务时默认会重新读取key文件, 开启此配置后保持使用第一次的 key文件
persist-tun # 重新启动 VPN 时, 仍会一直保持tun是up状态
2.7.2.4)启动 OpenVPN 客户端
[root@openvpn-client ~] openvpn –daemon –cd /etc/openvpn –config client.ovpn –log-append /var/log/openvpn.log
–daemon # openvpn 以 daemon 方式启动
–cd dir # 配置文件的目录, openvpn 初始化前, 先切换到此目录
–config file # 客户端配置文件的路径
–log-append file # 日志文件路径, 如果文件不存在会自动创建
2.7.3)MacOS配置部署 OpenVPN 客户端
官方没有提供基于 MacOS 的 OpenVPN 的客户端
可以使用第三方 OpenVPN 客户端
参考链接: https://tunnelblick.net/downloads.html( 需要科学访问 )
2.7.4)IOS 配置部署 OpenVPN 客户端
第一步: 自己申请 美国区 APPLE ID或淘宝购买( 8-10 元一个)
blogking1999@gmail.com
Unicorn.1996
第二步:用 美国 ID登陆 APPLE STORE( 千万不要登陆 ICLOUD);
第三步:搜索 OpenVPN的APP 下载 ,安装;
第四步:安装完成后根据以下图文教程按步骤操作。
2.8)实现访问 VPN 服务器的内网主机
2.8.1)OpenVPN 服务器打开 ip_forward 功能
# 在服务器开启 ip_forward 转发功能
[root@open-server ~] echonet.ipv4.ip_forward = 1 >> /etc/sysctl.conf
[root@open-server ~] sysctl -p
net.ipv4.ip_forward = 1
2.8.2)配置实现内网服务器回应外网的请求的路由
2.8.2.1)在内网每个主机上添加路由
# 阿里云服务器不支持修改路由
[root@rocky8 ~] route add -net 10.8.0.0/24 gw 172.30.0.1
2.8.2.2)在内网主机指定的路由器上添加路由
[root@router ~] route add -net 10.8.0.0/24 gw 172.30.0.1
2.8.2.3)在 OpenVPN 服务器配置 iptables 规则
# 添加 SNAT 规则
# 方法 1
[root@open-server ~] echo ‘iptables -t nat -A POSTROUTING -s 10.8.0.0/24 ! -d 10.8.0.0/24 -j MASQUERADE’ >> /etc/rc.d/rc.local
# 方法 2
[root@open-server ~] echo ‘iptables -t nat -A POSTROUTING -s 10.8.0.0/24 ! -d 10.8.0.0/24 -j SNAT –to-source 172.30.0.1’ >> /etc/rc.d/rc.local
[root@open-server ~] chmod +x /etc/rc.d/rc.local
[root@open-server ~] iptables -vnL
[root@open-server ~] iptables -vnL -t nat