• OpenVPN 介绍


    重点:

    一键安装 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, 可用区 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

    阿里云购买链接:

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

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

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

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

    继续 配置云服务器

    登录凭证

    配置概要

    停机  >>  修改私网 IP 地址

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

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

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

    购买两台

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

    2.1.1.4)验证主机配置

    创建完成,三台主机

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

    Web-Server IP 地址 分别修改为 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 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/

    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_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/

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

    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 any other 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, 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

    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

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

    客户端证书自动颁发脚本

    // 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

    // "查看日志"

    [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"oname"wangxiaochun.crt"onameca.crt" role="presentation" style="position: relative;">name"wangxiaochun.key"oname"wangxiaochun.crt"onameca.crt -exec cp {} /etc/openvpn/client/wangxiaochun \;

    // "验证"

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

    total 16

    -rw------- 1 root root 1204 Aug  3 21:05 ca.crt

    -rw------- 1 root root 4506 Aug  3 21:05 wangxiaochun.crt

    -rw------- 1 root root 1704 Aug  3 21:05 wangxiaochun.key

    ----

    // 作用: 利于我们后续直接将目录打包发送给用户在 Windows 系统下进行使用

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

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

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

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

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

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

    port 1194           // "端口"

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

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

    ;dev tap            // 创建以太网隧道设备, tap 设备实现以太网帧通过 Openvpn 隧道, 可提供非 IP 协议如 IPX 和 AppleTalk 等的支持, tap 等当于一个以太网设备, 它操作第二层数据包如以太网数据帧.

    dev tun             // 创建 IP 路由隧道, "生产推存使用 tun" 互联网使用 tun, 一个 tun 设备大多时候被用于基于 IP 协议的通讯 tun 模拟了网络层设备, 操作第三层数据包比如 IP 数据封包.

    ;dev-node MyTap     // TAP-Win32 的设备驱动. 非 windows 系统不需要

    ca ca.crt           // "CA 证书文件路径"

    cert server.crt     // "服务器证书文件路径"

    key server.key      // "服务器私钥文件路径"

    dh dh2048.pem       // "DH 参数文件路径"

    ;topology subnet

    server 10.8.0.0 255.255.255.0        // "OpenVPN 客户端连接后自动分配的 IP 网段" 默认会给服务器分配此网段的第一个 IP 将做为客户端的网关, ( 注意: 不要和内网网段相同 )

    ifconfig-pool-persist ipp.txt        // 记录客户端和虚拟 IP 地址分配的文件, 无需配置, "建议注释"    (; 该符号开头的就是注释 )

    ;server-bridge 10.8.0.4 255.255.255.0 10.8.0.50 10.8.0.100  // 配置网桥模式, 无需配置, "建议注释"

    ;server-bridge

    ;push "route 192.168.10.0 255.255.255.0"     // 推送给客户端的到达服务器后面网段的静态路由, 网关是服务器地址 10.8.0.1  ( 实现 VPN 客户端可以连接内网其他网段的主机 )

    ;push "route 192.168.10.100 255.255.255.255" // 用 255.255.255.255 可实现只能访问内网单个主机的功能, 比如: jumpserver

    ;push "route 192.168.20.0 255.255.255.0"     // 推送路由信息到客户端, 以允许客户端能够连接到服务器背后的其它私有网络

    ;client-config-dir ccd                       // 为特定客户端添加路由信息, 此路由是客户端后面的网段而非服务端的网段, "无需设置"

    ;route 192.168.40.128 255.255.255.248

    ;client-config-dir ccd    

    ;route 10.9.0.0 255.255.255.252

    ;learn-address ./script                    // 指定外部脚本文件, 实现创建不同组的 iptables 规则, "无需配置"

    ;push "redirect-gateway def1 bypass-dhcp"  // 启用此配置后客户端所有流量都将通过 VPN 服务器进行转发, "因此生产一般无需配置此项"

    ;push "dhcp-option DNS 208.67.222.222"    // 推送 DNS 服务器地址, "无需配置"

    ;push "dhcp-option DNS 208.67.220.220"

    ;client-to-client                         // 允许不同的客户端直接通信,不安全, "生产环境一般无需配置"

    ;duplicate-cn                             // "多个用户共用一个证书, 一般用于测试环境," ( 生产环境建议一个用户一个证书, 无需开启 )

    keepalive 10 120                          // 设置服务端活动的检测的间隔和超时时间, 每隔 10 秒 ping 一次, 120 秒没有回应则认为已经断线

    tls-auth ta.key 0                         // 访止 DoS 等攻击的安全增强配置, 服务器和每个客户端都需要拥有此密钥文件. 第二个参数在服务器端为 0, 客户端为 1

    cipher AES-256-CBC                        // 加密算法

    ;compress lz4-v2                          // 启用 Openvpn2.4.X 新版压缩算法

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

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

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

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

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

    persist-key                              // 重启服务时默认会重新读取key文件,开启此配置后保持使用第一次的key文件, 生产环境无需开启

    persist-tun                              // Don’t close and reopen TUN/TAP device or run up/down

    scripts across SIGUSR1 or --ping-restart restarts,    // 生产环境建议无需开启

    status openvpn-status.log                            // 服务器状态记录文件,每分钟记录一次相关信息

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

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

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

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

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

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

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

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

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

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

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

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

    port 1194

    proto tcp

    dev tun

    ca /etc/openvpn/certs/ca.crt

    cert /etc/openvpn/certs/server.crt

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

    dh /etc/openvpn/certs/dh.pem

    server 10.8.0.0 255.255.255.0

    push "route 172.30.0.0 255.255.255.0"      # 内网网段地址

    keepalive 10 120

    cipher AES-256-CBC

    compress lz4-v2

    push "compress lz4-v2"

    max-clients 2048

    user openvpn

    group openvpn

    status /var/log/openvpn/openvpn-status.log

    log-append /var/log/openvpn/openvpn.log

    verb 3

    mute 20

    // "验证 openvpn 用户"

    [root@open-server ~] getent passwd openvpn

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

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

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

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

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

    2.4.3)准备 iptables 规则 内核参数

    如图:

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

    // "在服务器开启 ip_forward 转发功能"

    [root@open-server ~] echo net.ipv4.ip_forward = 1 >> /etc/sysctl.conf

    [root@open-server ~] sysctl -p

    net.ipv4.ip_forward = 1

    // "添加 SNAT 规则"

    // 虚拟网络: 10.8.0.0

    [root@open-server ~] echo 'iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -j MASQUERADE' >> /etc/rc.d/rc.local

    // "永久生效"

    [root@open-server ~] chmod +x /etc/rc.d/rc.local

    [root@open-server ~] /etc/rc.d/rc.local

    // "验证规则"

    [root@open-server ~] iptables -vnL -t nat

    2.5)启动 OpenVPN 服务

    2.5.1)启动 OpenVPN 服务

    // CentOS7 存在 openvpn-server@.service 文件

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

    /usr/lib/systemd/system/openvpn-client@.service

    /usr/lib/systemd/system/openvpn-server@.service

    /usr/lib/systemd/system/openvpn@.service

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

    // "CentOS8 缺失 openvpn-server@.service 文件"

    // 可以从 CentOS7 复制文件

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

    /usr/lib/systemd/system/openvpn-client@.service

    /usr/lib/systemd/system/openvpn-server@.service

    /usr/share/doc/openvpn/README.systemd

    ---

    // "也可以主动编写 openvpn@.service 文件"

    [root@open-server ~] vim /usr/lib/systemd/system/openvpn@.service

    [Unit]

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

    After=network.target

    [Service]

    Type=notify

    PrivateTmp=true

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

    [Install]

    WantedBy=multi-user.target

    // "启动 OpenVPN 服务"

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

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

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

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

    2.5.2)验证服务状态

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

    # 注意端口号

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

    # 日志

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

    # IP 地址

    [root@open-server ~] ip a

    # 路由表

    [root@open-server ~] route -n

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

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

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

    client                     # 指明客户端

    dev tun                    # 指定和服务端一致的接口类型

    proto udp                  # 指定和服务端一致的协议类型

    remote my-server-1 1194    # 服务器端的 IP 或 FQDN 及端口

    resolv-retry infinite      # 指定服务器端 FQDN 而非 IP 时, 当客户端重新连接后会重新解 FQDN 对应的 IP

    nobind                     # 客户端不绑定监听端口, 随机打开端口连接到服务端的端口

    persist-key

    persist-tun

    ca ca.crt

    cert client.crt

    key client.key

    remote-cert-tls server     # 使用服务器证书校验方式

    tls-auth ta.key 1          # 安全加强

    cipher AES-256-CBC

    verb 3

    2.6.2)生成 客户端 用户的 配置文件

    OpenVPN 的 客户端配置文件 是通用的,适用于所有用户

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

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

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

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

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

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

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

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

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

    client

    dev tun                           # 需与服务器端配置文件的信息匹配

    proto tcp                         # 需与服务器端配置文件的信息匹配

    remote 10.0.0.8 1194              # 生产中为 OpenVPN 公网 IP 或者 FQDN 域名

    resolv-retry infinite

    nobind

    #persist-key

    #persist-tun

    ca ca.crt

    cert wangxiaochun.crt             // "注意修改用户名"

    key wangxiaochun.key              // "注意修改用户名"

    remote-cert-tls server

    #tls-auth ta.key 1

    cipher AES-256-CBC

    verb 3                              # 此值不能随意指定, 否则无法通信

    compress lz4-v2                     # 此项在 OpenVPN2.4.X 版本使用, 需要和服务器端保持一致, 如不指定, 默认使用 comp-lz 压缩

    2.7)实现 OpenVPN 客户端

    2.7.1)Windows 配置部署 OpenVPN 客户端

    2.7.1.1)Windows 安装 OpenVPN 客户端

    官方客户端下载地址:

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

    OpenVPN 客户端安装过程:

    安装完成

    2.7.1.2)Windows 客户端配置准备

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

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

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

    并下载发送给 Windows 客户端

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

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

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

    // "打包用户证书与配置文件"  

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

    [root@open-server wangxiaochun] ll /root

    -rw-r--r-- 1 root root 20480 Dec 23 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 ~] 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

  • 相关阅读:
    如何使用ebpf kprobe探测内核函数
    机器学习基础之《回归与聚类算法(4)—逻辑回归与二分类(分类算法)》
    Python机器学习实战-特征重要性分析方法(6):XGBoost(附源码和实现效果)
    羡慕实时数据看板?来看看Python的交互数据分析可视化工具! ⛵
    RK平台ADB不识别问题排查
    构建一个高可用的MySQL主从复制集群
    Text to image论文精读PDF-GAN:文本生成图像新度量指标SSD Semantic Similarity Distance
    小程序获取用户手机号
    操作指南|JumpServer与Keycloak集成对接
    什么是微服务?微服务架构有哪些功能?
  • 原文地址:https://blog.csdn.net/weixin_74962223/article/details/136165603