當且僅當 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 標記法的主機名稱 (例如,
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
選項所列出的任何伺服器。如果群組的任何種子成員在 group_replication_group_seeds
選項中,列出的是 IPv6 位址,而加入成員的 group_replication_local_address
卻是 IPv4 位址,反之亦然,您也必須為加入成員設定並允許一個替代位址,以供種子成員提供的協定使用(或是解析為該協定位址的主機名稱)。這是因為當伺服器加入複寫群組時,它必須使用種子成員在 group_replication_group_seeds
選項中宣傳的協定,與種子成員進行初始連線,無論該協定是 IPv4 或 IPv6。如果加入成員沒有適用協定的允許位址,它的連線嘗試將會被拒絕。如需更多關於管理混合 IPv4 和 IPv6 複寫群組的資訊,請參閱 第 20.5.5 節,「對 IPv6 以及混合 IPv6 和 IPv4 群組的支援」。
當複寫群組重新組態時(例如,當選出新的主要伺服器,或是有成員加入或離開時),群組成員會重新建立彼此之間的連線。如果群組成員僅被不再屬於重新組態後複寫群組的伺服器所允許,它將無法重新連線到複寫群組中不允許它的剩餘伺服器。為了完全避免這種情況,請為所有屬於複寫群組的伺服器指定相同的允許清單。
根據您的安全需求,在不同的群組成員上設定不同的允許清單是可能的,例如,為了將不同的子網路分開。如果您需要設定不同的允許清單來滿足您的安全需求,請確保複寫群組中的允許清單之間有足夠的重疊,以便在沒有原始種子成員的情況下,最大化伺服器重新連線的可能性。
對於主機名稱,名稱解析只會在另一個伺服器發出連線請求時才會發生。無法解析的主機名稱不會被考慮進行允許清單驗證,並且會將警告訊息寫入錯誤日誌。會對已解析的主機名稱執行正向確認反向 DNS (FCrDNS) 驗證。
在允許清單中,主機名稱的安全性本質上低於 IP 位址。FCrDNS 驗證提供了良好的保護程度,但可能會被某些類型的攻擊所破壞。只有在絕對必要時才在允許清單中指定主機名稱,並確保所有用於名稱解析的元件(例如 DNS 伺服器)都在您的控制之下。您也可以使用 hosts 檔案在本地實作名稱解析,以避免使用外部元件。