從谷歌宕機事件認識互聯網工作原理
英文原文:Why Google Went Offline Today and a Bit about How the Internet Works
譯者注:本文中提到 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)
這里出現了奇怪的信息。通常,我們不應該在谷歌的路由信息中看到一個印度尼西亞的網絡服務提供商(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 公司每天的工作就是確保客戶得到最佳的路由。我們照看互聯網上的所有網站,確保他們的以最快傳輸速度提供服務。今天的事情只是我們工作內容的一個小片段。