×

告别云厂商绑定!基于OpenVPN搭建多云互通网络,充分发挥厂商的优惠优势,低成本上云

hqy hqy 发表于2025-10-27 23:17:52 浏览10 评论0

抢沙发发表评论

国内主流的云厂商,如阿里云、腾讯云、华为云等经常会有优惠活动或引流的高性价比的产品,特别对于新用户的优惠力度更大。

对于中小微企业和个人可以综合各个云厂商的优惠产品和策略,合理购买云产品来支撑业务需求,从而降低云资源的采购成本。

对于中大型企业也应该考虑建立多云的容灾策略,防止单一厂商绑定以及云厂商级别的故障导致业务中断。

图为“2023年中国公有云 IaaS + PaaS 市场(仅国内市场)排名及份额”,可以依次了解各云厂商的优惠活动。

2023年中国公有云 IaaS + PaaS 市场(仅国内市场)排名及份额
2023年中国公有云 IaaS + PaaS 市场(仅国内市场)排名及份额

多云产品要解决的技术问题

在选择多云产品建设业务时,要考虑以下技术问题:

  • • 跨云资源的管理:如云产品管理、账号权限、安全、监控、告警、备份恢复等
  • • 跨云应用的管理:如应用的调度、互相访问

对于跨云资源的管理前期阶段建议分别登录各个云平台进行操作,后续企业发展壮大后可以建立多云资源管理平台,统一管理各个云资源。

对于跨云应用管理中应用的调度,主要是业务应用部署运行在哪个云平台的虚拟机VM上或容器服务上,这个可以根据实际资源进行人工调度。

其中需要特别关注和处理的是跨云应用访问的问题,由于各个云平台的网络隔离,通过公网进行数据通信会给业务带来一定的复杂性,且公网访问会增加成本

因此,需要一种低成本的方案来解决跨云访问的问题。

真实的多云成本优化案例

藏云阁技术资源社区(https://cncfstack.com)提供了多种资源的下载服务,如容器镜像、HelmChart、Logo、代码、文件、网站、论坛、文档、工具等,这些服务需要大量的云资源支持。

但是,社区目前处于早期阶段,对成本极为敏感,因此多云的优惠策略对公司的生存和发展极为重要。

目前整体的云产品和架构如下:

藏云阁IT架构
藏云阁IT架构

整体方案的核心是在同一个城市(杭州),打通所有VPC网络,然后跨云共用基础公共服务。

由于大部分服务如论坛、Harbor、Gitea以及官网服务都是用到 PostgreSQL 和 Redis,每台机器上都运行会导致该节点资源资源争抢,所以将这些公共的 PaaS 中间件部署在性能和稳定性较好的阿里云ECS主机上。同时,这台主机也作为了 VPC Server节点。

Gitea、Harbor和论坛是用的PostgreSQL和Redis,也都是使用同一套阿里云上实例。由于 Harbor 的官方部署工程是打包在一起的,所以独立出 PostgreSQL 和 Reids 需要进行一些特殊的配置调整。

官网的搜索功能基于 ElasticSearch,部署在华为云的虚拟机上,网络打通后直接通过DNS解析成内网IP通信。

内网域名公网解析
内网域名公网解析

考虑到多云配置私有DNS比较麻烦,就使用阿里云公网免费DNS服务将 “公网域名“ 解析为 “私有IP“,如 redis.inner.cncfstack.com 解析为 172.31.24.x ,在任何云平台上的服务使用redis时使用域名配置即可。由于网络层已经基于 OpenVPN 打通了,所以能正常访问。

由于整个社区服务涉及多个三级子域名,上百个具体域名,这些域名的HTTPS证书是基于免费的 Let's Encrypt 证书,在 永久免费的HTTPS/TLS通配符域名合法证书申请很简单,不要再自签证书啦[最佳实践] 文章有详细的介绍。

其他还有如资源存储 TB 级别,使用块存储的成本相对较高,因此能用对象存储OSS的就尽量使用OSS。下载时需要有公网访问的带宽和流量成本,公网LB和网关成本较高,所以选择的是低配置的公网出口+CDN缓存加速的方式减少回源成本。

综上,目前整体平台成本优化策略:

  • • DNS解析使用阿里云免费DNS服务
  • • HTTPS证书使用Let's Encrypt免费证书
  • • 中间件是多云共用的
  • • 存储能使用 OSS 的就不用块磁盘
  • • 资源下载能用 CDN 就不用大带宽的公网出口
  • • 网络专线打通使用开源的 OpenVPN

经过上诉的成本优化后,整体资源成本目前在可接受范围。由于这种方案的灵活性,后续资源扩容时,可以在其他云平台上添加新的节点,快速配置后即可融入使用。

基于 OpenVPN 多云互通网络方案中的跨云网络延迟问题,可以选择在同一个物理地域(如杭州),同城市的网络延迟较低,比如同城可以支撑同城双活或两地三中心架构。对于网络带宽问题,由于带宽越大成本越高,因此在公网出口带宽较小时需要人为控制跨云传输的数据,比如只进行数据库缓存之类的小数据传输,对于大数据传输,可以选择使用对象存储 OSS。

下文是 OpenVPN 安装部署和配置的详细指引,需要有一定的运维操作能力

OpenVPN部署与配置

OpenVPN 的安装与配置主要步骤如下:

软件下载

OpenVPN软件的安装配置方式有三种:基于源码安装,使用软件包安装,使用容器镜像。

本文使用源码安装方式进行安装,选择 2.6.14 版本。

与 OpenVPN 一起工作的还有 EasyRSA,EasyRSA 是基于 OpenVPN 的一个工具包,提供了一些工具,如证书管理工具,用于生成和管理 OpenVPN 的证书和密钥。

官网的下载地址为:

https://github.com/OpenVPN/openvpn/releases/download/v2.6.14/openvpn-2.6.14.tar.gz
https://github.com/OpenVPN/easy-rsa/releases/download/v3.2.4/EasyRSA-3.2.4.tgz

藏云阁文件同步服务,同步后的下载地址为:

https://file.cncfstack.com/github.com/OpenVPN/easy-rsa/releases/download/v3.2.4/EasyRSA-3.2.4.tgz
https://file.cncfstack.com/github.com/OpenVPN/openvpn/releases/download/v2.6.14/openvpn-2.6.14.tar.gz

编译安装

OpenVPN 在编译安装时会有一些依赖包,需要提前安装。缺少包会导致 ./configure 阶段失败,在文章结尾会有一些报错的例子和解决方案

yum/dnf 相关的系统安装方式和包如下:

yum install -y openssl-devel \
    automake                 \
    lzo lzo-devel            \
    pam pam-devel            \
    pkgconfig  pkg-config    \
    libtool  libnl3-devel    \
    libcap-ng-devel autoconf \
    lz4-devel lz4-libs           

apt/dpkg 相关的系统安装方式和包如下:

apt update && apt install -y \
    libssl-dev               \
    liblzo2-2 liblzo2-dev    \
    libpam0g-dev             \
    libcap-ng-dev            \
    automake                 \
    pkg-config               \
    libtool                  \
    liblz4-dev liblz4-1      \
    libnl-3-dev libnl-genl-3-dev libnl-route-3-dev

依赖安装完成后,就可以编译安装 OpenVPN。

tar xf openvpn-2.6.14.tar.gz && cd openvpn-2.4.6
autoreconf -i -v -f
./configure --prefix=/your/path/openvpn/
make
make install

如果安装过程出错,请查看错误信息,根据错误信息进行相应的处理后重新从 ./configure 步骤开始即可。

该软件包也可以作为 VPN Client 客户端,安装步骤方式一样。客户端也可以使用其他兼容的基于图形界面的客户端。

OpenVPN初始化

OpenVPN 安装成功后,需要做一些初始化准备,比如 pki 目录和设置

mkdir -p /your/path/openvpn/etc/pki
echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.conf
sysctl -p

ip_forward 路由转发策略在有 Docker 或 Kuberentes 的环境,可能已尽设置过了,可以先检查一下。

安装EasyRSA

EasyRSA是个工具包解压到 OpenVPN 的安装目录即可

tar xf EasyRSA-3.2.4.tgz -C /your/path/openvpn

初始化证书

在 /your/path/openvpn/EasyRSA-* 目录下创建 vars 文件,内容如下:

cd /your/path/openvpn/EasyRSA-*

cat > vars <<EOF
set_var EASYRSA_REQ_COUNTRY "CN"
set_var EASYRSA_REQ_PROVINCE "ZheJiang"
set_var EASYRSA_REQ_CITY "HangZhou"
set_var EASYRSA_REQ_ORG "OpenVPN CA"
set_var EASYRSA_REQ_EMAIL "zhaowenyu@cncfstack.com"
set_var EASYRSA_REQ_OU "MyVPN"
EOF

这里填写了证书的属性信息,如国家、省、市、组织、组织单位、邮箱、OU等。

然后开始进行证书的初始化

[root@myhost EasyRSA-3.0.4]# ./easyrsa init-pki

创建CA证书

整体使用自签名的证书,所以需要先构建CA证书。

[root@myhost EasyRSA-3.0.4]# ./easyrsa build-ca

在创建CA证书,为防止私钥丢失后非法获取私钥内容,pass phrase需要输入2次私钥加密的密码。在使用CA签发证书时,需要使用CA证书加密密码。

Common Name 是证书的根域名,不过一般不会使用到,可以填写任意字符串内容

创建Server端服务的证书-REQ请求文件

服务端证书是指运行在 OpenVPN Server机器上需要的证书。OpenVPN使用的双向证书认证,所以后文还会有客户端证书。

[root@myhost EasyRSA-3.0.4]# ./easyrsa gen-req my-vpn-server nopass

Common Name 是证书认证的域名或者IP地址或者主机名,默认获取的如果正确使用回车即可。

创建Server端服务的证书-CA签发Server端服务证书

签发Server服务端证书

[root@myhost EasyRSA-3.0.4]# ./easyrsa sign server my-vpn-server

签发证书时需要输入确认信息“yes”

同时签发会使用到CA证书,因此要填写创建CA时的密码

创建 Diffie-Hellman 防止中间人攻击

DH 参数文件,用于DH密钥交换,防止中间人攻击。确保穿越不安全网络

[root@myhost EasyRSA-3.0.4]# ./easyrsa gen-dh

如果在配置文件中服务器设置了DH参数,则必须每个客户端开启。

创建 ta.key 防止Dos攻击

ta.key 主要用来防止Dos攻击,提升安全的措施

[root@myhost EasyRSA-3.0.4]# /your/path/openvpn/sbin/openvpn --genkey --secret pki/ta.key

如果在配置文件中服务器设置了防御DoS等攻击的ta.key,则必须每个客户端开启。

创建客户端证书

创建客户端证书的步骤和服务端证书的步骤基本一致,注意配置差异即可

# 创建证书请求文件
[root@myhost EasyRSA-3.0.4]# ./easyrsa gen-req my-vpn-client1 nopass

# CA签发证书
[root@myhost EasyRSA-3.0.4]# ./easyrsa sign client my-vpn-client1

my-vpn-client1 是自定义的客户端证书名称。

可以按需创建任意多个客户端证书。

复制证书文件到 OpenVPN 的配置目录

对于 VPN Server 端,将文件复制到 /your/path/openvpn/etc/pki/ 目录下

[root@myhost EasyRSA-3.0.4]# cp pki/ca.crt /your/path/openvpn/etc/pki/
[root@myhost EasyRSA-3.0.4]# cp pki/private/my-vpn-server.key /your/path/openvpn/etc/pki/
[root@myhost EasyRSA-3.0.4]# cp pki/issued/my-vpn-server.crt /your/path/openvpn/etc/pki/
[root@myhost EasyRSA-3.0.4]# cp pki/dh.pem /your/path/openvpn/etc/pki/
[root@myhost EasyRSA-3.0.4]# cp pki/ta.key /your/path/openvpn/etc/pki/

对于客户端文件,将文件复制到客户端的 /your/path/openvpn/etc/pki/ 目录下。

注意: 客户端是指其他的服务器或电脑,和服务端不是同一台机器。对于文件复制到其他机器上,可以使用 scp 命令,或者其他方式。


mkdir ~/my-vpn-client1-pki

[root@myhost EasyRSA-3.0.4]# cp pki/ca.crt ~/my-vpn-client1-pki/
[root@myhost EasyRSA-3.0.4]# cp pki/issued/my-vpn-client1.crt ~/my-vpn-client1-pki/
[root@myhost EasyRSA-3.0.4]# cp pki/private/my-vpn-client1.key ~/my-vpn-client1-pki/
[root@myhost EasyRSA-3.0.4]# cp pki/ta.key ~/my-vpn-client1-pki/

cd ~/my-vpn-client1-pki
tar czvf my-vpn-client1-pki.tar.gz .

将压缩包发送给客户端,客户端解压并解压到 /your/path/openvpn/etc/pki/ 目录下。

编辑Server服务端配置文件,并启动服务

在安装完成后,编辑 /your/path/openvpn/etc/server.conf 文件,添加如下内容:

#指定监听的本机IP(因为有些计算机具备多个IP地址),该命令是可选的,默认监听所有IP地址。
#local 192.168.1.123

port 1194

#指定采用的传输协议,可以选择tcp或udp。客户端需要与服务端保持一致
proto udp

#指定创建的通信隧道类型,可选tun或tap,前者工作在三层(TCP/IP),后者工作2层(链路层)
dev tun

# 相关证书文件
ca /your/path/openvpn/EasyRSA-3.2.4/pki/ca.crt
cert /your/path/openvpn/EasyRSA-3.2.4/pki/issued/cyg-prod.crt
key /your/path/openvpn/EasyRSA-3.2.4/pki/private/cyg-prod.key
dh /your/path/openvpn/EasyRSA-3.2.4/pki/dh.pem
#开启TLS-auth,使用ta.key防御攻击。服务器端的第二个参数值为0,客户端的为1。
tls-auth /your/path/openvpn/EasyRSA-3.2.4/pki/ta.key 0

#指定虚拟局域网占用的IP地址段和子网掩码,此处配置的服务器自身占用10.0.0.1。
server 10.8.0.0 255.255.255.0

# 拓扑网络,默认是peer-to-peer网络
topology subnet

#服务器自动给客户端分配IP后,客户端下次连接时,仍然采用上次的IP地址(第一次分配的IP保存在ipp.txt中,下一次分配其中保存的IP)。
ifconfig-pool-persist ipp.txt

#推送给客户端的路由
push "route 172.31.24.222 255.255.255.255"
push "route 192.168.12.111 255.255.255.255"
push "route 172.25.20.333 255.255.255.255"
push "route 192.168.0.444 255.255.255.255"

# 添加客户端配置文件
client-config-dir /your/path/openvpn/aliyun1-server/ccd

#服务器端自身路由
route 192.168.12.111 255.255.255.255
route 172.25.20.333 255.255.255.255
route 192.168.0.444 255.255.255.255

#每10秒ping一次,连接超时时间设为120秒。
keepalive 10 120

#加密算法
cipher AES-256-CBC

#开启连接压缩,如果服务器端开启,客户端也必须开启
comp-lzo

# 最大客户端数量
max-clients 100

#指定日志文件的记录详细级别,可选0-9,等级越高日志内容越详细
verb 5
status openvpn-status.log

#允许客户端与客户端相连接,默认情况下客户端只能与服务器相连接
client-to-client


#持久化选项可以尽量避免访问在重启时由于用户权限降低而无法访问的某些资源
persist-key
persist-tun

#服务端重启,客户端自动重连
explicit-exit-notify 2

在编写配置文件时需要,默认服务启动后网络链路路径为:

正常可通的链路

  • • 客户端 -> 服务端tun0 IP : 正常
  • • 客户端 -> 服务端eth0 IP : 正常
  • • 服务端 -> 客户端tun0 IP : 正常
  • • 服务端 -> 客户端eth0 IP : 无法访问(重点关注)

服务端访问客户端 eth0 IP 无法访问问题,需要在 server 配置文件中添加 client-config-dir 配置一个路径

然后在 ccd 文件夹下创建一个文件,文件名是客户端的证书名称,文件内容如下:

cat ccd/my-vpn-client1
iroute 192.168.12.111 255.255.255.255

如果忘记了客户端证书名称,可以通过 /your/path/openvpn/etc/pki/issued/ 目录下查看

启动服务

启动服务可以通过系统的 systemd 服务管理,也可以使用命令启动服务

/your/path/openvpn/sbin/openvpn /your/path/openvpn/etc/server.conf &

客户端配置

按照上述的步骤安装OpenVPN,并将客户端证书复制到机器,编辑 /your/path/openvpn/etc/client.conf 文件,添加如下内容:

client
dev tun
proto udp
remote 12.402.*.167 1194
resolv-retry infinite
nobind
persist-key
persist-tun
ca /your/path/openvpn/EasyRSA-3.2.4/pki/ca.crt
cert /your/path/openvpn/EasyRSA-3.2.4/pki/issued/my-vpn-client.crt
key /your/path/openvpn/EasyRSA-3.2.4/pki/private/my-vpn-client.key
tls-auth /your/path/openvpn/EasyRSA-3.2.4/pki/ta.key 1
remote-cert-tls server
cipher AES-256-CBC
verb 3
comp-lzo
allow-compression yes

客户端配置文件除了证书路径需要调整外,还需要关注 remote 这个配置项,需要配置服务端的公网IP地址。对于端口配置,在使用 UDP 协议时,注意防火墙或安全组开通策略的协议选择。

然后启动服务

/your/path/openvpn/sbin/openvpn /your/path/openvpn/etc/client.conf &

连接验证

可以通过 ping 测试,验证网络是否正常

  • • 客户端 -> 服务端tun0 IP
  • • 客户端 -> 服务端eth0 IP
  • • 服务端 -> 客户端tun0 IP
  • • 服务端 -> 客户端eth0 IP
  • 如果有需要,还可以验证客户端之间的联通性

FAQ

服务端访问客户端 eth0 IP 访问失败

因为客户端没有配置 client-config-dir 配置项,导致服务端无法访问客户端 eth0 IP。

在 ccd 文件夹下创建一个文件,文件名是客户端的证书名称,文件内容如下:

cat ccd/my-vpn-client1
iroute 192.168.12.111 255.255.255.255

authentication failed

Authenticate/Decrypt packet error: packet HMAC authentication failed

TLS Error: incoming packet authentication failed

TLS Error: cannot locate HMAC in incoming packet from [AF_INET]192.168.1.123:1194

这三个错误都源于这个 tls-auth 认证问题,只需要服务端和客户端关闭此功能即可解决:在此行加上; 分号。如果需要开启可以关闭后再尝试开启

Can't exec "libtoolize"

这个错误通常是因为系统缺少编译OpenVPN所需的GNU Libtool

错误日志

autoreconf: running: libtoolize --copy --force
Can't exec "libtoolize": 没有那个文件或目录 at /usr/share/autoconf/Autom4te/FileUtils.pm line 345, <GEN3> line 5.
autoreconf: failed to run libtoolize: No such file or directory
autoreconf: libtoolize is needed because this package uses Libtool

解决方法

# Debian/Ubuntu系统:
sudo apt-get update
sudo apt-get install libtool automake autoconf

# 对于较新版本(CentOS 8/RHEL 8以上)
sudo dnf install libtool

# 对于较旧版本(CentOS 7/RHEL 7以下)
sudo yum install libtool

# Fedora系统:
sudo dnf install libtool

# Arch Linux系统:
sudo pacman -S libtool

验证安装和完成配置

安装完成后,可以验证libtoolize是否可用:

which libtoolize
libtoolize --version

libnl-genl-3.0 package not found or too old

错误日志

configure: error: libnl-genl-3.0 package not found or too old. Is the development package and pkg-config (/usr/bin/pkg-config) installed? Must be version 3.4.0 or newer for DCO

这个报错意味着编译系统无法找到足够新版本(需要3.4.0或更新)的libnl-genl-3.0开发包。

libnl是Linux上处理netlink套接字的库,而libnl-genl提供了通用netlink接口的支持。DCO功能依赖这些库。

解决方案:

# Debian/Ubuntu 系统:
sudo apt-get update
sudo apt-get install libnl-3-dev libnl-genl-3-dev libnl-route-3-dev pkg-config

# 对于RHEL/CentOS
sudo yum install libnl3-devel pkgconfig

# 或者使用dnf(新版本)
sudo dnf install libnl3-devel pkg-config

# 对于Fedora
sudo dnf install libnl3-devel pkg-config

# Arch Linux 系统:
sudo pacman -S libnl pkg-config

检查pkg-config信息:通过以下命令检查libnl-genl-3.0的版本和编译信息。

pkg-config --modversion libnl-genl-3.0
pkg-config --cflags --libs libnl-genl-3.0

请确保输出的版本号不低于3.4.0。

libcap-ng package not found

错误日志

configure: error: libcap-ng package not found. Is the development package and pkg-config (/usr/bin/pkg-config) installed?

这个错误意味着编译系统无法找到libcap-ng开发包。libcap-ng是Linux系统上的一个库,用于管理进程的权限和Capabilities。

解决方法:

# Debian/Ubuntu系统:
sudo apt-get update
sudo apt-get install libcap-ng-dev pkg-config

# 对于较新版本(CentOS 8/RHEL 8以上)
sudo dnf install libcap-ng-devel pkgconfig

# 对于较旧版本(CentOS 7/RHEL 7以下)  
sudo yum install libcap-ng-devel pkg-config

# Fedora系统:
sudo dnf install libcap-ng-devel pkg-config

# Arch Linux系统:
sudo pacman -S libcap-ng pkg-config

安装完成后,建议验证libcap-ng是否正确安装:

检查pkg-config信息:

pkg-config --modversion libcap-ng
pkg-config --cflags --libs libcap-ng

libevent package not found

错误日志

configure: error: No compatible LZ4 compression library found. Consider --disable-lz4

内核中一般会包含运行的头文件,但缺少开发文件(比如lz4.h头文件和liblz4.so链接库),这通常是导致configure脚本报错的原因。

解决方案: 安装LZ4开发包

根据系统,安装对应的开发包:

Debian/Ubuntu    
sudo apt-get install liblz4-dev

RHEL/CentOS    
sudo yum install liblz4-devel 

对于较新版本(CentOS 8/RHEL 8以上)
sudo dnf install liblz4-devel

Aliyun Linux
yum install lz4-devel lz4-libs

Fedora    
sudo dnf install liblz4-devel

Arch Linux    
sudo pacman -S liblz4

之后,通常直接运行 ./configure 即可,脚本应该能自动找到LZ4库。如果仍有问题,可以尝试手动指定:

./configure LZ4_CFLAGS="-I/usr/include" LZ4_LIBS="-L/usr/lib64 -llz4"

如果确实找不到合适的开发包,或者需要特定版本的LZ4,可以考虑从源码编译LZ4。

lzo package not found

错误日志

configure: error: lzo enabled but missing

编译过程中遇到 configure: error: lzo enabled but missing 报错,意味着编译配置脚本找不到LZO压缩库必要的文件。

# Debian/Ubuntu
sudo apt-get install liblzo2-dev 

# RHEL/CentOS    
sudo yum install lzo-devel

# 对于较新版本(CentOS 8/RHEL 8以上)
sudo dnf install lzo-devel

# Fedora    
sudo dnf install lzo-devel

# Arch Linux    
sudo pacman -S lzo

 



打赏

本文链接:https://kinber.cn/post/5771.html 转载需授权!

分享到:


推荐本站淘宝优惠价购买喜欢的宝贝:

image.png

 您阅读本篇文章共花了: 

群贤毕至

访客