相关推荐recommended
OpenVPN 介绍
作者:mmseoamin日期:2024-04-01

重点:

一键安装 OpenVPN 脚本

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

关系型数据库相关概念

三个范式

1)OpenVPN 简介

1.1)VPN 介绍

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

VPN:Virtual Private Network,虚拟私有网络,或称为虚拟专用网络,常用于在在公用网络上建立专用网络,进行加密]讯。在企业网络中有广泛应用。VPN 网关通过对数据包的加密和数据包目标地址的转换实现远程访问。VPN 可通过服务器、硬件、软件等多种方式实现。

分公司连接到总部 有多种方式,其中两种主要方式是 通过专线连接 和 使用 VPN 连接。

专线连接 是通过物理线路(如光纤、以太网等)直接连接分公司和总部的网络。这种连接通常是由专业的网络提供商提供和管理的,提供更高的带宽和稳定性。专线连接通常有固定的费用,并且在网络安全和性能方面提供较好的保障。

VPN(虚拟专用网络)连接是通过公共网络(如互联网)进行加密通信,允许分公司的网络安全地连接到总部的网络。VPN 通过加密数据流,使其在公共网络中传输时变得安全,可以通过互联网以较低的成本建立连接。

OpenVPN 介绍,第1张

VPN 工作逻辑

在外网的用户可以使用 vpn client 连接组织搭建的 vpn server 以建立通信隧道,随后便建立了虚拟的私人网络,处于外网的 worker 和内网中的 server 可以相互通信。

OpenVPN 介绍,第2张

OpenVPN 介绍,第3张

1.2)VPN 常见应用模式

1.2.1)点对站点 peer to site

允许单个用户或设备通过 VPN 客户端连接到一个已建立的 VPN 网络,实现远程安全访问。( 建议使用 OpenVPN )

OpenVPN 介绍,第4张

1.2.2)站点对站点 site to site

是两个网络之间的连接,用于连接不同地理位置的局域网,提供安全的远程通信。( 建议使用硬件 VPN )

OpenVPN 介绍,第5张

1.3)OpenVPN

OpenVPN 介绍,第6张

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 示意图

OpenVPN 介绍,第7张

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, 可用区 A IPv4 的地址段 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

OpenVPN 介绍,第8张

阿里云购买链接:

阿里云登录 - 欢迎登录阿里云,安全稳定的云计算服务平台

OpenVPN 介绍,第9张

OpenVPN 介绍,第10张

OpenVPN 介绍,第11张

2.1.1.2)需先 创建网络和交换机

OpenVPN 介绍,第12张

模拟 企业专有网络( 企业专有网络 )

OpenVPN 介绍,第13张

创建交换机( 类似划分 VLAN,划分子网 )

OpenVPN 介绍,第14张

OpenVPN 介绍,第15张

继续 配置云服务器

OpenVPN 介绍,第16张

OpenVPN 介绍,第17张

登录凭证

OpenVPN 介绍,第18张

配置概要

OpenVPN 介绍,第19张

停机  >>  修改私网 IP 地址

OpenVPN 介绍,第20张

OpenVPN 介绍,第21张

OpenVPN 介绍,第22张

2.1.1.3)再购买 两台 内网无公网的 ECS

注意:需要和第一台主机在同一个地域和可用区( 华北 3 张家口 可用区 A )

阿里云登录 - 欢迎登录阿里云,安全稳定的云计算服务平台

OpenVPN 介绍,第23张

购买两台

OpenVPN 介绍,第24张

OpenVPN 介绍,第25张

主机名:web[1,2].magedu.org

OpenVPN 介绍,第26张

2.1.1.4)验证主机配置

创建完成,三台主机

OpenVPN 介绍,第27张

OpenVPN 介绍,第28张

将三台主机关闭  >> 批量重置实例密码

OpenVPN 介绍,第29张

OpenVPN 介绍,第30张

OpenVPN 介绍,第31张

将 Web-Server IP 地址 分别修改为 172.30.0.100,172.30.0.200

更多  >>  网络与安全组  >>  修改私有 IP 地址

OpenVPN 介绍,第32张

远程连接  >>  为 Web-Server 安装 HTTPD 服务

OpenVPN 介绍,第33张

OpenVPN 介绍,第34张

---

// "为两台局域网 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 介绍,第35张

// "连接 OpenVPN-Server"

[root@web02 ~] ssh 172.30.0.1

[root@open-server ~] hostnamectl set-hostname open-server.magedu.org

OpenVPN 介绍,第36张

大家思考一下:

我们连接 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

OpenVPN 介绍,第37张

// "免密认证"

[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  >>  安全组

OpenVPN 介绍,第38张

安全组规则c

添加 ICMP

添加 1194/TCP/UDP

OpenVPN 介绍,第39张

2.1.2)环境 2:局域网 OpenVPN 实战环境

OpenVPN 介绍,第40张

// 共四台主机

1 openvpn server:

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/

OpenVPN 介绍,第41张

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

OpenVPN 介绍,第42张

范例: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

OpenVPN 介绍,第43张

2.2.2.2)查看包中相关文件

// 查看软件包详细信息

[root@open-server ~] rpm -qi openvpn easy-rsa

OpenVPN 介绍,第44张

// "查看软件包文件信息"

[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_EXPIRE     3650

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/

OpenVPN 介绍,第45张

OpenVPN 介绍,第46张

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

OpenVPN 介绍,第47张

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

OpenVPN 介绍,第48张

2.3.2)创建 CA 机构环境

// "调用 build-ca"

[root@open-server 3] ./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-server 3] 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, 7 files

// 查看生成 CA 相关的文件

[root@open-server 3] cat pki/serial

[root@open-server 3] ll pki/index.txt

[root@open-server 3] ll pki/ca.crt pki/private/ca.key

// "查看生成的自签名证书"

[root@open-server 3] cat pki/ca.crt

[root@open-server 3] openssl x509 -in pki/ca.crt -noout -text

// 基于 Windows 系统查看证书

[root@open-server 3] sz pki/ca.crt

OpenVPN 介绍,第49张

OpenVPN 介绍,第50张

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

OpenVPN 介绍,第51张

2.3.4)颁发服务端证书

2.3.4.1)查看颁发证书命令用法

[root@open-server ~] cd /etc/openvpn/easy-rsa-server/3

[root@open-server 3] ./easyrsa help sign

OpenVPN 介绍,第52张

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 any other input to abort.

 Confirm request details: yes     // 输入 yes 回车

Certificate created at: /etc/openvpn/easy-rsa-server/3/pki/issued/server.crt    # 生

成服务器证书文件

OpenVPN 介绍,第53张

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

OpenVPN 介绍,第54张

OpenVPN 介绍,第55张

OpenVPN 介绍,第56张

OpenVPN 介绍,第57张

OpenVPN 介绍,第58张

安装完 ca.crt 上级 CA 证书后,我们的 server.crt 证书就受系统信任啦~

OpenVPN 介绍,第59张

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, 11 file

   

// "生成证书申请所需目录 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

OpenVPN 介绍,第60张

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_EXPIRE   825

# 将上面行修改为下面

set_var EASYRSA_CERT_EXPIRE 90

----

// "颁发客户端证书"

// 注意: "修改用户名"

[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 4608 Dec 23 15:23 server.crt

-rw------- 1 root root 4506 Dec 23 16:33 wangxiaochun.crt

[root@open-server 3] ll pki/certs_by_serial/

[root@open-server 3] cat pki/issued/wangxiaochun.crt

OpenVPN 介绍,第61张

如果需要颁发的客户端证书较多,可以使用下面脚本实现客户端证书的批量颁发

客户端证书自动颁发脚本

// 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 sign client "${NAME}" <

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

OpenVPN 介绍,第62张

// "查看日志"

[root@open-server 3] cat /var/log/openvpn-script.log

OpenVPN 介绍,第63张

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 系统下进行使用

OpenVPN 介绍,第64张

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

OpenVPN 介绍,第65张

2.4.3)准备 iptables 规则 和 内核参数

如图:

10.8.0.0/24 VPN 虚拟网段 的主机,他们基于 VPN-SERVER 的 172.30.0.1 网卡做 SNAT 转换 去访问 172.30.0.0/24 网段的主机。

OpenVPN 介绍,第66张

// "在服务器开启 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

OpenVPN 介绍,第67张

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

OpenVPN 介绍,第68张

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

OpenVPN 介绍,第69张

OpenVPN 介绍,第70张

OpenVPN 介绍,第71张

OpenVPN 介绍,第72张

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 压缩

OpenVPN 介绍,第73张

2.7)实现 OpenVPN 客户端

2.7.1)Windows 配置部署 OpenVPN 客户端

2.7.1.1)Windows 安装 OpenVPN 客户端

官方客户端下载地址:

https://openvpn.net/community-downloads/

OpenVPN 介绍,第74张

OpenVPN 客户端安装过程:

OpenVPN 介绍,第75张

OpenVPN 介绍,第76张

OpenVPN 介绍,第77张

安装完成

OpenVPN 介绍,第78张

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 Dec 23 19:13 wangxiaochun.tar

[root@open-server wangxiaochun] sz /root/wangxiaochun.tar

放置到 Windows 客户端默认安装目录下 C:\Program Files\OpenVPN\config 目录

OpenVPN 介绍,第79张

OpenVPN 客户端配置文件

OpenVPN 介绍,第80张

2.7.1.3)Windows 客户端建立 OpenVPN 连接

在 Windows 中 打开 OpenVPN GUI 工具

OpenVPN 介绍,第81张

稍等一会儿,在状态栏显示以下图标,右键点连接

OpenVPN 介绍,第82张

OpenVPN 介绍,第83张

OpenVPN 介绍,第84张

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

OpenVPN 介绍,第85张

OpenVPN 介绍,第86张

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

OpenVPN 介绍,第87张

OpenVPN 介绍,第88张

2.7.1.4.3)验证 OpenVPN 服务器连接状态

可以在 OpenVPN 服务器看到 公网客户端 IP 地址 连接我们 OpenVPN 服务器 1194 端口的连接

[root@open-server ~] ss -nt  

OpenVPN 介绍,第89张

2.7.1.4.4)验证 Windows 客户端的 IP地址

OpenVPN 介绍,第90张

2.7.1.4.5)验证 Windows 客户端的路由表

Windows 客户端的路由表

route print

OpenVPN 介绍,第91张

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    ( 需要科学访问 )

OpenVPN 介绍,第92张

2.7.4)IOS 配置部署 OpenVPN 客户端

第一步: 自己申请 美国区 APPLE ID 或淘宝购买( 8-10 元一个)

blogking1999@gmail.com

Unicorn.1996

第二步:用 美国 ID 登陆 APPLE STORE( 千万不要登陆 ICLOUD);

第三步:搜索 OpenVPN 的APP 下载 ,安装;

第四步:安装完成后根据以下图文教程按步骤操作。

OpenVPN 介绍,第93张

2.8)实现访问 VPN 服务器的内网主机

2.8.1)OpenVPN 服务器打开 ip_forward 功能

# 在服务器开启 ip_forward 转发功能

[root@open-server ~] echo net.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