仅当使用XCom通信栈来建立组通信时(group_replication_communication_stack=XCOM
),组复制插件允许您指定允许列表,以便从中接受incoming组通信系统连接。如果您在服务器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)将自动扫描主机上的活动接口,识别私有子网的地址,并使用子网掩码配置每个接口。这些地址,以及localhost的IPv4和IPv6地址,将用于创建自动组复制允许列表。自动允许列表因此包括主机上的以下范围的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
) -
IPv4地址带CIDR表示法(例如:
192.0.2.21/24
) -
IPv6地址(例如:
2001:db8:85a3:8d3:1319:8a2e:370:7348
) -
IPv6地址带CIDR表示法(例如:
2001:db8:85a3:8d3::/64
) -
主机名(例如:
example.org
) -
主机名带CIDR表示法(例如:
www.example.com/24
)
主机名可以解析为 IPv4 地址、IPv6 地址或两者。如果主机名解析到 IPv4 和 IPv6 地址,Group Replication 连接总是使用 IPv4 地址。你可以使用 CIDR 表示法与主机名或 IP 地址结合,以允许具有特定网络前缀的 IP 地址块,但请确保所有指定子网中的 IP 地址都在您的控制之下。
当来自 IP 地址的连接尝试被拒绝,因为该地址不在 allowlist 中时,拒绝消息总是以 IPv6 格式打印 IP 地址。IPv4 地址在这种格式中以 ::ffff:
开头(一个 IPv4 映射的 IPv6 地址)。你不需要使用这种格式来指定 IPv4 地址在 allowlist 中;使用标准 IPv4 格式来指定它们。
allowlist 中的每个条目之间必须用逗号分隔。例如:
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
选项中列出了 IPv6 地址,而加入成员只有 IPv4 group_replication_local_address
group_replication_group_seeds
选项中宣传的协议与种子成员进行初始联系,无论是 IPv4 或 IPv6。如果加入成员没有适当协议的允许地址,其连接尝试将被拒绝。有关管理混合 IPv4 和 IPv6 复制组的更多信息,请参阅 第 20.5.5 节,“支持 IPv6 和混合 IPv4 和 IPv6 组”。
当复制组被重新配置(例如,当新的主服务器被选举或成员加入或离开时),组成员将重新建立彼此之间的连接。如果组成员只能被不再是复制组一部分的服务器所允许,那么它将无法重新连接到剩余的复制组服务器中。为了完全避免这种情况,请为所有复制组成员指定相同的 allowlist。
可以根据您的安全要求在不同的组成员上配置不同的 allowlist,例如,以保持不同的子网分离。如果您需要配置不同的 allowlist 来满足您的安全要求,请确保复制组中的 allowlist 之间有足够的重叠,以最大限度地确保服务器能够在缺少原始种子成员的情况下重新连接。
对于主机名,名称解析仅在其他服务器发出连接请求时进行。如果主机名无法解析,不会被考虑 allowlist 验证,并在错误日志中写入警告消息。对解析的主机名进行反向确认 DNS(FCrDNS)验证。
主机名在 allowlist 中比 IP 地址不够安全。FCrDNS 验证提供了很高的保护级别,但可以被某些类型的攻击所破坏。仅在绝对必要时指定主机名在 allowlist 中,并确保所有用于名称解析的组件,例如 DNS 服务器,都在您的控制之下。你也可以使用 hosts 文件来实现名称解析,以避免使用外部组件。