MySQL 8.0 参考手册  / 第十八章 组复制  / 18.6 组复制安全  /  18.6.4 群组复制IP地址权限

18.6.4 群组复制IP地址权限

当且仅当 XCom 通信堆栈用于建立组通信 ( group_replication_communication_stack=XCOM) 时,组复制插件允许您指定一个主机白名单,从中可以接受传入的组通信系统连接。如果您在服务器 s1 上指定白名单,则当服务器 s2 为进行组通信而与 s1 建立连接时,s1 在接受来自 s2 的连接之前首先检查白名单。如果 s2 在白名单中,则 s1 接受连接,否则 s1 拒绝 s2 的连接尝试。MySQL 8.0.22开始使用系统变量 group_replication_ip_allowlist指定白名单,MySQL 8.0.22之前的版本使用系统变量 group_replication_ip_whitelist用来。新系统变量的工作方式与旧系统变量相同,只是术语发生了变化。

如果您未明确指定白名单,组通信引擎 (XCom) 会自动扫描主机上的活动接口,并识别那些地址位于私有子网上的接口,以及为每个接口配置的子网掩码。这些地址以及 localhostIPv4 和(来自 MySQL 8.0.14)IPv6 的 IP 地址用于创建自动组复制白名单。因此,自动白名单包括在应用适当的子网掩码后在以下范围内为主机找到的任何 IP 地址:

IPv4 (as defined in RFC 1918)
10/8 prefix       (10.0.0.0 - 10.255.255.255) - Class A
172.16/12 prefix  (172.16.0.0 - 172.31.255.255) - Class B
192.168/16 prefix (192.168.0.0 - 192.168.255.255) - Class C

IPv6 (as defined in RFC 4193 and RFC 5156)
fc00:/7 prefix    - unique-local addresses
fe80::/10 prefix  - link-local unicast addresses

127.0.0.1 - localhost for IPv4
::1       - localhost for IPv6

一个条目被添加到错误日志中,说明主机自动允许的地址。

私有地址的自动允许列表不能用于来自私有网络外部服务器的连接,因此服务器,即使它在公共 IP 上有接口,默认情况下也不允许来自外部主机的组复制连接。对于位于不同计算机上的服务器实例之间的组复制连接,您必须提供公共 IP 地址并将这些地址指定为显式允许列表。如果您为白名单指定任何条目,localhost 则不会自动添加私有地址和地址,因此如果您使用其中任何一个,则必须明确指定它们。

要手动指定白名单,请使用 group_replication_ip_allowlist (MySQL 8.0.22 及更高版本)或 group_replication_ip_whitelist 系统变量。在 MySQL 8.0.24 之前,当服务器是复制组的活动成员时,您无法更改服务器上的白名单。如果成员处于活动状态,您必须 STOP GROUP_REPLICATION在更改白名单之前和START GROUP_REPLICATION之后执行。从 MySQL 8.0.24 开始,您可以在组复制运行时更改白名单。

group_replication_local_address 白名单必须包含在每个成员的系统变量 中指定的 IP 地址或主机名 。此地址与 MySQL 服务器 SQL 协议主机和端口不同,并且未在 bind_address服务器实例的系统变量中指定。如果用作服务器实例的组复制本地地址的主机名同时解析为 IPv4 和 IPv6 地址,则组复制连接首选 IPv4 地址。

指定为分布式恢复端点的 IP 地址以及成员的标准 SQL 客户端连接的 IP 地址(如果用于分布式恢复(默认设置))不需要添加到白名单。白名单仅适用于 group_replication_local_address 为每个成员指定的地址。加入成员必须初始连接到允许列表允许的组,以便检索用于分布式恢复的一个或多个地址。

在白名单中,您可以指定以下任意组合:

  • IPv4 地址(例如,198.51.100.44

  • 带有 CIDR 表示法的 IPv4 地址(例如, 192.0.2.21/24

  • IPv6 地址,来自 MySQL 8.0.14(例如, 2001:db8:85a3:8d3:1319:8a2e:370:7348

  • 带有 CIDR 表示法的 IPv6 地址,来自 MySQL 8.0.14(例如,2001:db8:85a3:8d3::/64

  • 主机名(例如,example.org

  • 带有 CIDR 表示法的主机名(例如, www.example.com/24

在 MySQL 8.0.14 之前,主机名只能解析为 IPv4 地址。从 MySQL 8.0.14 开始,主机名可以解析为 IPv4 地址、IPv6 地址或两者。如果主机名同时解析为 IPv4 和 IPv6 地址,则 IPv4 地址始终用于组复制连接。您可以将 CIDR 表示法与主机名或 IP 地址结合使用,以允许具有特定网络前缀的 IP 地址块,但请确保指定子网中的所有 IP 地址都在您的控制之下。

笔记

当来自 IP 地址的连接尝试因为地址不在允许列表中而被拒绝时,拒绝消息始终以 IPv6 格式打印 IP 地址。IPv4 地址::ffff:以这种格式(IPV4 映射的 IPv6 地址)开头。您不需要使用此格式在白名单中指定 IPv4 地址;为它们使用标准的 IPv4 格式。

必须用逗号分隔白名单中的每个条目。例如:

mysql> SET GLOBAL group_replication_ip_allowlist="192.0.2.21/24,198.51.100.44,203.0.113.0/24,2001:db8:85a3:8d3:1319:8a2e:370:7348,example.org,www.example.com/24";

要加入复制组,服务器需要在它向其发出加入组请求的种子成员上获得许可。通常,这将是复制组的引导程序成员,但它可以是 group_replication_group_seeds 加入该组的服务器的配置中的选项列出的任何服务器。group_replication_group_seeds 当加入成员具有 IPv4 地址时, 如果该组的任何种子成员列在具有 IPv6 地址的 选项中group_replication_local_address,或相反,您还必须为种子成员提供的协议设置并允许加入成员的替代地址(或解析为该协议地址的主机名)。这是因为当服务器加入复制组时,它必须使用种子成员在选项中公布的协议与种子成员进行初始联系 group_replication_group_seeds ,无论是 IPv4 还是 IPv6。如果加入成员没有适当协议的允许地址,则拒绝其连接尝试。有关管理混合 IPv4 和 IPv6 复制组的更多信息,请参阅 第 18.5.5 节,“支持 IPv6 以及混合 IPv6 和 IPv4 组”

当一个复制组被重新配置时(例如,当一个新的主节点被选出或者一个成员加入或离开时),组成员重新建立它们之间的连接。如果一个组成员仅被重新配置后不再属于复制组的服务器允许,则它无法重新连接到复制组中不允许它的其余服务器。要完全避免这种情况,请为属于复制组成员的所有服务器指定相同的允许列表。

笔记

可以根据您的安全要求为不同的组成员配置不同的白名单,例如,为了将不同的子网分开。如果您需要配置不同的白名单以满足您的安全要求,请确保复制组中的白名单之间有足够的重叠,以最大限度地提高服务器在其原始种子成员不存在的情况下能够重新连接的可能性。

对于主机名,仅当另一台服务器发出连接请求时才会进行名称解析。无法解析的主机名不会被考虑用于白名单验证,并且警告消息会写入错误日志。对已解析的主机名进行前向确认反向 DNS (FCrDNS) 验证。

警告

主机名本质上不如白名单中的 IP 地址安全。FCrDNS 验证提供了良好的保护级别,但可能会受到某些类型的攻击。仅在绝对必要时才在允许列表中指定主机名,并确保用于名称解析的所有组件(例如 DNS 服务器)都在您的控制之下。您还可以使用主机文件在本地实现名称解析,以避免使用外部组件。