当且仅当 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 客户端连接用于分布式恢复(默认设置),则不需要将该成员的标准 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 表示法的地址(例如,
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 文件在本地实施名称解析,以避免使用外部组件。