「臉書不能可能當掉,對吧?」有一瞬間,我們這樣覺得。

今天世界標準時間 15:51,我們開啟了一個名為「臉書 DNS 查找回應 SERVFAIL」的內部事件,因為我們擔心是我們的 DNS 解析器 1.1.1.1 出了問題。但是當我們準備在我們的公開狀態頁面上發文時,我們意識到還有更嚴重的事情正在發生。

社群媒體立刻開始熱烈討論,我們的工程師也很快地證實報導是真的。臉書和其子服務 WhatsApp、Instagram 真的當機了。他們的 DNS 名稱無法被解析,其基礎結構的 IP 也無法觸及。就好像有人一下子把他們的資料中心「拔掉線」,並斷開它們與網際網路的連線。

這不是 DNS 本身的問題,但 DNS 失效是我們看到臉書廣大服務中斷的第一個症狀。

這怎麼可能?

臉書發布的最新消息

臉書現在發布了一篇部落格,對於其內部發生的事說明一些詳情。從外部,我們觀察到這篇部落格中概述的 BGP 和 DNS 問題,但問題實際上始於影響整個內部骨幹網的配置更改。這導致臉書和其他資產消失,臉書內部員工難以讓服務再次運轉。

臉書發布了另一篇部落格,對發生的事提供了更多細節。您可以閱讀該篇貼文以從內部視角瞭解;並閱讀本文以從外部視角觀察。

現在回到我們從外部觀察到的事。

認識 BGP

BGP 是邊界閘道通訊協定 (Border Gateway Protocol) 的縮寫。它是一種在網際網路上的自主系統 (autonomous systems,簡稱 AS) 之間交換路由資訊的機制。讓網際網路可以運作的大型路由器有龐大、不斷更新的可能路由列表,用於將每個網絡數據包傳送到其最終目的地。如果沒有 BGP,網際網路路由器將不知道該做什麼,網際網路也無法運作。

網際網路一如其名,是網路之間的網路,由 BGP 聯結起來。BGP 讓一個網路 (例如臉書) 能對網際網路上的其他網路公告自己的存在。在撰文的此刻,臉書並沒有公告自己的存在,ISP 和其他網路找不到臉書的網路,所以無法觸及它。

每個網路都有一個 ASN,意即自主系統碼 (Autonomous System Number)。一個自主系統就是一個各別的網路加上一個統一的內部選路政策。AS 可以產生前綴 (可以說它們控制一組 IP 位址),以及傳輸前綴 (可以說它們知道如何到達特定的一組 IP 位址)。

Cloudflare 的 ASN 是 AS13335。每個 ASN 要用 BGP 向網際網路宣示其前綴路由,否則就沒有人知道要如何連接和找到我們。

我們的學習中心有很好的資源,概述 BGPASN,以及它們如何運作。

在這個簡圖中,您可以看到網際網路上的六個自主系統,以及一個數據包從起點到終點可用的兩個可能路由。AS1 → AS2 → AS3 速度最快,AS1 → AS6 → AS5 → AS4 → AS3 速度最慢,但如果第一個路由失效,就可以用第二個。

在世界標準時間 15:58,我們發現臉書停止向他們的 DNS 前綴公告路由。這表示,至少臉書的 DNS 伺服器不能使用。因為 Cloudflare 的 1.1.1.1DNS 解析器無法再回應對 facebook.com 的 IP 位址的查詢。

route-views>show ip bgp 185.89.218.0/23
% Network not in table
route-views>

route-views>show ip bgp 129.134.30.0/23
% Network not in table
route-views>

同時,其他臉書 IP 位址可以選路,但其實也沒用,因為沒有 DNS,臉書和相關服務實際上不能用:

route-views>show ip bgp 129.134.30.0   
BGP routing table entry for 129.134.0.0/17, version 1025798334
Paths: (24 available, best #14, table default)
  Not advertised to any peer
  Refresh Epoch 2
  3303 6453 32934
    217.192.89.50 from 217.192.89.50 (138.187.128.158)
      Origin IGP, localpref 100, valid, external
      Community: 3303:1004 3303:1006 3303:3075 6453:3000 6453:3400 6453:3402
      path 7FE1408ED9C8 RPKI State not found
      rx pathid: 0, tx pathid: 0
  Refresh Epoch 1
route-views>

我們會繼續追踪在全球網路中看到的所有 BGP 更新和公告。以我們的規模,我們收集的資料讓我們能夠了解網際網路的連接方式,以及流量應該在地球上何處流入和流出。

若對前綴公告做任何更改或完全撤銷前綴,BGP 更新訊息會通知路由器。檢查我們的時間序列 BGP 資料庫時,可以清楚看到從臉書收到的更新數字。一般來說這張圖很安靜:臉書不會每分鐘對其網路進行很多更動。

但是世界標準時 15:40 左右,我們看到臉書發出的路由變更衝上高峰。這就是麻煩的開端。

如果我們按照路由公告及撤銷來劃分這個圖表,就能更瞭解發生什麼事。路由被撤銷,臉書的 DNS 伺服器離線,問題發生一分鐘後,Cloudflare 工程師齊聚一堂,想知道為什麼 1.1.1.1 無法解析 facebook.com,擔心是我們系統何處出了故障。

因為這些撤銷,臉書及其網站實際上是從網際網路斷開了連線。

DNS 受到影響

直接的後果就是世界各地的 DNS 解析器停止解析其網域名。

➜  ~ dig @1.1.1.1 facebook.com
;; ->>HEADER<<- opcode: QUERY, status: SERVFAIL, id: 31322
;facebook.com.			IN	A
➜  ~ dig @1.1.1.1 whatsapp.com
;; ->>HEADER<<- opcode: QUERY, status: SERVFAIL, id: 31322
;whatsapp.com.			IN	A
➜  ~ dig @8.8.8.8 facebook.com
;; ->>HEADER<<- opcode: QUERY, status: SERVFAIL, id: 31322
;facebook.com.			IN	A
➜  ~ dig @8.8.8.8 whatsapp.com
;; ->>HEADER<<- opcode: QUERY, status: SERVFAIL, id: 31322
;whatsapp.com.			IN	A

發生這種情況是因為 DNS 與網際網路上的許多其他系統一樣,有其路由機制。當有人在瀏覽器中鍵入 https://facebook.com 網址時,DNS 解析器負責將網域名轉換為要連接的實際 IP 位址,首先會檢查它的快取中是否存有內容並加以使用。如果沒有,它會嘗試從網域名稱服務器中獲取答案,網域名稱伺服器通常由擁有它的實體管理。

如果名稱伺服器無法使用或由於其他原因無法回應,則會收到 SERVFAIL 失效訊息,瀏覽器會向用戶提示錯誤訊息。

同樣地,我們的學習中心有很好的資源,解釋 DNS 如何運作。

由於臉書不再透過 BGP 公告其 DNS 前綴路由,我們和所有其他單位的 DNS 解析器就無法連接到他們的名稱伺服器。連帶地,1.1.1.1、8.8.8.8 和其他主要的公共 DNS 解析器開始發出 (並快取) SERVFAIL 失效訊息。

還不只這樣。此時,人類行為和應用程式邏輯開始發揮作用,並導致另一個呈指數發展的效應。額外的 DNS 流量海嘯隨之而來。

發生這種情況的部分原因是,應用程式不接受錯誤回應並開始重試,有時是很積極地,部分原因是終端用戶也不會接受錯誤回應並開始重新下載頁面,或關閉並重新啟動手上的 App,有時也是很積極地。

這樣的流量暴增 (反映在請求的數量上) 可以在 1.1.1.1 上看到:

問題來了,因為臉書和他們的網站如此巨大,全球的 DNS 解析器處理的查詢比平時多出 30 倍,可能導致其他平台出現延遲和逾時問題。

幸好 1.1.1.1 是生而免費、專有、快速的 (獨立的 DNS 監控器 DNSPerf 可以證明這一點),並且可擴充,因此我們能繼續為用戶提供服務,只受到非常小的影響。

我們絕大多數 DNS 請求的解析時間都在 10 毫秒以內。同時,p95 和 p99 百分位數的小部分回應時間增加,可能是由於失效的 TTL 不得不求助於臉書名稱伺服器因而逾時。10 秒 DNS 逾時限制在工程師中是眾所周知。

對其他伺服器的影響

人們尋找替代方案、想瞭解更多,或想討論現在發生什麼事。當臉書變成不能使用時,我們開始看到對 Twitter、Signal 和其他訊息傳遞和社交媒體平台的 DNS 查詢增加。

我們還可以看到這種不可用的另一個副作用,出現在我們的 WARP 流量,它往返臉書受到影響的 ASN 32934。這張圖表顯示每個國家/地區從世界標準時 15:45 到 16:45 的流量,與三小時前相比的變化情形。全世界進出臉書網路的 WARP 流量都消失了。

網際網路

今天的事件對人們是溫和的提醒:網際網路是一個非常複雜且相互依賴的系統,由數以百萬計的系統和通訊協議合作。各個實體之間的信任、標準化和合作是核心,讓網際網路能為全球近 50 億活躍用戶服務。

更新

在世界標準時 21:00 左右,我們看到來自臉書網路的 BGP 更新活動,在 21:17 達到巔峰。

這張圖表顯示了 DNS 網域名稱 facebook.com 在 Cloudflare 的 DNS 解析器 1.1.1.1 上的可用性。在世界標準時 15:50 左右不再可用,並在 21:20 恢復。

毫無疑問,臉書、WhatsApp 和 Instagram 服務會需要更多時間才能上線,但截至世界標準時 21:28,臉書似乎已重新連接到全球網際網路,DNS 也再次正常運作。