20.6.4 组复制 IP 地址权限
当使用 XCom 通信栈(group_Replication_communication_stack=XCOM
)来建立组通信时,Group Replication 插件允许您指定一个允许列表,从而确定可以接受 incoming Group Communication System 连接的主机。如果在服务器 s1 上指定了允许列表,然后当服务器 s2 试图与 s1 建立连接以便参与组通信时,s1 首先检查允许列表,如果 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地址,将用于创建自动Group Replication允许列表。因此,自动允许列表将包括在以下范围内的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接口,也不会默认允许Group Replication连接从外部主机。对于在不同机器上的服务器实例之间进行Group Replication连接,您必须提供公共IP地址并指定这些作为明确的允许列表。如果您指定了允许列表中的任何条目,私有和localhost地址将不自动添加,因此如果您使用这些地址,您必须明确指定它们。
要手动指定允许列表,请使用group_ replication_ip_allowlist
系统变量。您可以在Group Replication运行时更改列表。
允许列表中必须包含每个成员的group_ replication_local_address
系统变量指定的IP地址或主机名。这不是MySQL服务器SQL协议主机和端口,也不是服务器实例的bind_address
系统变量。如果用于Group Replication本地地址的主机名解析到IPv4和IPv6地址,IPv4地址将被优先使用为Group Replication连接。
分布式恢复端点指定的IP地址,以及成员的标准SQL客户端连接如果用于分布式恢复(这是默认情况),不需要添加到允许列表中。允许列表仅用于每个成员的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 notation 的主机名(例如,
www.example.com/24
)
主机名可以解析为 IPv4 地址、IPv6 地址或两者。如果主机名解析为同时具有 IPv4 和 IPv6 地址,Group Replication 连接总是使用 IPv4 地址。你可以将 CIDR notation 与主机名或 IP 地址结合使用,以允许特定网络前缀的 IP 地址块,但确保指定子网中的所有 IP 地址都在你的控制下。
当从 IP 地址发起连接尝试被拒绝,因为该地址不在 allowlist 中时,拒绝信息总是将 IP 地址打印为 IPv6 格式。IPv4 地址在这个格式中以 ::ffff:
开头(是一个 IPV4-mapped 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";
要加入复制组,服务器需要在seed成员上获得许可,以便将请求发送到该组。通常,这将是复制组的引导成员,但可以是由group_replication_group_seeds
配置选项列出的任何服务器。如果复制组中的seed成员在group_Replication_group_seeds
选项中使用IPv6地址,而加入成员的IPv4group_replication_local_address
,或者反之,你需要为加入成员设置和允许该协议的备用地址(或解析到该协议的主机名)。这是因为当服务器加入复制组时,它必须使用seed成员在group_Replication_group_seeds
选项中广告的协议与seed成员进行初始联系,是否是IPv4还是IPv6。如果加入成员没有适当协议的允许地址,其连接请求将被拒绝。有关管理混合IPv4和IPv6复制组的更多信息,请见第20.5.5节,“支持IPv6和混合IPv6和IPv4组”。
当复制组被重新配置(例如,当新的主服务器被选举或成员加入或离开时),组成员之间的连接将被重新建立。如果某个组成员只能由现在不再是复制组的一部分的服务器许可,但它无法重新连接到剩余的服务器,这些服务器不允许它。为了避免这种情况,指定所有复制组成员的同一个allowlist。
根据您的安全要求,您可以在不同的组成员上配置不同的allowlist,例如,以保持不同的子网隔离。如果您需要根据安全要求配置不同的allowlist,请确保复制组中的allowlist之间有足够的重叠,以最大化服务器在缺少原始种子成员时重新连接的可能性。
对于主机名,名称解析仅在另一个服务器发起连接请求时进行。无法解析的主机名不被考虑用于allowlist验证,并将写入错误日志。反向DNS验证(FCrDNS)对已解析的主机名进行了验证。
主机名在allowlist中相比IP地址更不安全。FCrDNS验证提供了一定的保护,但可以被某些类型的攻击所 compromisse。只有在严格必要时才将主机名指定到allowlist中,并确保用于名称解析的所有组件,例如DNS服务器,都受到您的控制。你也可以使用hosts文件实现本地名称解析,以避免使用外部组件。