OpenVPN 介绍

重点:

一键安装 OpenVPN 脚本

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

关系型数据库相关概念

三个范式

1)OpenVPN 简介

1.1)VPN 介绍

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

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

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

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

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

OpenVPN 介绍_第1张图片

VPN 工作逻辑

在外网的用户可以使用  client 连接组织搭建的  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://open.net

GitHub 地址:GitHub - OpenVPN/open: OpenVPN is an open source VPN daemon

OpenVPN 常见适用场景

实现远程主机到内网的连接

实现多个远程主机之间的连接

OpenVPN 示意图

OpenVPN 介绍_第7张图片

2)OpenVPN 部署

2.1)准备 OpenVPN 部署环境

官文文档: https://open.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 open 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://open.net

https://open.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 open

[root@centos7 ~] yum list open

[root@centos8 ~] yum list easy-rsa

[root@centos7 ~] yum list easy-rsa

范例:Ubuntu 查看 OpenVPN 版本

root@ubuntu2004:~ apt show open

[root@ubuntu1804 ~] apt list open

[root@ubuntu1804 ~] apt-cache madison open

[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 open -y

// "证书管理工具"    ( 重要 )

// 后续 不管是 < 服务器 客户端 用户 > 都需要使用到大量证书

[root@open-server ~] yum install easy-rsa -y

OpenVPN 介绍_第42张图片

2.2.2.2)查看包中相关文件

// 查看软件包详细信息

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

OpenVPN 介绍_第43张图片

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

[root@open-server ~] rpm -ql open

/etc/open

/etc/open/client

/etc/open/server

/run/open-client

/run/open-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/[email protected]

/usr/lib/systemd/system/[email protected]

/usr/lib/tmpfiles.d/open.conf

/usr/lib64/open

/usr/lib64/open/plugins

/usr/lib64/open/plugins/open-plugin-auth-pam.so

/usr/lib64/open/plugins/open-plugin-down-root.so

/usr/sbin/open

/usr/share/doc/open

/usr/share/doc/open/AUTHORS

/usr/share/doc/open/COPYING

/usr/share/doc/open/COPYRIGHT.GPL

/usr/share/doc/open/ChangeLog

/usr/share/doc/open/Changes.rst

/usr/share/doc/open/README

/usr/share/doc/open/README.auth-pam

/usr/share/doc/open/README.down-root

/usr/share/doc/open/README.systemd

/usr/share/doc/open/contrib

/usr/share/doc/open/contrib/OCSP_check

/usr/share/doc/open/contrib/OCSP_check/OCSP_check.sh

/usr/share/doc/open/contrib/README

/usr/share/doc/open/contrib/open-fwmarkroute-1.00

/usr/share/doc/open/contrib/open-fwmarkroute-1.00/README

/usr/share/doc/open/contrib/open-fwmarkroute-1.00/fwmarkroute.down

/usr/share/doc/open/contrib/open-fwmarkroute-1.00/fwmarkroute.up

/usr/share/doc/open/contrib/pull-resolv-conf

/usr/share/doc/open/contrib/pull-resolv-conf/client.down

/usr/share/doc/open/contrib/pull-resolv-conf/client.up

/usr/share/doc/open/management-notes.txt

/usr/share/doc/open/sample

/usr/share/doc/open/sample/sample-config-files

/usr/share/doc/open/sample/sample-config-files/README

/usr/share/doc/open/sample/sample-config-files/client.conf

/usr/share/doc/open/sample/sample-config-files/firewall.sh

/usr/share/doc/open/sample/sample-config-files/home.up

/usr/share/doc/open/sample/sample-config-files/loopback-client

/usr/share/doc/open/sample/sample-config-files/loopback-server

/usr/share/doc/open/sample/sample-config-files/office.up

/usr/share/doc/open/sample/sample-config-files/open-shutdown.sh

/usr/share/doc/open/sample/sample-config-files/open-startup.sh

/usr/share/doc/open/sample/sample-config-files/roadwarrior-client.conf

/usr/share/doc/open/sample/sample-config-files/roadwarrior-server.conf

/usr/share/doc/open/sample/sample-config-files/server.conf

/usr/share/doc/open/sample/sample-config-files/static-home.conf

/usr/share/doc/open/sample/sample-config-files/static-office.conf

/usr/share/doc/open/sample/sample-config-files/tls-home.conf

/usr/share/doc/open/sample/sample-config-files/tls-office.conf

/usr/share/doc/open/sample/sample-config-files/xinetd-client-config

/usr/share/doc/open/sample/sample-config-files/xinetd-server-config

/usr/share/doc/open/sample/sample-scripts

/usr/share/doc/open/sample/sample-scripts/auth-pam.pl

/usr/share/doc/open/sample/sample-scripts/bridge-start

/usr/share/doc/open/sample/sample-scripts/bridge-stop

/usr/share/doc/open/sample/sample-scripts/ucn.pl

/usr/share/doc/open/sample/sample-scripts/verify-cn

/usr/share/doc/open/sample/sample-windows

/usr/share/doc/open/sample/sample-windows/sample.o

/usr/share/man/man8/open.8.gz

/var/lib/open

[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. 将 open 目录名修改为 open

[root@open-server ~] cd /usr/share/doc && mv open-2.4.12/ open

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/open/sample/sample-config-files/server.conf /etc/open/

// 2. 准备证书颁发相关文件 ( "拷贝 证书相关文件" )

[root@open-server ~] cp -r /usr/share/easy-rsa/ /etc/open/easy-rsa-server

// 3. 准备颁发证书相关变量的配置文件 ( "拷贝 证书相关变量配置文件")

[root@open-server ~] cp /usr/share/doc/easy-rsa/vars.example /etc/open/easy-rsa-server/3/vars

// 4. 建议修改给 CA 和 OpenVPN 服务器 "颁发证书的有效期" ( 可适当加长 )

[root@open-server ~] vim /etc/open/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/open/

OpenVPN 介绍_第44张图片

OpenVPN 介绍_第45张图片

2.3)准备 证书相关文件

2.3.1)初始化 PKI 和 CA 颁发机构环境

2.3.1.1)脚本 easyrsa 帮助用法

[root@open-server ~] cd /etc/open/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/open/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 介绍_第46张图片

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/open/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 介绍_第47张图片

2.3.3)创建 OpenVPN 服务端证书申请

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

[root@open-server 3] pwd

/etc/open/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/open/easy-rsa-server/3/pki/reqs/server.req         # 生成的请求文件

key: /etc/open/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 介绍_第48张图片

2.3.4)颁发服务端证书

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

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

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

OpenVPN 介绍_第49张图片

2.3.4.2)颁发服务端证书

// 将上面 server.req 的申请, 颁发 server 类型的证书

[root@open-server ~] cd /etc/open/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/open/easy-rsa-server/3/pki/issued/server.crt    # 生

成服务器证书文件

OpenVPN 介绍_第50张图片

2.3.4.3)验证结果

[root@open-server ~] cd /etc/open/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 介绍_第51张图片

OpenVPN 介绍_第52张图片

OpenVPN 介绍_第53张图片

安装完 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/open/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/open/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/open/dh2048.pem 2048

[root@open-server ~] ll /etc/open/dh2048.pem

2.3.6)准备客户端证书环境

上面服务端证书配置完成,下面是配置客户端证书

// "准备客户端证书环境"

[root@open-server ~] cp -a /usr/share/easy-rsa/ /etc/open/easy-rsa-client

// 可选

[root@open-server 3] cp /usr/share/doc/easy-rsa/vars.example /etc/open/easy-rsa-client/3/vars

[root@open-server ~] cd /etc/open/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/open/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/open/easy-rsa-client/3

[root@open-server 3] pwd

/etc/open/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/open/easy-rsa-client/3/pki/reqs/wangxiaochun.req      # 私钥文件

key: /etc/open/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/open/easy-rsa-server/3

[root@open-server 3] pwd

/etc/open/easy-rsa-server/3

// 将 "客户端证书文件" 请求复制到 CA 的工作目录

# 或者: 直接将客户端证书文件拷贝至 CA 的工作目录也可以

# ( 原理就是将客户端证书文件拷贝到了 CA 的工作目录 )

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

[root@open-server 3] ./easyrsa import-req /etc/open/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/open/easy-rsa-client/3/pki/reqs/wangxiaochun.req

-rw------- 1 root root 895 Dec 23 16:10 /etc/open/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/open/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/open/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

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

客户端证书自动颁发脚本

// 1) 创建脚本存放目录

[root@open-server ~] mkdir /root/Shell -p

---- 客户端证书自动颁发脚本 ----

// 2) 编写脚本

[root@open-server ~] vim /root/Shell/open-user-crt.sh

#!/bin/bash

# 提示用户输入姓名拼音

read -p "请输入用户的姓名拼音(如:\${NAME}): " NAME

# 检查输入的姓名是否为空

if [ -z "$NAME" ]; then

    echo "姓名不能为空"

    exit 1

fi

# 定义路径变量

CLIENT_PATH="/etc/open/easy-rsa-client/3"

SERVER_PATH="/etc/open/easy-rsa-server/3"

LOG_FILE="/var/log/open-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/open-user-crt.sh

请输入用户的姓名拼音(如:${NAME}): wangjun

Common Name (eg: your user, host, or server name) [wangjun]: # 回车即可

Certificate created at: /etc/open/easy-rsa-server/3/pki/issued/wangjun.crt

// 5) "验证用户证书"

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

[root@open-server ~] tree | grep wangjun

OpenVPN 介绍_第54张图片

// "查看日志"

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

2.3.9)将 CA 和服务器证书相关文件复制到服务器相应的目录( 建议 )

创建目录:统一存放 服务器相关证书 文件

[root@open-server ~] mkdir /etc/open/certs

[root@open-server ~] cp /etc/open/easy-rsa-server/3/pki/ca.crt /etc/open/certs/

[root@open-server ~] cp /etc/open/easy-rsa-server/3/pki/issued/server.crt /etc/open/certs/

[root@open-server ~] cp /etc/open/easy-rsa-server/3/pki/private/server.key /etc/open/certs/

[root@open-server ~] cp /etc/open/easy-rsa-server/3/pki/dh.pem /etc/open/certs/

[root@open-server ~] ll /etc/open/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/open/client/wangxiaochun/

// 命令解析:

// 使用 find 命令搜索与 wangxiaochun 相关的所有证书文件并拷贝到我们上面创建的目录下

[root@open-server ~] find /etc/open/ \( -name "wangxiaochun.key" -o -name "wangxiaochun.crt" -o -name ca.crt \) -exec cp {} /etc/open/client/wangxiaochun \;

// "验证"

[root@open-server ~] ll /etc/open/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 介绍_第55张图片

2.4)准备 OpenVPN 服务器配置文件

2.4.1)服务器端配置文件 说明

烂泥:open配置文件详解-烂泥行天下

// 服务器配置文件 server.conf 文件中以 # 或 ; 开头的行都为注释

[root@open-server ~] grep -Ev "^#|^$" /etc/open/server.conf

;local a.b.c.d      // "本机监听 IP" 默认为本机所有 IP

port 1194           // "端口"

;proto tcp          // 协议, "生产推荐使用 TCP"

proto udp           // 默认使用的协议 UDP

;dev tap            // 创建以太网隧道设备, tap 设备实现以太网帧通过 Open 隧道, 可提供非 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                          // 启用 Open2.4.X 新版压缩算法

;push "compress lz4-v2"                   // 推送客户端使用新版压缩算法,和下面的comp-lzo不要同时使用

;comp-lzo                                 // 旧户端兼容的压缩配置,需要客户端配置开启压缩,open2.4.X等新版可以不用开启

;max-clients 100                          // 最多支持的客户端数量

;user nobody                              // 指定 open 服务的用户

;group nobody                             // 指定 open 服务的组

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 open-status.log                            // 服务器状态记录文件,每分钟记录一次相关信息

;log         open.log                             // 第一种日志记录方式,并指定日志路径,log会在open启动的时候清空日志文件, 不建议使用

;log-append open.log                             // 第二种日志记录方式,并指定日志路径,重启open后在之前的日志后面追加新的日志,生产环境建议使用

verb 3                                              // 设置日志级别,0-9,级别越高记录的内容越详细,0 表示静默运行,只记录致命错误,4 表示合理的常规用法,5 和 6 可以帮助调试连接错误。9 表示极度冗余,输出非常详细的日志信息

;mute 20                 // 对相同类别的信息只记录前20条到日志文件中

explicit-exit-notify 1   // 当服务端重启后通知客户端自动重新连接服务器, 此项配置仅能用于udp模式, tcp 模式无需配置即能实现重新连接功能, 且开启此项后tcp配置后将导致open服务无法启动, 所以 tcp 时必须不能开启此项

script-security 3                                       // 允许使用自定义脚本

auth-user-pass-verify /etc/open/checkpsw.sh via-env  // 指定自定义脚本路径

username-as-common-name                                 // 开启用户密码验证

client-cert-not-required                                // 只支持用户和密码方式验证,不支持证书,无此配置表示需要证书和用户密码多种验证

2.4.2)修改服务器端配置文件

[root@open-server ~] mv /etc/open/server.conf /etc/open/server.conf_bak

[root@open-server ~] vim /etc/open/server.conf

port 1194

proto tcp

dev tun

ca /etc/open/certs/ca.crt

cert /etc/open/certs/server.crt

key /etc/open/certs/server.key          # This file should be kept secret

dh /etc/open/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 open

group open

status /var/log/open/open-status.log

log-append /var/log/open/open.log

verb 3

mute 20

// "验证 open 用户"

[root@open-server ~] getent passwd open

open:x:993:990:OpenVPN:/etc/open:/sbin/nologin   

// "创建日志相关目录"

[root@open-server ~] mkdir /var/log/open -p && chown open.open /var/log/open

[root@open-server ~] ll -d /var/log/open

drwxr-xr-x 2 open open 6 Dec 23 17:49 /var/log/open

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

OpenVPN 介绍_第56张图片

2.5)启动 OpenVPN 服务

2.5.1)启动 OpenVPN 服务

// CentOS7 存在 [email protected] 文件

[root@centos7 ~] rpm -ql open | grep systemd

/usr/lib/systemd/system/[email protected]

/usr/lib/systemd/system/[email protected]

/usr/lib/systemd/system/[email protected]

/usr/share/doc/open-2.4.9/README.systemd

// "CentOS8 缺失 [email protected] 文件"

// 可以从 CentOS7 复制文件

[root@centos8 ~] rpm -ql open | grep systemd

/usr/lib/systemd/system/[email protected]

/usr/lib/systemd/system/[email protected]

/usr/share/doc/open/README.systemd

---

// "也可以主动编写 [email protected] 文件"

[root@open-server ~] vim /usr/lib/systemd/system/[email protected]

[Unit]

Description=OpenVPN Robust And Highly Flexible Tunneling Application On %I

After=network.target

[Service]

Type=notify

PrivateTmp=true

ExecStart=/usr/sbin/open --cd /etc/open/ --config %i.conf

[Install]

WantedBy=multi-user.target

// "启动 OpenVPN 服务"

// 注意 service 名称和文件名不一致

[root@open-server open] systemctl daemon-reload

[root@open-server open] systemctl enable --now open@server

[root@open-server open] systemctl status open@server

OpenVPN 介绍_第57张图片

2.5.2)验证服务状态

[root@open-server open] systemctl status open@server

# 注意端口号

[root@open-server ~] ss -ntlp | grep

# 日志

[root@open-server ~] cat /var/log/open/open.log

# IP 地址

[root@open-server ~] ip a

# 路由表

[root@open-server ~] route -n

OpenVPN 介绍_第58张图片

OpenVPN 介绍_第59张图片

OpenVPN 介绍_第60张图片

2.6)准备 OpenVPN 客户端配置文件

2.6.1)客户端 默认范例配置文件 说明

[root@open-server ~] grep '^[[:alpha:]].*' /usr/share/doc/open/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 的 客户端配置文件 是通用的,适用于所有用户

客户端证书文件 则是针对 每个用户单独生成和使用 的。

// 生成客户端文件, 文件后缀必须为 .o    ( "查看范例文件" )

[root@open-server ~] grep '^[[:alpha:]].*' /usr/share/doc/open/sample/sample-config-files/client.conf > /etc/open/client/wangxiaochun/client.o

// "创建一个给 wangxiaochun 用户进行使用的 OpenVPN 客户端配置文件"

// "OpenVPN 客户端配置文件" 可以复用, 后续其他用户可以使用同样的客户端配置文件

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

[root@open-server ~] ll /etc/open/client/wangxiaochun/

[root@open-server ~] vim /etc/open/client/wangxiaochun/client.o

[root@open-server ~] cat /etc/open/client/wangxiaochun/client.o

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 介绍_第61张图片

2.7)实现 OpenVPN 客户端

2.7.1)Windows 配置部署 OpenVPN 客户端

2.7.1.1)Windows 安装 OpenVPN 客户端

官方客户端下载地址:

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

OpenVPN 介绍_第62张图片

OpenVPN 客户端安装过程:

OpenVPN 介绍_第63张图片

OpenVPN 介绍_第64张图片

OpenVPN 介绍_第65张图片

安装完成

2.7.1.2)Windows 客户端配置准备

保存 配置文件与证书 到 Windows OpenVPN 客户端安装目录

Windows 右键打开 OpenVPN GUI 文件所在位置

在 OpenVPN 服务器打包 用户证书与配置文件

并下载发送给 Windows 客户端

// 在 OpenVPN 服务器 "打包用户证书与配置文件"

// 并下载发送给 Windows 客户端

[root@open-server ~] cd /etc/open/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 介绍_第66张图片

OpenVPN 客户端配置文件

2.7.1.3)Windows 客户端建立 OpenVPN 连接

在 Windows 中 打开 OpenVPN GUI 工具

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

OpenVPN 介绍_第67张图片

OpenVPN 介绍_第68张图片

OpenVPN 介绍_第69张图片

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 [email protected]

OpenVPN 介绍_第70张图片

2.7.1.4.2)观察 OpenVPN 服务器日志

[root@open-server ~] cat /var/log/open/open.log

[root@open-server ~] cat /var/log/open/open-status.log

OpenVPN 介绍_第71张图片

OpenVPN 介绍_第72张图片

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

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

[root@open-server ~] ss -nt  

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

OpenVPN 介绍_第73张图片

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

Windows 客户端的路由表

route print

OpenVPN 介绍_第74张图片

2.7.2)Linux 配置部署 OpenVPN 客户端

2.7.2.1)客户端安装 OpenVPN

[root@open-client ~] yum install open -y

2.7.2.2)下载客户端公钥与私钥以及 CA 证书至客户端

[root@open-client ~] cd /etc/open/

[root@open-client open] scp open-server:/data/easy-rsa-server/pki/ca.crt ./

[root@open-client open] scp open-server:/data/easy-rsa-client/pki/issued/client.crt ./

[root@open-client open] scp open-server:/data/easy-rsa-client/pki/private/client.key ./

2.7.2.3)客户端有了公钥和私钥后,还需要准备对应的客户端配置文件

[root@open-client ~] cat /etc/open/client.o

client                          # 指定当前 VPN 是客户端

dev tun                         # 使用 tun 隧道传输协议

proto tcp                       # 使用 tcp 协议传输数据

remote OpenVPN服务器地址 1194    # open 服务器 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@open-client ~] open --daemon --cd /etc/open --config client.o --log-append /var/log/open.log

--daemon              # open 以 daemon 方式启动

--cd dir              # 配置文件的目录, open 初始化前, 先切换到此目录

--config file         # 客户端配置文件的路径

--log-append file     # 日志文件路径, 如果文件不存在会自动创建

2.7.3)MacOS 配置部署 OpenVPN 客户端

官方没有提供基于 MacOS 的 OpenVPN 的客户端

可以使用第三方 OpenVPN 客户端

参考链接: https://tunnelblick.net/downloads.html    ( 需要科学访问 )

OpenVPN 介绍_第75张图片

2.7.4)IOS 配置部署 OpenVPN 客户端

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

[email protected]

Unicorn.1996

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

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

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

OpenVPN 介绍_第76张图片

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

你可能感兴趣的:(#,OpenVPN,OpenVPN)