由Facebook事故引發(fā)的BGP工具探索
昨天,F(xiàn)acebook 發(fā)生了由 BGP 引起的離線事故。我對(duì)學(xué)習(xí)更多關(guān)于 BGP 的知識(shí)已經(jīng)隱約感興趣了很長(zhǎng)時(shí)間,所以我閱讀了一些文章。
我感到很沮喪,因?yàn)闆](méi)有一篇文章告訴我如何在我的電腦上實(shí)際查找與 BGP 有關(guān)的信息,因此我 寫(xiě)了一條詢(xún)問(wèn)有關(guān)工具的推特。
我一如既往地得到了一堆有用的回復(fù),所以這篇博文展示了一些你可以用來(lái)查詢(xún) BGP 信息的工具。這篇文章中可能會(huì)有較多的錯(cuò)誤,因?yàn)槲覍?duì) BGP 不是很了解。
我不能發(fā)布 BGP 路由
我從來(lái)沒(méi)有了解過(guò) BGP 的原因之一是,據(jù)我所知,我沒(méi)有在互聯(lián)網(wǎng)上發(fā)布 BGP 路由的權(quán)限。
對(duì)于大多數(shù)網(wǎng)絡(luò)協(xié)議,如果需要,你可以非常輕松地自己實(shí)現(xiàn)該協(xié)議。例如,你可以:
- 發(fā)行你自己的 TLS 證書(shū)
- 編寫(xiě)你自己的 HTTP 服務(wù)器
- 編寫(xiě)你自己的 TCP 實(shí)現(xiàn)
- 為你的域名編寫(xiě)你自己的權(quán)威 DNS 服務(wù)器(我現(xiàn)在正在為一個(gè)小項(xiàng)目嘗試這樣做)
- 建立你自己的證書(shū)機(jī)構(gòu)(CA)
但是對(duì)于 BGP,我認(rèn)為除非你擁有自己的 ASN,否則你不能自己發(fā)布路由(你可以在你的家庭網(wǎng)絡(luò)上實(shí)現(xiàn) BGP,但這對(duì)我來(lái)說(shuō)有點(diǎn)無(wú)聊,當(dāng)我做實(shí)驗(yàn)的時(shí)候,我希望它們真的在真正的互聯(lián)網(wǎng)上)。
無(wú)論如何,盡管我不能用它做實(shí)驗(yàn),但我仍然認(rèn)為它超級(jí)有趣,因?yàn)槲蚁矚g網(wǎng)絡(luò),所以我將向你展示我找到的一些用來(lái)學(xué)習(xí) BGP 的工具。
首先我們來(lái)談?wù)?BGP 的一些術(shù)語(yǔ)。我打算很快掠過(guò),因?yàn)槲覍?duì)工具更感興趣,而且網(wǎng)上有很多關(guān)于 BGP 的高水平解釋?zhuān)ū热邕@篇 cloudflare 的文章)。
AS 是什么?
我們首先需要了解的是 AS(“自治系統(tǒng)”)。每個(gè) AS:
- 由一個(gè)組織擁有(通常是一個(gè)大型組織,如你的 ISP、政府、大學(xué)、Facebook 等)。
- 控制一組特定的 IP 地址(例如,我的 ISP 的 AS 包括 247,808 個(gè) IP 地址)。
- 有一個(gè)編號(hào) ASN(如 1403)。
下面是我通過(guò)做一些實(shí)驗(yàn)對(duì) AS 的一些觀察:
- 一些相當(dāng)大的科技公司并沒(méi)有自己的 AS。例如,我在 BGPView 上查看了 Patreon,就我所知,他們沒(méi)有自己的 AS,他們的主要網(wǎng)站(
patreon.com,104.16.6.49)在 Cloudflare 的 AS 中。 - 一個(gè) AS 可以包括許多國(guó)家的 IP。Facebook 的 AS(AS32934)肯定有新加坡、加拿大、尼日利亞、肯尼亞、美國(guó)和其他國(guó)家的 IP 地址。
- 似乎 IP 地址可以在一個(gè)以上的 AS 中。例如,如果我查找 209.216.230.240,它有 2 個(gè) ASN 與之相關(guān):
AS6130和AS21581。顯然,當(dāng)這種情況發(fā)生時(shí),更具體的路線會(huì)被優(yōu)先考慮 —— 所以到該 IP 的數(shù)據(jù)包會(huì)被路由到AS21581。
什么是 BGP 路由?
互聯(lián)網(wǎng)上有很多的路由器。例如,我的 ISP 就有路由器。
當(dāng)我給我的 ISP 發(fā)送一個(gè)數(shù)據(jù)包時(shí)(例如通過(guò)運(yùn)行 ping 129.134.30.0),我的 ISP 的路由器需要弄清楚如何將我的數(shù)據(jù)包實(shí)際送到 IP 地址 129.134.30.0。
路由器計(jì)算的方法是,它有一個(gè)路由表:這是個(gè)有一堆 IP 地址范圍的列表(比如 129.134.30.0/23),以及它知道的到達(dá)該子網(wǎng)的路由。
下面是一個(gè) 129.134.30.0/23 (Facebook 的一個(gè)子網(wǎng))的真實(shí)路由的例子。這不是來(lái)自我的 ISP。
11670 32934206.108.35.2 from 206.108.35.254 (206.108.35.254)Origin IGP, metric 0, valid, externalCommunity: 3856:55000Last update: Mon Oct 4 21:17:33 2021
我認(rèn)為這是在說(shuō)通往 129.134.30.0 的一條路徑是通過(guò)機(jī)器 206.108.35.2,這是在它的本地網(wǎng)絡(luò)上。所以路由器接下來(lái)可能會(huì)把我的 ping 包發(fā)送到 206.108.35.2,然后 206.108.35.2 會(huì)知道如何把它送到 Facebook。開(kāi)頭的兩個(gè)數(shù)字(11670 32934)是 ASN。
BGP 是什么?
我對(duì) BGP 的理解非常淺薄,它是一個(gè)公司用來(lái)公布 BGP 路由的協(xié)議。
昨天發(fā)生在 Facebook 身上的事情基本上是他們發(fā)布了一個(gè) BGP 公告,撤銷(xiāo)了他們所有的 BGP 路由,所以世界上的每個(gè)路由器都刪除了所有與 Facebook 有關(guān)的路由,沒(méi)有流量可以到達(dá)那里。
好了,現(xiàn)在我們已經(jīng)涵蓋了一些基本的術(shù)語(yǔ),讓我們來(lái)談?wù)勀憧梢杂脕?lái)查看 AS 和 BGP 的工具吧!
工具 1:用 BGPView 查看你的 ISP 的 AS
為了使 AS 這個(gè)東西不那么抽象,讓我們用一個(gè)叫做 BGPView的 工具來(lái)看看一個(gè)真實(shí)的 AS。
我的 ISP(EBOX)擁有 AS 1403。這是 我的 ISP 擁有的 IP 地址。如果我查找我的計(jì)算機(jī)的公共 IPv4 地址,我可以看到它是我的 ISP 擁有的IP地址之一:它在 104.163.128.0/17 塊中。
BGPView 也有這個(gè)圖,顯示了我的 ISP 與其他 AS 的連接情況。
工具 2:traceroute -A 和 mtr -z
好了,我們感興趣的是 AS 。讓我們看看我從哪些 AS 中穿過(guò)。
traceroute 和 mtr 都有選項(xiàng)可以告訴你每個(gè) IP 的 ASN。其選項(xiàng)分別是 traceroute -A 和 mtr -z。
讓我們看看我用 mtr 在去 facebook.com 的路上經(jīng)過(guò)了哪些 AS!
$ mtr -z facebook.com1. AS??? LEDE.lan2. AS1403 104-163-190-1.qc.cable.ebox.net3. AS??? 10.170.192.584. AS1403 0.et-5-2-0.er1.mtl7.yul.ebox.ca5. AS1403 0.ae17.er2.mtl3.yul.ebox.ca6. AS1403 0.ae0.er1.151fw.yyz.ebox.ca7. AS??? facebook-a.ip4.torontointernetxchange.net8. AS32934 po103.psw01.yyz1.tfbnw.net9. AS32934 157.240.38.7510. AS32934 edge-star-mini-shv-01-yyz1.facebook.com
這很有意思,看起來(lái)我們直接從我的 ISP 的 AS(1403)到 Facebook 的 AS(32934),中間有一個(gè)“互聯(lián)網(wǎng)交換”。
我不確定 互聯(lián)網(wǎng)交換(IX)是什么,但我知道它是互聯(lián)網(wǎng)的一個(gè)極其重要的部分。不過(guò)這將是以后的事了。我猜是,它是互聯(lián)網(wǎng)中實(shí)現(xiàn)“對(duì)等”的部分,就假設(shè)它是一個(gè)有巨大的交換機(jī)的機(jī)房,里面有無(wú)限的帶寬,一堆不同的公司把他們的電腦放在里面,這樣他們就可以互相發(fā)送數(shù)據(jù)包。
mtr 用 DNS 查找 ASN
我對(duì) mtr 如何查找 ASN 感到好奇,所以我使用了 strace。我看到它看起來(lái)像是在使用 DNS,所以我運(yùn)行了 dnspeep,然后就看到了!
$ sudo dnspeep...TXT 1.190.163.104.origin.asn.cymru.com 192.168.1.1 TXT: 1403 | 104.163.176.0/20 | CA | arin | 2014-08-14, TXT: 1403 | 104.163.160.0/19 | CA | arin | 2014-08-14, TXT: 1403 | 104.163.128.0/17 | CA | arin | 2014-08-14...
所以,看起來(lái)我們可以通過(guò)查找 1.190.163.104.origin.asn.cymru.com 上的 txt 記錄找到 104.163.190.1 的 ASN,像這樣:
$ dig txt 1.190.163.104.origin.asn.cymru.com1.190.163.104.origin.asn.cymru.com. 13911 IN TXT "1403 | 104.163.160.0/19 | CA | arin | 2014-08-14"1.190.163.104.origin.asn.cymru.com. 13911 IN TXT "1403 | 104.163.128.0/17 | CA | arin | 2014-08-14"1.190.163.104.origin.asn.cymru.com. 13911 IN TXT "1403 | 104.163.176.0/20 | CA | arin | 2014-08-14"
這很好!讓我們繼續(xù)前進(jìn)吧。
工具 3:數(shù)據(jù)包交換所的觀察鏡
PCH(“數(shù)據(jù)包交換所”)是運(yùn)行大量互聯(lián)網(wǎng)交換點(diǎn)的組織。“觀察鏡”似乎是一個(gè)通用術(shù)語(yǔ),指的是讓你從另一個(gè)人的計(jì)算機(jī)上運(yùn)行網(wǎng)絡(luò)命令的 Web 表單。有一些觀察鏡不支持 BGP,但我只對(duì)那些能顯示 BGP 路由信息的觀察鏡感興趣。
這里是 PCH 的觀察鏡: https://www.pch.net/tools/looking_glass/ 。
在該網(wǎng)站的 Web 表單中,我選擇了多倫多 IX(“TORIX”),因?yàn)?nbsp;mtr 說(shuō)我是用它來(lái)訪問(wèn) facebook.com 的。
操作 1:顯示 ip bgp 摘要
下面是輸出結(jié)果。我修改了其中的一些內(nèi)容:
IPv4 Unicast Summary:BGP router identifier 74.80.118.4, local AS number 3856 vrf-id 0BGP table version 33061919RIB entries 513241, using 90 MiB of memoryPeers 147, using 3003 KiB of memoryPeer groups 8, using 512 bytes of memoryNeighbor V AS MsgRcvd MsgSent TblVer InQ OutQ Up/Down State/PfxRcd...206.108.34.248 4 1403 484672 466938 0 0 0 05w3d03h 50...206.108.35.2 4 32934 482088 466714 0 0 0 01w6d07h 38206.108.35.3 4 32934 482019 466475 0 0 0 01w0d06h 38...Total number of neighbors 147
我的理解是,多倫多 IX(“TORIX”)直接連接到我的 ISP (EBOX,AS 1403)和 Facebook(AS 32934)。
操作 2:顯示 ip bgp 129.134.30.0
這是篩選自 show ip bgp 對(duì) 129.134.30.0(Facebook 的一個(gè) IP 地址)的輸出:
BGP routing table entry for 129.134.30.0/23Paths: (4 available, best #4, table default)Advertised to non peer-group peers:206.220.231.5511670 32934206.108.35.2 from 206.108.35.254 (206.108.35.254)Origin IGP, metric 0, valid, externalCommunity: 3856:55000Last update: Mon Oct 4 21:17:33 202111670 32934206.108.35.2 from 206.108.35.253 (206.108.35.253)Origin IGP, metric 0, valid, externalCommunity: 3856:55000Last update: Mon Oct 4 21:17:31 202132934206.108.35.3 from 206.108.35.3 (157.240.58.225)Origin IGP, metric 0, valid, external, multipathCommunity: 3856:55000Last update: Mon Oct 4 21:17:27 202132934206.108.35.2 from 206.108.35.2 (157.240.58.182)Origin IGP, metric 0, valid, external, multipath, best (Older Path)Community: 3856:55000Last update: Mon Oct 4 21:17:27 2021
這似乎是在說(shuō),從該 IX 到 Facebook 有 4 條路線。
魁北克 IX 似乎對(duì) Facebook 一無(wú)所知。
我也試過(guò)從魁北克 IX(“QIX”,它可能離我更近,因?yàn)槲易≡诿商乩麪柖皇嵌鄠惗啵┳鐾瑯拥氖虑椤5?QIX 似乎對(duì) Facebook 一無(wú)所知:當(dāng)我輸入129.134.30.0 時(shí),它只是說(shuō) “% 網(wǎng)絡(luò)不在表中”。
所以我想這就是為什么我被送到多倫多 IX 而不是魁北克的 IX。
更多的 BGP 觀察鏡
這里還有一些帶觀察鏡的網(wǎng)站,可以從其他角度給你類(lèi)似的信息。它們似乎都支持相同的 show ip bgp 語(yǔ)法,也許是因?yàn)樗麄冞\(yùn)行的是同一個(gè)軟件?我不太確定。
- http://www.routeviews.org/routeviews/index.php/collectors/
- http://www.routeservers.org/
- https://lg.he.net/
似乎有很多這樣的觀察鏡服務(wù),遠(yuǎn)不止這 3 個(gè)列表。
這里有一個(gè)與這個(gè)列表上的一個(gè)服務(wù)器進(jìn)行會(huì)話(huà)的例子:route-views.routeviews.org。這次我是通過(guò) telnet 連接的,而不是通過(guò) Web 表單,但輸出的格式看起來(lái)是一樣的。
$ telnet route-views.routeviews.orgroute-views>show ip bgp 31.13.80.36BGP routing table entry for 31.13.80.0/24, version 1053404087Paths: (23 available, best #2, table default)Not advertised to any peerRefresh Epoch 13267 1299 32934194.85.40.15 from 194.85.40.15 (185.141.126.1)Origin IGP, metric 0, localpref 100, valid, externalpath 7FE0C3340190 RPKI State validrx pathid: 0, tx pathid: 0Refresh Epoch 16939 3293464.71.137.241 from 64.71.137.241 (216.218.252.164)Origin IGP, localpref 100, valid, external, bestpath 7FE135DB6500 RPKI State validrx pathid: 0, tx pathid: 0x0Refresh Epoch 1701 174 32934137.39.3.55 from 137.39.3.55 (137.39.3.55)Origin IGP, localpref 100, valid, externalpath 7FE1604D3AF0 RPKI State validrx pathid: 0, tx pathid: 0Refresh Epoch 120912 3257 1299 32934212.66.96.126 from 212.66.96.126 (212.66.96.126)Origin IGP, localpref 100, valid, externalCommunity: 3257:8095 3257:30622 3257:50001 3257:53900 3257:53904 20912:65004path 7FE1195AF140 RPKI State validrx pathid: 0, tx pathid: 0Refresh Epoch 17660 2516 1299 32934203.181.248.168 from 203.181.248.168 (203.181.248.168)Origin IGP, localpref 100, valid, externalCommunity: 2516:1030 7660:9001path 7FE0D195E7D0 RPKI State validrx pathid: 0, tx pathid: 0
這里有幾個(gè)路由的選擇:
3267 1299 329346939 32934701 174 3293420912 3257 1299 329347660 2516 1299 32934
我想這些都有不止一個(gè) AS 的原因是,31.13.80.36 是 Facebook 在多倫多的 IP 地址,所以這個(gè)服務(wù)器(可能在美國(guó)西海岸,我不確定)不能直接連接到它,它需要先到另一個(gè) AS。所以所有的路由都有一個(gè)或多個(gè) ASN。
最短的是 6939(“Hurricane Electric”),它是一個(gè) “全球互聯(lián)網(wǎng)骨干”。他們也有自己的 Hurricane Electric 觀察鏡 頁(yè)面。
工具 4:BGPlay
到目前為止,所有其他的工具都只是向我們展示了 Facebook 路由的當(dāng)前狀態(tài),其中一切正常,但這第四個(gè)工具讓我們看到了這個(gè) Facebook BGP 互聯(lián)網(wǎng)災(zāi)難的歷史。這是一個(gè) GUI 工具,所以我將包括一堆屏幕截圖。
該工具在 https://stat.ripe.net/special/bgplay。我輸入了 IP 地址 129.134.30.12(Facebook 的一個(gè) IP),如果你想一起試試。
首先,讓我們看看一切出錯(cuò)之前的狀態(tài)。我點(diǎn)擊了在 10 月 4 日 13:11:28 的時(shí)間線,得到了這個(gè)結(jié)果:
我最初發(fā)現(xiàn)這很讓人不知所措。發(fā)生了什么事?但后來(lái)有人在推特上指出,下一個(gè)要看的地方是點(diǎn)擊 Facebook 災(zāi)難發(fā)生后的時(shí)間線(10 月 4 日 18 點(diǎn) 38 分)。
很明顯,這張圖有問(wèn)題:所有的 BGP 路線都不見(jiàn)了!哦,不要!
頂部的文字顯示了最后一條 Facebook BGP 路由的消失:
Type: W > withdrawal Involving: 129.134.30.0/24Short description: The route 50869, 25091, 32934 has been withdrawn.Date and time: 2021-10-04 16:02:33 Collected by: 20-91.206.53.12
如果我再點(diǎn)擊“快進(jìn)”按鈕,我們看到 BGP 路由開(kāi)始回來(lái)了。
第一個(gè)宣告的是 137409 32934。但我不認(rèn)為這實(shí)際上是第一個(gè)宣布的,在同一秒內(nèi)有很多路由宣告(在 2021-10-04 21:00:40),我認(rèn)為 BGPlay 內(nèi)部的排序是任意的。
如果我再次點(diǎn)擊“快進(jìn)”按鈕,越來(lái)越多的路由開(kāi)始回來(lái),路由開(kāi)始恢復(fù)正常。
我發(fā)現(xiàn)在 BGPlay 里看這個(gè)故障真的很有趣,盡管一開(kāi)始界面很混亂。
也許了解一下 BGP 是很重要的?
我在這篇文章的開(kāi)頭說(shuō),你不能改變 BGP 路由,但后來(lái)我想起在 2016 年或 2017 年,有一個(gè) Telia 路由問(wèn)題,給我們的工作造成了一些小的網(wǎng)絡(luò)問(wèn)題。而當(dāng)這種情況發(fā)生時(shí),了解為什么你的客戶(hù)無(wú)法到達(dá)你的網(wǎng)站其實(shí)是很有用的,即使它完全不受你控制。當(dāng)時(shí)我不知道這些工具,但我希望能知道!
我認(rèn)為對(duì)于大多數(shù)公司來(lái)說(shuō),應(yīng)對(duì)由其他人的錯(cuò)誤 BGP 路由造成的中斷,你所能做的就是“什么都不做,等待它得到修復(fù)”,但能夠_自信地_什么都不做是很好的。
一些發(fā)布 BGP 路由的方法
如果你想(作為一個(gè)業(yè)余愛(ài)好者)真正發(fā)布 BGP 路由,這里有一些評(píng)論中的鏈接:
- 獲取你自己的 ASN 的指南
- dn42 似乎有一個(gè) BGP 的實(shí)驗(yàn)場(chǎng)(它不在公共互聯(lián)網(wǎng)上,但確實(shí)有其他人在上面,這似乎比自己在家里做 BGP 實(shí)驗(yàn)更有趣)
目前就這些了
我想還有很多 BGP 工具(比如 PCH 有一堆 路由數(shù)據(jù)的每日快照,看起來(lái)很有趣),但這篇文章已經(jīng)很長(zhǎng)了,而且我今天還有其他事情要做。
我對(duì)我作為一個(gè)普通人可以得到這么多關(guān)于 BGP 的信息感到驚訝,我一直認(rèn)為它是一個(gè)“秘密的網(wǎng)絡(luò)巫師”這樣的東西,但顯然有各種公共機(jī)器,任何人都可以直接 telnet 到它并用來(lái)查看路由表!沒(méi)想到!

























