当且仅当 XCom 通信堆栈用于建立组通信时(group_replication_communication_stack=XCOM
),组复制插件允许您指定一个允许主机列表,可以从中接受传入的组通信系统连接。如果您在服务器 s1 上指定了一个允许列表,那么当服务器 s2 为了进行组通信而建立到 s1 的连接时,s1 会先检查允许列表,然后再接受来自 s2 的连接。如果 s2 在允许列表中,则 s1 接受连接,否则 s1 拒绝 s2 的连接尝试。系统变量 group_replication_ip_allowlist
用于指定允许列表。
当 MySQL 通信堆栈用于建立组通信时(group_replication_communication_stack=MYSQL
),则忽略 group_replication_ip_allowlist
的设置。请参阅 第 20.6.1 节,“用于连接安全管理的通信堆栈”。
如果您没有明确指定允许列表,组通信引擎 (XCom) 会自动扫描主机上的活动接口,并识别出那些具有私有子网地址的接口,以及为每个接口配置的子网掩码。这些地址以及用于 IPv4 和 IPv6 的 localhost
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
系统变量。您可以在组复制运行时更改列表。
允许列表必须包含在每个成员的 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 地址(例如,
2001:db8:85a3:8d3:1319:8a2e:370:7348
)使用 CIDR 表示法的 IPv6 地址(例如,
2001:db8:85a3:8d3::/64
)主机名(例如,
example.org
)使用 CIDR 表示法的 I主机名(例如,
www.example.com/24
)
主机名可以解析为 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
选项列出的任何服务器。如果组的任何种子成员在加入成员具有 IPv4 group_replication_local_address
时,在 group_replication_group_seeds
选项中列出了 IPv6 地址,反之亦然,则您还必须为加入成员设置并允许种子成员提供的协议的备用地址(或解析为该协议地址的主机名)。这是因为当服务器加入复制组时,它必须使用种子成员在 group_replication_group_seeds
选项中公布的协议(无论是 IPv4 还是 IPv6)与种子成员进行初始联系。如果加入成员没有相应协议的允许地址,则其连接尝试将被拒绝。有关管理混合 IPv4 和 IPv6 复制组的更多信息,请参见 第 20.5.5 节“对 IPv6 以及混合 IPv6 和 IPv4 组的支持”。
当复制组重新配置时(例如,当选举出新的主服务器或成员加入或离开时),组成员会重新建立彼此之间的连接。如果组成员仅被重新配置后不再属于复制组的服务器允许,则它无法重新连接到复制组中不允许它的剩余服务器。要完全避免这种情况,请为复制组的所有成员服务器指定相同的允许列表。
可以根据您的安全要求在不同的组成员上配置不同的允许列表,例如,为了将不同的子网分开。如果您需要配置不同的允许列表以满足您的安全要求,请确保复制组中的允许列表之间有足够的重叠,以便在没有原始种子成员的情况下最大限度地提高服务器能够重新连接的可能性。
对于主机名,仅当另一个服务器发出连接请求时才会进行名称解析。无法解析的主机名不考虑用于允许列表验证,并且会将警告消息写入错误日志。对已解析的主机名执行前向确认的反向 DNS (FCrDNS) 验证。
在允许列表中,主机名本质上不如 IP 地址安全。FCrDNS 验证提供了一个良好的保护级别,但可能会被某些类型的攻击所破坏。仅在绝对必要时才在允许列表中指定主机名,并确保用于名称解析的所有组件(例如 DNS 服务器)都在您的控制之下维护。您也可以使用 hosts 文件在本地实现名称解析,以避免使用外部组件。