重点:

一键安装 OpenVPN 脚本

后续管理:证书吊销。给新用户颁发证书

关系型数据库相关概念

三个范式

1)OpenVPN 简介

1.1)VPN 介绍

专用网络:专用网就是 在两个网络(例如,北京和广州)之间架设一条专用线路,但是它并不需要真正地去铺设光缆之类的物理线路。虽然没有亲自去铺设,但是需要向电信运营商申请租用专线,在这条专用的线路上只传输自己的信息,所以安全稳定,同时也费用高昂。

VPNVirtual 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

├── email

├── 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

├── email

├── 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

├── email

├── 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

├── email

├── 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-SERVER172.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