從谷歌當機事件認識網際網路工作原理

aqee發表於2012-11-27

  譯者注:本文中提到CloudFlare是一家總部位於美國舊金山的內容分發網路(CDN)服務公司,由Project Honey Pot專案的三位前開發人員成立於2009年。2011年10月被華爾街日報評為最具創新精神的網路科技公司。

  今天,谷歌的服務經歷了短暫的當機事件,持續大概27分鐘,對部分地區的網際網路使用者造成了影響。此次事件的原因深究起來需要進入網際網路絡那深邃的、黑暗的角落。我是CloudFlare公司的一名網路工程師,在幫助谷歌從此次當機中恢復回來提供了一臂之力。下面就是事情發生的過程。

  大約在太平洋標準時間2012年11月5號下午6:24分/時間標準時間2012年11月6號凌晨2:24分,CloudFlare的員工發現谷歌的服務中斷了。我們使用谷歌的電子郵件等服務,所以,當它的服務不正常時,辦公室的人會很快發現。我在網路技術小組工作,因此我立刻接上網路檢視是什麼情況——是區域性區域問題還是全球問題。

  問題排查

  我很快就意識到,所有谷歌的服務我們都不能連線上——甚至包括連線 8.8.8.8,谷歌的公共DNS伺服器——於是,我從追查DNS開始。

$ dig +trace google.com

  下面是我在探測Google.com的域名伺服器時得到的回覆:

google.com.                172800        IN        NS        ns2.google.com.
google.com.                172800        IN        NS        ns1.google.com.
google.com.                172800        IN        NS        ns3.google.com.
google.com.                172800        IN        NS        ns4.google.com.
;; Received 164 bytes from 192.12.94.30#53(e.gtld-servers.net) in 152 ms

;; connection timed out; no servers could be reached

  無法探測到任何伺服器的結果證明確實有什麼地方出了問題。尤其是,這意味著從我們的辦公室將連線不到任何的谷歌DNS伺服器。

  我開始網路層查詢問題,看看是否是在這個通訊層出了問題。

PING 216.239.32.10 (216.239.32.10): 56 data bytes
Request timeout for icmp_seq 0
92 bytes from 1-1-15.edge2-eqx-sin.moratelindo.co.id (202.43.176.217): Time to live exceeded

  這裡出現了奇怪的資訊。通常,我們不應該在谷歌的路由資訊中看到一個印度尼西亞的網路服務提供商(Moratel)的名字。我立即進入一個CloudFlare的路由器中檢視發生了什麼事。與此同時,Twitter上世界其它地方的報告顯示了我們並不是唯一遇到問題的地方。

  網際網路路由

  為了理解是出了什麼問題,你需要知道一些網際網路是如何工作的基礎知識。整個網際網路是由很多的網路組成,這些網路被稱為是“自治系統(AS)”。每個網路都有一個唯一的數字來標誌自己,被稱為AS號。CloudFlare的AS號是13335,谷歌的AS號是15169。各個網路通過一種叫做邊緣閘道器協議(BGP)的技術互相連線。邊緣閘道器協議被稱為是網際網路的粘合劑——由它來宣告哪個IP地址屬於哪個網路,由它來建立從某個自治網路到另外一個自治網路的路由。一個網際網路“路由”跟這個詞的表意完全一樣:由一個自治網路裡的IP地址到另外一個自治網路裡的另一個IP地址的路徑。

  邊緣閘道器協議是基於一個相互信任的體制。各個網路基於信任的原則告訴其它網路哪個IP地址屬於哪個網路。當你傳送一個資料包,或傳送一個穿越網路的請求,你的網路服務提供商會聯絡它的上游提供商或對等提供商,詢問它們從你的網路服務提供商到網路目的地,哪條路線最近。

  不幸的是,如果當一個網路發出宣告說某個IP地址或某個網路在它的內部,而事實不是這樣,如果它的上游網路或對等網路信任了它,那麼,這個資料包最終將會迷路丟失。這裡發生的就是這個問題。

  我檢視了邊緣閘道器協議傳遞的谷歌IP的路由地址,路由指向了Moratel (23947),一個印度尼西亞的網路服務提供商。我們的辦公室在加利福尼亞,離谷歌的資料中心並不遠,資料包絕不應該經過印度尼西亞。很有可能是,Moratel宣告瞭一個錯誤的網路路由。

  當時我看到的邊緣閘道器協議發來的路由是:

tom@edge01.sfo01> show route 216.239.34.10                          

inet.0: 422168 destinations, 422168 routes (422154 active, 0 holddown, 14 hidden)
+ = Active Route, - = Last Active, * = Both

216.239.34.0/24    *[BGP/170] 00:15:47, MED 18, localpref 100
                      AS path: 4436 3491 23947 15169 I
                    > to 69.22.153.1 via ge-1/0/9.0

  我檢視了其它路由,比如谷歌的公共DNS,它同樣被劫持到了相同的(不正確的)路徑:

tom@edge01.sfo01> show route 8.8.8.8 

inet.0: 422196 destinations, 422196 routes (422182 active, 0 holddown, 14 hidden)
+ = Active Route, - = Last Active, * = Both

8.8.8.0/24         *[BGP/170] 00:27:02, MED 18, localpref 100
                      AS path: 4436 3491 23947 15169 I
                    > to 69.22.153.1 via ge-1/0/9.0

  路由洩漏

  像這樣的問題在行業內被認為是起源於“路由洩漏”,不是正常的,而是“洩漏”出來的路由。這種事情並不是沒有先例。谷歌之前曾遭受過類似的當機事件,當時推測是巴基斯坦為了禁止YouTube上的一個視訊,巴基斯坦國家ISP刪除了YouTube網站的路由資訊。不幸的是,他們的這種做法被傳遞到了外部,巴基斯坦電信公司的上游提供商——電訊盈科(PCCW)信任了巴基斯坦電信公司的做法,把這種路由方式傳遞到了整個網際網路。這個事件導致了YouTube網站大約2個小時不能訪問。

胖手指 辛普森

  今天發生的事情屬於類似情況。在Moratel公司的某個人很可能是“胖手指”,輸錯了網際網路路由。而電訊盈科,Moratel公司的上游提供商,信任了Moratel公司傳遞給他們的路由。很快,這錯誤的路由就傳到了整個網際網路。在邊緣閘道器協議這種信任模式中,與其說這是惡意的行為,不如說這是誤操作或失誤。

  修復

  解決方案就是讓Moratel公司停止宣告錯誤的路由。作為一個網路工程師,尤其是像CloudFlare這樣的大網路公司裡工作的工程師,很大一部分工作就是和其它世界各地的網路工程師保持聯絡。當探明問題後,我聯絡到了Moratel公司的一位同事,告訴他發生了什麼事。他大概在太平洋標準時間下午6:50分/世界標準時間凌晨2:50分修復了這個問題。3分鐘後,路由恢復了正常,谷歌的服務重新可以工作了。

  從網路傳輸圖上觀察,我估計全球整個網際網路使用者的3-5%收到了此次當機事故的影響。重災區是香港,因為那是電訊盈科的總部。如果你所處的地區在當時無法訪問谷歌的服務,你現在應該知道是什麼原因了。

  構建更好的網際網路

  我說這些就是想讓大家知道我們的網際網路上如何在一個相互信任的機制下建立起來的。今天的事故說明,即使你是一個像谷歌這樣的大公司,外部你無法掌控的因素也會影響到你的使用者,讓他們無法訪問你,所以,一個網路技術小組是非常必要的,由他們來監控路由,管理你與世界的聯絡。CloudFlare公司每天的工作就是確保客戶得到最佳的路由。我們照看網際網路上的所有網站,確保他們的以最快傳輸速度提供服務。今天的事情只是我們工作內容的一個小片段。

  原文連結:Why Google Went Offline Today and a Bit about How the Internet Works

相關文章