試玩了 Cloudflare CDN 服務,我心目中 CDN 的運作原理是「在全球各區部署多台主機提供相同內容,查詢相同 Domain Name,DNS 依客戶端所在位置提供最近位置的主機 IP,達到分流及快速回應的效果」(註:這觀念並不正確),因此,若將網域名稱 my-server.com 交給 Cloudflare DNS 管理,應可觀察到類似「從台灣 nslookup www.my-server.com 是 100.100.100.100,從美國 nslookup www.my-server.com 是 200.200.200.200」的效果。事實不然,當我試著從美東、新加坡查詢,也試了幾個 NsLookup 網上服務,得到的都是相同 IP,說好的 CDN 呢?

研究之後,才發現我以為網路基本常識是錯的! 我一直以為 Internet 上的每個 IP 位址是唯一的,例如:只能有一台主機宣告自己是 8.8.8.8,IP 就像郵政地址,不該出現兩戶的鄉鎮市路名巷弄門牌號碼樓層完全相同,不然郵差看地址哪知道該送到 A 戶還是送到 B 戶?

但事實上,當今 Anycast 技術已被廣泛應用在 CDN 及 DNS,允許散落各地的多台主機共享同一個 IP,當要連線時,由路由器幫你決定,找到距離最近的一台。

由以下這張圖解釋 BGP Anycast 概念。


圖片來源:keycdn

假設網路上有兩台主機 IP 都是 8.8.8.8,一朵朵雲狀 ASXXX 是所謂的自治系統 Autonomous System (AS),通常是 ISP 或組織內一大群主機、網路裝置、子網路的集合,每個 AS 會依循相同的路由規則。而 ASXXX 是所謂 Autonomous System Number, ASN,N 為 1 ~ 65534 或 131072 ~ 4294967294 的數字,全世界約有 90,000 個自治系統。

各自治系統間會彼此串連,當左下角的客戶端要連上 8.8.8.8,有好幾種走法,可以 xx1 - xx2 連到左上的 8.8.8.8,或是 xx1 - xx3 - xx4 連到右邊的 8.8.8.8,或是 xx1 - xx2 - xx4 連到右邊 8.8.8.8,或是 xx1 - xx3 - xx4 -xx2 連到左上 8.8.8.8。很明顯,xx1 - xx2 連左上 8.8.8.8 的路徑最短,傳輸延遲最少。

除此之外,這種動態決定的路徑還有備援及分流的流果:

  • 備援
    當左上 8.8.8.8 停止服務,客戶端可改走 xx1 - xx3 - xx4 連右邊的 8.8.8.8,若 xx3 - xx4 斷線,可再改走 xx1 - xx2 - xx4 這條路到右邊 8.8.8.8。
  • 分流
    接 xx3 的客戶端會走 xx3 - xx4 到右邉 8.8.8.8;接 xx4 的客戶端走 xx4 到右邉 8.8.8.8;接 xx2 的客戶端走 xx2 到左上 8.8.8.8。流量平均分散到較近的主機。

尋找抵達指定 IP 最短路徑靠的是\ BGP 協定(Border Gateway Protocol)實現的。關於 BGP,推薦這篇 Border Gateway Protocol (BGP),有談到網際網路如何從 DNS 解析演進到 BGP 解析,適合網路觀念還停在上古時代的老人。(以下的圖擷自該文章)

Internet 發展初期,網路數量不多,靠靜態路由表就能找出傳送路徑。隨著網路成長,EGP (External Gateway Protocol) 誕生以支援動態路由,EGP 採用簡單的樹狀結構處理路由,但實際上各網路會彼此互連,呈現網狀。

雖著串連的自治系統數量增加,其複雜度已難以用 EGP 的樹狀概念有效映對,在 1989 年推出新協定 - BGP (Border Gateway Protocol)。

BGP 被設計用來讓自治系統間交換路由可抵達路徑的資訊,每個 BGP Speaker (稱為 Peer) 會跟鄰兵交換路由資訊,並建立一張路由表包含所有已知路由,整合這些資訊便能計算出到某個特定目的地的所有可能路徑,並可從中挑選「最合適」的路徑。(依據蒐集到的資訊以及組織的路由原則,依據成本、可靠度、速度及其他因素)

當有網路離線、新網路加入,資訊會透過 BGP 即時傳遞,路由資訊也會動態更新。

而 BGP 的動態更新機制也存在缺陷,例如:2004 年一家名為 TTNet 的土耳其 ISP 發佈錯誤的 BGP,讓全世界的自治系統誤以為它是連向全球任一網段的最佳路徑,造成一次大規模斷線且持續一天。2018 年有攻擊者發動了 BGP 劫持 (BGP Hijacking),故意散佈錯誤 BGP 路由將 Amazon DNS 的流量導向自己,成功竊取 10 萬美元的加密貨幣。2008 推出的 RPKI 路由安全框架,透過加密簽名可以減少 BGP 劫持風險,目前已有超過 50% 以上 ISP 支援,但需要大家都支援才能保障安全。參考

【結論】

小結一下重新建立的觀念:

  1. 目前的 Internet 可視為由一個個自治糸統(AS)組成,各 AS 透過 BGP 協定即時交換路由資訊
  2. 整合各 BGP Peer 所提供資訊,可以推算出抵達某個 IP 網段的所有可能路徑,並依據成本、可靠度、速度及其他因素決定最佳的走法
  3. 基於以上運作原理,我們可以在全球各地部署 IP 相同的主機,透過 BGP 推算路由時挑選距離最近的一個,實現 CDN
  4. 因此,將網站交付 CDN 服務管理時,即使 DNS 查詢得到相同 IP,從台灣及美國連向該 IP,連上的會是不同主機

【參考資料】

  1. How Anycast Works - An Introduction to Networking by keycdn
  2. What is an autonomous system? by Cloudflare
  3. 什麼是 BGP?by Cloudflare

2022-12-17 補充:

文章一開始提到 DNS 依地理位置傳回不同的 IP 的做法叫 GeoDNS,與 IP Anycast 都能實現分流、提升傳輸速度的效果。關於二者的介紹與實測,我找到這篇 I tested GeoDNS vs Anycast for websites – seeing which one is better


圖片來源

簡單歸納二者優缺點:

  • GeoDNS
    需使用支援 Geolocation 的 DNS 伺服器,依據來源端 IP 查 GeoIP 資料庫回傳距離較近的 IP。優點是容易架設、成本較低,如果要以國別區分管理時特別好用(例如:Netflix 的美國觀眾連美國主機)。缺點則是以國家或地區為單位較不精準、GeoIP 資料可能失真、增加新區域主機時 DNS 修改作業很麻煩。
  • Anycast
    優點是 DNS 設定超單純、遇到網路掛點時 BGP 會自動繞路、增減新區域主機時不需設定、能稍微減緩 DDoS 攻擊。
    缺點是需要在 ISP 取得定址區段、BGP 管理設定複雜、除錯較不易(看起來都是同一個 IP)


Comments

# by AL

請問雖然是相同ip不同主機,但是查到的內容都是代表同一”身分”是嗎? 例如假設8.8.8.8這個ip是google的DNS服務,在台灣連到的8.8.8.8,跟在美國連到的8.8.8.8雖然是不同主機,但都會是google的DNS服務這樣?

# by Eric

不同主機但掛同一個IP,但美台主機提供的服務應該是一樣的吧?

# by JJ

看來腦中網路的概念也還停留在上古時代Orz 不過這樣如果ping、ssh連線一個位置,這樣也會連接到CDN上面嗎?

# by Jackson2749

只有知名 IP 才可能這樣搞(anycast),由BGP決定回應的 peer, 像是Google DNS 8.8.8.8 這台,應該是由台灣的peer去回應。 自己架的站,若沒導入 CDN 架構,只會有一台。 導入 CDN 架構後,內容的回應是由 CDN 業者快取(cache)回應

# by otaku119

想請教黑暗大: 這是網路端,同一個IP在多個AS,由AS自治區各自提供相同內容 但,今天使用者連線,10分鐘前走亞洲的8.8.8.8,並且登入成功 10分鐘後因為中間斷線,改走到美國的8.8.8.8, 這時候相關登入資訊對美國的主機無效 這會提示使用者被登出? 還是說使用者端會記錄一組登入後的token,每次連線都會帶這組token,由目的主機來驗證、判斷是否有效 再請黑暗大能指導 謝謝

# by Jeffrey

to AL, DNS 是 Anycast 的經典應用,Cloudflare 這篇有深入介紹 https://www.cloudflare.com/zh-cn/learning/dns/what-is-anycast-dns/

# by Jeffrey

to Eric, Anycast 常應用於 DNS、CDN,的確是「內容相同,就近取用」

# by Jeffrey

to otaku119,你點出的問題也會出現在 Load Balance、Web Farm (多台實體機器,外面看起來是同一台),解法也類似:設計成 Stateless、或將 Session 資訊存在共用的外部服務。

# by Jeffrey

to JJ,以 CDN 為例 ping 會由就近主機回應,但 ssh 想連的若是背後的某台 Web 主機,通常不會連 Anycast IP,而是連該 Web 另一個專屬 IP。

# by Hank

使用者摸的都是CDN主機,摸不到真實主機,那真實主機使用什麼IP似乎也不重要了? 就好比大家都用192.168.x.x 只要外面NAT、CDN、BGP就能順利找到內部主機,反正不會被直連 可如果今天使用者不透過CDN,而是直接存取底層主機,那IP不可重複的論點還是正確的吧?

# by AL

To Jeffrey, 感謝回覆,我讀完cloudflare對於anycast的解釋後,覺得「其實同一個人在世界各地的”地址”實際上還是不同的,但是對於使用anycast的DNS來說,這就是”那個人的地址”」。

Post a comment