### 18.6.4 组复制 IP 地址权限

[](<>)[](<>)[](<>)[](<>)

当且仅当 XCom 通信堆栈用于建立组通信时（[`group_replication_communication_stack=XCOM`](group-replication-options.html#sysvar_group_replication_communication_stack))，Group Replication 插件允许您指定可以接受传入 Group Communication System 连接的主机的允许列表。如果您在服务器 s1 上指定了一个白名单，那么当服务器 s2 建立与 s1 的连接以进行群组通信时，s1 在接受来自 s2 的连接之前首先检查白名单。如果 s2 在允许列表中，则 s1 接受连接，否则 s1 拒绝 s2 的连接尝试。从 MySQL 8.0.22 开始，系统变量[`group_replication_ip_allowlist`](group-replication-options.html#sysvar_group_replication_ip_allowlist)用于指定允许列表，对于 MySQL 8.0.22 之前的版本，系统变量[`group_replication_ip_whitelist`](group-replication-options.html#sysvar_group_replication_ip_whitelist)用来。新系统变量的工作方式与旧系统变量相同，只是术语发生了变化。

笔记

当 MySQL 通信栈用于建立组通信时（[`group_replication_communication_stack=MYSQL`](group-replication-options.html#sysvar_group_replication_communication_stack)), 的设置[`group_replication_ip_allowlist`](group-replication-options.html#sysvar_group_replication_ip_allowlist)和[`group_replication_ip_whitelist`](group-replication-options.html#sysvar_group_replication_ip_whitelist)被忽略。

如果您未明确指定允许列表，组通信引擎 (XCom) 会自动扫描主机上的活动接口，并识别具有私有子网上地址的接口以及为每个接口配置的子网掩码。这些地址和`本地主机`IPv4 和（来自 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 地址并将其指定为显式允许列表。如果您为许可名单指定任何条目，私有和`本地主机`地址不会自动添加，因此如果您使用其中任何一个，则必须明确指定它们。

要手动指定允许列表，请使用[`group_replication_ip_allowlist`](group-replication-options.html#sysvar_group_replication_ip_allowlist)（来自 MySQL 8.0.22）或[`group_replication_ip_whitelist`](group-replication-options.html#sysvar_group_replication_ip_whitelist)系统变量。在 MySQL 8.0.24 之前，当服务器是复制组的活动成员时，您无法更改服务器上的允许列表。如果成员处于活动状态，则必须执行[`停止 GROUP_REPLICATION`](stop-group-replication.html)在更改许可名单之前，以及[`开始 GROUP_REPLICATION`](start-group-replication.html)然后。从 MySQL 8.0.24 开始，您可以在 Group Replication 运行时更改允许列表。

允许列表必须包含每个成员的 IP 地址或主机名[`group_replication_local_address`](group-replication-options.html#sysvar_group_replication_local_address)系统变量。该地址与MySQL服务器SQL协议主机和端口不一样，在[`绑定地址`](server-system-variables.html#sysvar_bind_address)服务器实例的系统变量。如果用作服务器实例的组复制本地地址的主机名同时解析为 IPv4 和 IPv6 地址，则 IPv4 地址是组复制连接的首选地址。

指定为分布式恢复端点的 IP 地址，以及成员的标准 SQL 客户端连接的 IP 地址（如果用于分布式恢复）（这是默认值），不需要添加到允许列表中。允许列表仅适用于指定的地址[`group_replication_local_address`](group-replication-options.html#sysvar_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`)

-   主机名（例如，`例子.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-options.html#sysvar_group_replication_group_seeds)加入组的服务器的配置中的选项。如果该组的任何种子成员列在[`group_replication_group_seeds`](group-replication-options.html#sysvar_group_replication_group_seeds)当加入的成员拥有 IPv4 时，带有 IPv6 地址的选项[`group_replication_local_address`](group-replication-options.html#sysvar_group_replication_local_address)，或相反，您还必须为种子成员提供的协议（或解析为该协议地址的主机名）设置并允许加入成员的替代地址。这是因为当服务器加入复制组时，它必须使用种子成员在复制组中通告的协议与种子成员进行初始联系。[`group_replication_group_seeds`](group-replication-options.html#sysvar_group_replication_group_seeds)选项，无论是 IPv4 还是 IPv6。如果加入成员没有适当协议的允许地址，则拒绝其连接尝试。有关管理混合 IPv4 和 IPv6 复制组的更多信息，请参阅[第 18.5.5 节，“对 IPv6 以及混合 IPv6 和 IPv4 组的支持”](group-replication-ipv6.html).

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

笔记

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

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

警告

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