譯者注:本文中提到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. 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聲明了一個錯誤的網絡路由。
當時我看到的邊緣網關協議發來的路由是:
[email protected]> 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
[email protected]> 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公司每 天的工作就是確保客戶得到最佳的路由。我們照看互聯網上的所有網站,確保他們的以最快傳輸速度提供服務。今天的事情只是我們工作內容的一個小片段。