因為久久才會處理到一次,對 DNS 網域名稱對映多 IP 的概念有點模糊,導致最近查問題時一度誤入歧途... 再寫篇筆記強化記憶好惹。

要讓同一個 FQDN (完整網域名稱,例如:blog.darkthread.net) 對映多個 IP,常見有以下做法:

RR-DNS (Round-Robin DNS)

在同一名稱下放多筆 A 或 AAAA 記錄,權威 DNS 回覆查詢時輪換 IP 記錄的順序,客戶端一般會優先連到清單第一筆,藉此可平均分散流量到多台伺服器上,並勉強具有備援效果(連到故障 IP,重試幾次有機會換到正常主機)。
這種古老做法簡單粗暴,不需要額外設備,不限 DNS 伺服器版本,還能透過隨機性分攤流量,但缺點是無法依實際負載與健康狀況動態調度,另外 DNS 快取可能干擾效果。
最簡單辨別 RR-DBS 方法是用 nslookup 查詢網域名稱,若結果包含多個 IP,每次查詢順序不同就是了。(下圖是用 technitium/dns-server Docker 隨手架的 DNS 伺服器,模擬 RR-DNS 的效果)

實務上候選 IP 數量與每次返回 IP 數量可自行安排,每次看到 IP 不一定包含所有可能 IP。(如下圖)

(延伸閱讀:RR-DNS 隨機配發 IP 實驗)

加權與政策型 DNS

在 Round‑Robin DNS 上加入權重、來源地理/子網政策、時間或端點健康度,透過回覆集的動態組合調整流量比例與落點。微軟 Windows DNS 有提供類似功能

雲端流量路由管理

Azure 等雲端服務也有提供所謂的流量管理員,如 login.microsoft.com 會先用 CNAME 指向 a.privatelink.msidentity.com、再指向 prda.aadg.msidentity.com、再指向 www.tm.a.prd.aadg.trafficmanager.net ,最後回傳 8 筆隨機挑選及排序的 IP:

流量路由方法可依據權重、效能、地理位置、來源網段決定服務端點,概念類似前面提過的加權與政策型 DNS。

導向 CDN

改用 CNAME 導向 CDN 供應商的網域,而 CDN 再依地理/延遲/健康/容量等信號決定實際邊緣(如下圖中的 .akamaiedge.net)或來源節點,動態回覆 IP,此一做法亦常與 Anycast、邊緣代理、動態路由等技術結合。

CDN 廠商通常在全球部署節點,依據地理位置與當下狀況動態決定最適合 IP (或是使用相同 IP 再靠 Anycast 技術找出最近節點,例如下圖的 104.16.
IP 屬於 Cloudflare 自治系統 AS13335,是其全球 Anycast 網路的一部分),一般能提供較佳體驗。

延伸閱讀:Anycast - Internet 跟你想的不一樣:IP 地址不是唯一,有許多相同 IP 的主機散落各地

GeoDNS

GeoDNS 可依地理位置傳回不同的 IP,但需要支援 Geolocation 的 DNS 伺服器,依據來源端 IP 查 GeoIP 資料庫回傳距離較近的 IP。優點是容易架設、成本較低,如果要以國別區分管理時特別好用(例如:Netflix 的美國觀眾連美國主機)。缺點則是以國家或地區為單位較不精準、GeoIP 資料可能失真、增加新區域主機時 DNS 修改作業很麻煩。

小結

回到實務面,若我們要想出某個 FQDN 對映哪些 IP 好開放防火牆,除了 RR-DNS 可以一次由 nslookup 結果取得多個 IP (若每次顯示筆數只佔侯選清單的一部分,仍需多次查詢) 或啟用 Anycast 會返回固定 IP,其餘狀況都需要反覆嘗試,蒐集每次傳回的結果才能知道。若多 IP 筆數不多,回應屬隨機性與地理因素無關,則之前介紹過的 whatsmydns.net 可以一次看到從全世界不同地區查詢到的結果,快速肉眼求解。

其實,拿到 FQDN 對映 IP 清單更好的做法是向服務擁有者索取,中大型服務也多半會主動提供清單(例如 Azure DevOps 允許的 IP 位址和網域 URLObtain Google IP address ranges),會比自己整理快速可靠。


Comments

Be the first to post a comment

Post a comment