适用于MariaDB Galera群集的WireGuard Mesh VPN加密

本教程将向您展示如何构建一个 WireGuard网状VPN 并使用它来加密MariaDB中的复制流量 加莱拉星团

先决条件

这不是分步教程。 要使用本文中的知识,假定您已基本了解如何设置WireGuard VPN和MariaDB Galera Cluster。

什么是网状VPN?

在计算机网络中:

  • 一种 网格拓扑 是网络中每个节点与其他每个节点都有直接连接的位置。
  • 一种 星型拓扑 是中央节点控制连接流程的位置。 网络中的节点不能直接相互连接,而必须通过中央节点进行通信。 一个典型的例子是家庭专用网络。

市场上最常见的VPN使用星形拓扑。 每个VPN客户端必须连接到中央VPN服务器。 可以通过这种方式设置WireGuard。

一种 网状VPN 没有中央服务器。 Mesh VPN中的每个节点都可以直接相互连接,因此不会出现单点故障。 这也称为 对等VPN, 或者 点对点VPN (不要与PPTP VPN协议混淆)。 您可以使用它为在云中运行的服务器构建分布式安全网络。 WireGuard是一种开源超快速VPN协议,可用于构建全网状网络。

WireGuard是超轻量级的,当前不实现UDP打孔。 如果希望两个节点通过WireGuard相互连接,则其中一个必须侦听公共IP地址以接受请求。 因此,其网状网络功能无法与Nebula或ZeroTier媲美,后者使您能够为NAT设备后面的节点构建全网状VPN。 但是,WireGuard的对等功能非常适合在数据中心中运行的服务器,并且设置起来非常容易。

什么是MariaDB Galera集群?

Galera Cluster是MySQL,MariaDB和Percona数据库服务器的同步多主群集,可实现高可用性数据冗余。 多主群集允许对群集中的任何节点进行读写。 任何节点上的数据修改都将复制到所有其他节点。

为什么将WirdGuard Mesh VPN与MariaDB Galera群集一起使用

因为MariaDB Galera群集中的内置加密机制对于生产环境而言并不稳健。

在2019年,我写了一篇教程,解释了如何在公共Internet上加密MariaDB Galera复制流量。 但是,Galera群集的TLS设置不是很稳定。 我已经看到参数来回更改。

encrypt 快照状态传输(SST)的变量具有5个可能的值:0、1、2、3、4。 0 表示加密被禁用。

  • 在2019年, mariabackup SST方法应设置为4。 123 没用。
  • 现在,到2021年,MariaDB文档说您应该将模式2或3用于 mariabackup SST方法。

我没想到会发生此更改,并且在尝试将新节点加入群集时,它导致了以下TLS连接错误。

[ERROR] WSREP: client_handshake error: error:1416F086:SSL routines:tls_process_server_certificate:certificate verify failed

mariadb galera群集的加密

调试此错误并不容易。 而且我仍然不知道我的配置出了什么问题。 此外,更改TLS设置需要重新启动整个群集。 因此,我放弃了,开始寻找替代解决方案。 我想到我可以使用VPN来加密流量,而WireGuard允许我建立一个 对等VPN,非常适合与MariaDB Galera集群一起使用。

WireGuard Mesh VPN设置

使用WireGuard设置网状VPN非常容易。 您只需要列出WireGuard配置文件中的每个对等方。 我用 /etc/wireguard/mesh.conf 作为配置文件。

[Interface]
Address = 172.16.0.1/24
ListenPort = 51820
PrivateKey = RofXta1Y6D1mSP+KH35SUMymVWxffSZl5KQ1CyhBAlM=

[Peer]
PublicKey = ulkmsYKuoGf2G/5MGUZSrb8yBW1b+07zqzlnuP1A8MY=
AllowedIPs = 172.16.0.2/32
Endpoint = IP_Address_of_Node_2:51820
PersistentKeepalive = 25

[Peer]
PublicKey = d47QT5s5Rh75yQSvJbgzdTdma0qvin14ZvWjGx9nr0U=
AllowedIPs = 172.16.0.3/32
Endpoint = IP_Address_of_Node_3:51820
PersistentKeepalive = 25

我的Galera群集有3个节点,因此我在WireGuard配置文件中也使用了3个节点。 专用IP范围 172.16.0.0/24 用于专用网络。

配置完所有WireGuard节点后,请在每个节点上启动WireGuard界面。

sudo systemctl start [email protected]mesh.service

并在引导时启用自动启动。

sudo systemctl enable [email protected]mesh.service

现在,您应该能够ping通每个VPN专用IP地址。 如果无法ping通,请检查WireGuard是否正在侦听UDP端口51820。

sudo ss -lnpu

另外,请确保将防火墙配置为允许每个节点访问UDP端口51820。

Galera群集设置

您只需要删除Galera配置文件中的TLS加密设置。 我完整的Galera群集配置如下。

[galera]
# Mandatory settings
wsrep_on                 = ON
wsrep_provider           = /usr/lib/galera/libgalera_smm.so
wsrep_cluster_name       = "MariaDB Galera Cluster"
wsrep_cluster_address    = "gcomm://172.16.0.1,172.16.0.2,172.16.0.3"
binlog_format            = row
default_storage_engine   = InnoDB
innodb_autoinc_lock_mode = 2
innodb_force_primary_key = 1
innodb_doublewrite       = 1

# Allow server to accept connections on all interfaces.
bind-address = 0.0.0.0

# Optional settings
wsrep_slave_threads            = 4
innodb_flush_log_at_trx_commit = 0
wsrep_node_name                = node1
wsrep_node_address             = "172.16.0.1"

wsrep_provider_options="gcache.size = 1G; gcache.recover = yes;"

#SST method
wsrep_sst_method = mariabackup
wsrep_sst_auth = mariabackup:secret_password

[sst]
encrypt=0

显然,您需要更改 wsrep_node_namewsrep_node_address 对于Galera群集中的每个节点。 另外,请确保将防火墙配置为允许来自172.16.0.0/24网络的流量。 如果在Ubuntu上使用UFW防火墙,则在每个节点上执行以下命令。

sudo ufw insert 1 allow in from 172.16.0.0/24

包起来

我希望本教程可以帮助您使用WireGuard Mesh VPN加密MariaDB Galera群集中的复制流量。

Sidebar