由 Facebook 事故引發的 BGP 工具探索
昨天,Facebook 發生了由 BGP 引起的離線事故。我對學習更多關於 BGP 的知識已經隱約感興趣了很長時間,所以我閱讀了一些文章。
我感到很沮喪,因為沒有一篇文章告訴我如何在我的電腦上實際查找與 BGP 有關的信息,因此我 寫了一條詢問有關工具的推特。
我一如既往地得到了一堆有用的回復,所以這篇博文展示了一些你可以用來查詢 BGP 信息的工具。這篇文章中可能會有較多的錯誤,因為我對 BGP 不是很了解。
我不能發布 BGP 路由
我從來沒有了解過 BGP 的原因之一是,據我所知,我沒有在互聯網上發布 BGP 路由的許可權。
對於大多數網路協議,如果需要,你可以非常輕鬆地自己實現該協議。例如,你可以:
- 發行你自己的 TLS 證書
- 編寫你自己的 HTTP 伺服器
- 編寫你自己的 TCP 實現
- 為你的域名編寫你自己的權威 DNS 伺服器(我現在正在為一個小項目嘗試這樣做)
- 建立你自己的證書機構(CA)
但是對於 BGP,我認為除非你擁有自己的 ASN,否則你不能自己發布路由(你可以在你的家庭網路上實現 BGP,但這對我來說有點無聊,當我做實驗的時候,我希望它們真的在真正的互聯網上)。
無論如何,儘管我不能用它做實驗,但我仍然認為它超級有趣,因為我喜歡網路,所以我將向你展示我找到的一些用來學習 BGP 的工具。
首先我們來談談 BGP 的一些術語。我打算很快掠過,因為我對工具更感興趣,而且網上有很多關於 BGP 的高水平解釋(比如這篇 cloudflare 的文章)。
AS 是什麼?
我們首先需要了解的是 AS(「 自治系統 」)。每個 AS:
- 由一個組織擁有(通常是一個大型組織,如你的 ISP、政府、大學、Facebook 等)。
- 控制一組特定的 IP 地址(例如,我的 ISP 的 AS 包括 247,808 個 IP 地址)。
- 有一個編號 ASN(如 1403)。
下面是我通過做一些實驗對 AS 的一些觀察:
- 一些相當大的科技公司並沒有自己的 AS。例如,我在 BGPView 上查看了 Patreon,就我所知,他們沒有自己的 AS,他們的主要網站(
patreon.com
,104.16.6.49)在 Cloudflare 的 AS 中。 - 一個 AS 可以包括許多國家的 IP。Facebook 的 AS(AS32934)肯定有新加坡、加拿大、奈及利亞、肯亞、美國和其他國家的 IP 地址。
- 似乎 IP 地址可以在一個以上的 AS 中。例如,如果我查找 209.216.230.240,它有 2 個 ASN 與之相關:
AS6130
和AS21581
。顯然,當這種情況發生時,更具體的路線會被優先考慮 —— 所以到該 IP 的數據包會被路由到AS21581
。
什麼是 BGP 路由?
互聯網上有很多的路由器。例如,我的 ISP 就有路由器。
當我給我的 ISP 發送一個數據包時(例如通過運行 ping 129.134.30.0
),我的 ISP 的路由器需要弄清楚如何將我的數據包實際送到 IP 地址 129.134.30.0
。
路由器計算的方法是,它有一個路由表:這是個有一堆 IP 地址範圍的列表(比如 129.134.30.0/23
),以及它知道的到達該子網的路由。
下面是一個 129.134.30.0/23
(Facebook 的一個子網)的真實路由的例子。這不是來自我的 ISP。
11670 32934
206.108.35.2 from 206.108.35.254 (206.108.35.254)
Origin IGP, metric 0, valid, external
Community: 3856:55000
Last update: Mon Oct 4 21:17:33 2021
我認為這是在說通往 129.134.30.0
的一條路徑是通過機器 206.108.35.2
,這是在它的本地網路上。所以路由器接下來可能會把我的 ping 包發送到 206.108.35.2
,然後 206.108.35.2
會知道如何把它送到 Facebook。開頭的兩個數字(11670 32934
)是 ASN。
BGP 是什麼?
我對 BGP 的理解非常淺薄,它是一個公司用來公布 BGP 路由的協議。
昨天發生在 Facebook 身上的事情基本上是他們發布了一個 BGP 公告,撤銷了他們所有的 BGP 路由,所以世界上的每個路由器都刪除了所有與 Facebook 有關的路由,沒有流量可以到達那裡。
好了,現在我們已經涵蓋了一些基本的術語,讓我們來談談你可以用來查看 AS 和 BGP 的工具吧!
工具 1:用 BGPView 查看你的 ISP 的 AS
為了使 AS 這個東西不那麼抽象,讓我們用一個叫做 BGPView的 工具來看看一個真實的 AS。
我的 ISP(EBOX)擁有 AS 1403。這是 我的 ISP 擁有的 IP 地址。如果我查找我的計算機的公共 IPv4 地址,我可以看到它是我的 ISP 擁有的IP地址之一:它在 104.163.128.0/17
塊中。
BGPView 也有這個圖,顯示了我的 ISP 與其他 AS 的連接情況。
工具 2:traceroute -A 和 mtr -z
好了,我們感興趣的是 AS 。讓我們看看我從哪些 AS 中穿過。
traceroute
和 mtr
都有選項可以告訴你每個 IP 的 ASN。其選項分別是 traceroute -A
和 mtr -z
。
讓我們看看我用 mtr
在去 facebook.com
的路上經過了哪些 AS!
$ mtr -z facebook.com
1. AS??? LEDE.lan
2. AS1403 104-163-190-1.qc.cable.ebox.net
3. AS??? 10.170.192.58
4. AS1403 0.et-5-2-0.er1.mtl7.yul.ebox.ca
5. AS1403 0.ae17.er2.mtl3.yul.ebox.ca
6. AS1403 0.ae0.er1.151fw.yyz.ebox.ca
7. AS??? facebook-a.ip4.torontointernetxchange.net
8. AS32934 po103.psw01.yyz1.tfbnw.net
9. AS32934 157.240.38.75
10. AS32934 edge-star-mini-shv-01-yyz1.facebook.com
這很有意思,看起來我們直接從我的 ISP 的 AS(1403
)到 Facebook 的 AS(32934
),中間有一個「互聯網交換」。
我不確定 互聯網交換 (IX)是什麼,但我知道它是互聯網的一個極其重要的部分。不過這將是以後的事了。我猜是,它是互聯網中實現「對等」的部分,就假設它是一個有巨大的交換機的機房,裡面有無限的帶寬,一堆不同的公司把他們的電腦放在裡面,這樣他們就可以互相發送數據包。
mtr 用 DNS 查找 ASN
我對 mtr
如何查找 ASN 感到好奇,所以我使用了 strace
。我看到它看起來像是在使用 DNS,所以我運行了 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
...
所以,看起來我們可以通過查找 1.190.163.104.origin.asn.cymru.com
上的 txt
記錄找到 104.163.190.1
的 ASN,像這樣:
$ dig txt 1.190.163.104.origin.asn.cymru.com
1.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"
這很好!讓我們繼續前進吧。
工具 3:數據包交換所的觀察鏡
PCH(「 數據包交換所 」)是運行大量互聯網交換點的組織。「 觀察鏡 」似乎是一個通用術語,指的是讓你從另一個人的計算機上運行網路命令的 Web 表單。有一些觀察鏡不支持 BGP,但我只對那些能顯示 BGP 路由信息的觀察鏡感興趣。
這裡是 PCH 的觀察鏡: https://www.pch.net/tools/looking_glass/ 。
在該網站的 Web 表單中,我選擇了多倫多 IX(「TORIX」),因為 mtr
說我是用它來訪問 facebook.com
的。
操作 1:顯示 ip bgp 摘要
下面是輸出結果。我修改了其中的一些內容:
IPv4 Unicast Summary:
BGP router identifier 74.80.118.4, local AS number 3856 vrf-id 0
BGP table version 33061919
RIB entries 513241, using 90 MiB of memory
Peers 147, using 3003 KiB of memory
Peer groups 8, using 512 bytes of memory
Neighbor 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 38
206.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
對 129.134.30.0
(Facebook 的一個 IP 地址)的輸出:
BGP routing table entry for 129.134.30.0/23
Paths: (4 available, best #4, table default)
Advertised to non peer-group peers:
206.220.231.55
11670 32934
206.108.35.2 from 206.108.35.254 (206.108.35.254)
Origin IGP, metric 0, valid, external
Community: 3856:55000
Last update: Mon Oct 4 21:17:33 2021
11670 32934
206.108.35.2 from 206.108.35.253 (206.108.35.253)
Origin IGP, metric 0, valid, external
Community: 3856:55000
Last update: Mon Oct 4 21:17:31 2021
32934
206.108.35.3 from 206.108.35.3 (157.240.58.225)
Origin IGP, metric 0, valid, external, multipath
Community: 3856:55000
Last update: Mon Oct 4 21:17:27 2021
32934
206.108.35.2 from 206.108.35.2 (157.240.58.182)
Origin IGP, metric 0, valid, external, multipath, best (Older Path)
Community: 3856:55000
Last update: Mon Oct 4 21:17:27 2021
這似乎是在說,從該 IX 到 Facebook 有 4 條路線。
魁北克 IX 似乎對 Facebook 一無所知。
我也試過從魁北克 IX(「QIX」,它可能離我更近,因為我住在蒙特利爾而不是多倫多)做同樣的事情。但 QIX 似乎對 Facebook 一無所知:當我輸入129.134.30.0
時,它只是說 「% 網路不在表中」。
所以我想這就是為什麼我被送到多倫多 IX 而不是魁北克的 IX。
更多的 BGP 觀察鏡
這裡還有一些帶觀察鏡的網站,可以從其他角度給你類似的信息。它們似乎都支持相同的 show ip bgp
語法,也許是因為他們運行的是同一個軟體?我不太確定。
- http://www.routeviews.org/routeviews/index.php/collectors/
- http://www.routeservers.org/
- https://lg.he.net/
似乎有很多這樣的觀察鏡服務,遠不止這 3 個列表。
這裡有一個與這個列表上的一個伺服器進行會話的例子:route-views.routeviews.org
。這次我是通過 telnet 連接的,而不是通過 Web 表單,但輸出的格式看起來是一樣的。
$ telnet route-views.routeviews.org
route-views>show ip bgp 31.13.80.36
BGP routing table entry for 31.13.80.0/24, version 1053404087
Paths: (23 available, best #2, table default)
Not advertised to any peer
Refresh Epoch 1
3267 1299 32934
194.85.40.15 from 194.85.40.15 (185.141.126.1)
Origin IGP, metric 0, localpref 100, valid, external
path 7FE0C3340190 RPKI State valid
rx pathid: 0, tx pathid: 0
Refresh Epoch 1
6939 32934
64.71.137.241 from 64.71.137.241 (216.218.252.164)
Origin IGP, localpref 100, valid, external, best
path 7FE135DB6500 RPKI State valid
rx pathid: 0, tx pathid: 0x0
Refresh Epoch 1
701 174 32934
137.39.3.55 from 137.39.3.55 (137.39.3.55)
Origin IGP, localpref 100, valid, external
path 7FE1604D3AF0 RPKI State valid
rx pathid: 0, tx pathid: 0
Refresh Epoch 1
20912 3257 1299 32934
212.66.96.126 from 212.66.96.126 (212.66.96.126)
Origin IGP, localpref 100, valid, external
Community: 3257:8095 3257:30622 3257:50001 3257:53900 3257:53904 20912:65004
path 7FE1195AF140 RPKI State valid
rx pathid: 0, tx pathid: 0
Refresh Epoch 1
7660 2516 1299 32934
203.181.248.168 from 203.181.248.168 (203.181.248.168)
Origin IGP, localpref 100, valid, external
Community: 2516:1030 7660:9001
path 7FE0D195E7D0 RPKI State valid
rx pathid: 0, tx pathid: 0
這裡有幾個路由的選擇:
3267 1299 32934
6939 32934
701 174 32934
20912 3257 1299 32934
7660 2516 1299 32934
我想這些都有不止一個 AS 的原因是,31.13.80.36
是 Facebook 在多倫多的 IP 地址,所以這個伺服器(可能在美國西海岸,我不確定)不能直接連接到它,它需要先到另一個 AS。所以所有的路由都有一個或多個 ASN。
最短的是 6939
(「Hurricane Electric」),它是一個 「全球互聯網骨幹」。他們也有自己的 Hurricane Electric 觀察鏡 頁面。
工具 4:BGPlay
到目前為止,所有其他的工具都只是向我們展示了 Facebook 路由的當前狀態,其中一切正常,但這第四個工具讓我們看到了這個 Facebook BGP 互聯網災難的歷史。這是一個 GUI 工具,所以我將包括一堆屏幕截圖。
該工具在 https://stat.ripe.net/special/bgplay。我輸入了 IP 地址 129.134.30.12
(Facebook 的一個 IP),如果你想一起試試。
首先,讓我們看看一切出錯之前的狀態。我點擊了在 10 月 4 日 13:11:28 的時間線,得到了這個結果:
我最初發現這很讓人不知所措。發生了什麼事?但後來有人在推特上指出,下一個要看的地方是點擊 Facebook 災難發生後的時間線(10 月 4 日 18 點 38 分)。
很明顯,這張圖有問題:所有的 BGP 路線都不見了!哦,不要!
頂部的文字顯示了最後一條 Facebook BGP 路由的消失:
Type: W > withdrawal Involving: 129.134.30.0/24
Short 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
如果我再點擊「 快進 」按鈕,我們看到 BGP 路由開始回來了。
第一個宣告的是 137409 32934
。但我不認為這實際上是第一個宣布的,在同一秒內有很多路由宣告(在 2021-10-04 21:00:40),我認為 BGPlay 內部的排序是任意的。
如果我再次點擊「 快進 」按鈕,越來越多的路由開始回來,路由開始恢復正常。
我發現在 BGPlay 里看這個故障真的很有趣,儘管一開始界面很混亂。
也許了解一下 BGP 是很重要的?
我在這篇文章的開頭說,你不能改變 BGP 路由,但後來我想起在 2016 年或 2017 年,有一個 Telia 路由問題,給我們的工作造成了一些小的網路問題。而當這種情況發生時,了解為什麼你的客戶無法到達你的網站其實是很有用的,即使它完全不受你控制。當時我不知道這些工具,但我希望能知道!
我認為對於大多數公司來說,應對由其他人的錯誤 BGP 路由造成的中斷,你所能做的就是「什麼都不做,等待它得到修復」,但能夠_自信地_什麼都不做是很好的。
一些發布 BGP 路由的方法
如果你想(作為一個業餘愛好者)真正發布 BGP 路由,這裡有一些評論中的鏈接:
- 獲取你自己的 ASN 的指南
- dn42 似乎有一個 BGP 的實驗場(它不在公共互聯網上,但確實有其他人在上面,這似乎比自己在家裡做 BGP 實驗更有趣)
目前就這些了
我想還有很多 BGP 工具(比如 PCH 有一堆 路由數據的每日快照,看起來很有趣),但這篇文章已經很長了,而且我今天還有其他事情要做。
我對我作為一個普通人可以得到這麼多關於 BGP 的信息感到驚訝,我一直認為它是一個「秘密的網路巫師」這樣的東西,但顯然有各種公共機器,任何人都可以直接 telnet 到它並用來查看路由表!沒想到!
via: https://jvns.ca/blog/2021/10/05/tools-to-look-at-bgp-routes/
作者:Julia Evans 選題:lujun9972 譯者:wxy 校對:wxy
本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive