從 Facebook 故障開始探索 BGP 工具使用

背景

上個月,F(xiàn)acebook 發(fā)生了一次由 BGP 引起的大型故障,從故障報告 中我確實看得云里霧里。所以近期閱讀一些文章,期望深入學習。

這篇博文將會分享一些我如何學習 BGP 的過程及用來查詢 BGP 信息的相關工具使用。因為我對 BGP 不是那么了解,故文章難免有不精確的部分,希望多多交流。

BGP 探索之路

如何發(fā)布BGP路由

之前我從沒有開始接觸 BGP 的原因之一是--我不知道如何在我的服務器上通過 BGP 發(fā)布路由。

對于大多數(shù)網絡協(xié)議,如果你愿意,都可以折騰,自己實現(xiàn)協(xié)議。例如,你可以。

  • 發(fā)行你自己的TLS證書

  • 編寫你自己的HTTP服務器

  • 編寫你自己的TCP實現(xiàn)

  • 為你的域名編寫你自己的權威DNS服務器

  • 建立你自己的證書頒發(fā)機構

但對于BGP,我認為除非你擁有自己的 ASN,否則不能自己發(fā)布路由,盡管可能可以在你的家庭網絡上實現(xiàn)BGP,但我希望它們運行在真正的互聯(lián)網上。

于是我開始著手于如何在我的服務器上發(fā)布 BGP 路由。

首先我們來談談 BGP 的一些術語。這部分我會簡單的介紹,因為我對工具更感興趣,而且網上有很多關于 BGP 的高水平資料(比如 cloudflare 的這篇帖子)。

什么是 AS(autonomous system)?

我們需要了解的第一件術語是 AS。每一個 AS 都是什么呢?

參考這篇維基百科, 他們有以下特征,

  1. 由一個組織擁有的(通常是一個大型組織,如你的ISP,政府,大學,F(xiàn)acebook,等等)

  2. 他們能控制一組特定的 IP 地址(例如,我的 ISP 的 AS 包括 247,808 個IP地址)。

  3. 他們有一個固定標識的數(shù)字碼(如1403), 我們稱為 ASN。

下面是我簡單做一些 AS 相關的實驗觀察。

  1. 一些大型的科技公司其實并沒有自己的 AS。例如,我在 BGPView 上查看了 Patreon,就我所知,他們沒有自己的 AS -- 他們的主站(patreon.com,104.16.6.49)在 Cloudflare 的 AS 中。

  2. 一個 AS 可以包括許多國家的 IP。Facebook 的 AS(AS32934)肯定有新加坡、加拿大、中國、美國和其他國家的IP地址。

  3. 似乎 IP 地址可以在一個以上的 AS 中。例如,如果我查找 209.216.230.240,它有 2 個 ASN 與之相關-- AS6130 和 AS21581。顯然,當這種情況發(fā)生時,可能會有路由規(guī)則就會有對應的優(yōu)先算法--所以到該IP的數(shù)據(jù)包會被路由到 AS21581。

什么是 BGP 路由呢

互聯(lián)網上有很多的路由設備。例如,我的 ISP 有所在云廠商提供的路由策略。

當我向我的 ISP 發(fā)送一個數(shù)據(jù)包時(例如通過運行 ping 129.134.30.0),我的 ISP 的路由器需要弄清楚如何將我的數(shù)據(jù)包實際發(fā)送到 IP 地址 129.134.30.0

路由器計算的方法是它有一個路由表 -- 它有一堆IP范圍的列表(比如129.134.30.0/23),以及它知道的通往該子網的路由。

下面是一個 129.134.30.0/23 的真實路由的例子:

  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 包發(fā)送到 206.108.35.2,然后 206.108.35.2 會知道如何把它送到目標地址。

其中開頭的兩個數(shù)字(11670 32934)是ASN。

所以什么是 BGP 呢

我對 BGP 的理解比較模糊,但它是一個公司用來公布 BGP 路由的協(xié)議。

如上個月發(fā)生在 Facebook 的故障是,他們發(fā)布了 BGP 廣播,撤銷了他們所有的 BGP 路由,所以世界上每一個路由器都刪除了所有與 Facebook 有關的路由,所以沒有流量可以到達那里。

好了,現(xiàn)在我們已經涵蓋了一些基本的術語,讓我們來談談可以用來查看自治系統(tǒng)和 BGP 的工具吧!

工具1:用 BGPView 查看你的 ISP 的 AS

為了使 AS 這個東西不那么抽象,我通常使用一個叫 BGPView 的工具來查看一個真實的 AS。

我的 ISP 擁有 AS4808這里是我的 ISP 擁有的 IP 地址。

bgpview-asn

如果我查找我的計算機的公網 IPv4 地址,可以發(fā)現(xiàn)它是我的 ISP 擁有的 IP 地址之一 -- 它在 111.192.0.0/12 塊中。

BGPView 還提供了我的 ISP 與其他 AS 的連接情況的圖表

bgp連接圖標

工具2: traceroute -Amtr -z

既然我們對 AS 有所了解。那么讓我們看看我的網絡請求會從哪些 AS 中穿過

traceroutemtr 都能可以告訴你每個 IP 的 ASN 。

具體用法是traceroute -Amtr -z,分別。

讓我們看看我用 mtr 在訪問 baidu.com 的路上經過了哪些 AS

$ sudo mtr -z baidu.com
                                            My traceroute  [v0.94]
Bong (10.255.2.107) -> baidu.com                                                     2021-11-16T13:12:47+0800
Keys:  Help   Display mode   Restart statistics   Order of fields   quit
                                                                     Packets               Pings
 Host                                                              Loss%   Snt   Last   Avg  Best  Wrst StDev
 1. AS???    10.255.0.1                                             0.0%    86    2.3  50.2   1.7 925.0 169.2
 2. AS4808   121.69.9.97                                            1.2%    86    3.8  47.7   3.4 876.4 158.8
 3. AS4808   218.241.128.173                                        1.2%    86    3.3  54.0   3.0 996.9 180.1
 4. AS4808   218.241.254.185                                        0.0%    86    5.0  59.5   2.5 998.4 196.0
 5. AS4808   218.241.254.197                                        0.0%    86    3.6  55.7   3.4 974.3 184.4
 6. AS4808   218.241.254.249                                        0.0%    86    9.0  51.7   4.4 921.5 171.7
 7. AS4808   218.241.244.17                                        58.1%    86   14.2  45.7   4.9 874.7 151.3
 8. AS4808   61.149.212.201                                        62.4%    86  1003. 105.0   5.4 1003. 244.9
 9. AS4808   202.96.13.249                                          4.7%    86    5.6  66.5   5.1 1010. 201.5
10. AS4808   124.65.194.77                                         12.9%    85   11.0  33.7   5.7 647.0 105.9
11. AS4837   219.158.13.78                                          0.0%    85    6.1  58.5   6.1 916.7 172.3
12. AS4837   219.158.44.114                                        89.3%    85   28.4  43.1   6.3 310.7 100.6
13. AS4134   202.97.18.125                                         72.6%    85    8.4  53.8   6.3 1026. 212.0
14. AS23724  36.110.246.126                                        82.1%    85    9.4  87.2   7.3 982.4 252.9
15. (waiting for reply)
16. (waiting for reply)
17. (waiting for reply)
18. (waiting for reply)
19. (waiting for reply)
20. (waiting for reply)
21. AS23724  220.181.38.148                                         0.0%    85    9.6  59.0   7.9 983.3 182.6

雖然看得眼花繚亂,但看起來網絡數(shù)據(jù)包直接從我的 ISP 的AS(4808)到 Baidu 的 AS(23724),中間有一個 "互聯(lián)網交換"。

我不確定互聯(lián)網交換是什么,但我知道它是互聯(lián)網的一個極其重要的部分。不過這部分暫時不在文章中介紹了。我最好的猜測是,它是互聯(lián)網中實現(xiàn) "對等 "的部分-- 就像 IX 是一個有巨大的交換機的機房,里面有無限的帶寬,一堆不同的公司把他們的計算機放在那里,這樣他們就可以互相發(fā)送數(shù)據(jù)包。

工具3:PCH looking glass

PCH("packet clearing house")是運行大量互聯(lián)網交換點的組織。"looking glass" 似乎是一個通用術語,指的是讓你從另一個人的電腦上運行網絡命令的終端。有一些 looking glass 不支持 BGP,而我只對那些能顯示 BGP 路由信息的 looking glass 工具感興趣,本文只重點介紹這一部分。

這里是常用的 PCH looking glass 地址:https://www.pch.net/tools/looking_glass/。

我按下圖隨便選了一個選項進行 bgp 查詢

pch-looking-glass

Step1:"show ip bgp summary"

下面是輸出結果。由于太長我刪減了一些不重要內容。

From cache (number of seconds old (max 600)): 339


 IPv4 Unicast Summary:
 BGP router identifier 74.80.118.4, local AS number 3856 vrf-id 0
 BGP table version 3612368
 RIB entries 546990, using 96 MiB of memory
 Peers 150, using 3064 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.3    4       5769   18732   18160        0    0    0 01w5d14h          808
 ...
 206.220.231.55  4       3856   16515 1824368        0    0    0 06:52:52            0
 74.80.118.1     4         42   18189   18159        0    0    0 01w5d14h           49

 Total number of neighbors 150

上述結果我的理解是,TORIX 會直接連接到我的 ISP, 并探測當前網絡環(huán)境我的鄰居 AS 共有哪些。

Step 2: “show ip bgp 129.134.30.0”

下面是挑選 129.134.30.0(Facebook 的一個IP地址)的 "show ip bgp "的輸出。

BGP routing table entry for 129.134.30.0/23
Paths: (4 available, best #3, table default)
  Advertised to non peer-group peers:
  206.220.231.55
  11670 32934
    206.108.35.3 from 206.108.35.253 (206.108.35.253)
      Origin IGP, metric 0, valid, external
      Community: 3856:55000
      Last update: Mon Nov 15 11:46:18 2021

  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: Sat Nov  6 11:55:40 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: Wed Nov  3 14:52:59 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: Wed Nov  3 14:52:59 2021

這似乎是在說,從該互聯(lián)網交換中心到 Facebook 有 4 條路由路徑。

魁北克互聯(lián)網交換中心似乎不感知 Facebook 該 ip 地址

我也試過從魁北克互聯(lián)網交換中心QIX做同樣的事。但 QIX 似乎對 Facebook 一無所知 -- 當我輸入 129.134.30.0 時,它提示"Network not in table"。

所以我想這就是為什么我必須要從 TORIX 訪問 Facebook。

更多的 BGP looking glasses

除以上之外,這里還有一些 BGP looking glasses 的網站,可以從其他角度給你提供類似的信息。他們似乎都支持相同的 show ip bgp 語法,也能有一定的參考性。

下面是一個與這個名單上的一個服務器進行會話的例子: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

工具4: BGPlay

到目前為止,所有其他的工具都只是向我們展示了 Facebook 路由的當前狀態(tài),其中一切正常,但這第四個工具讓我們看到了這個Facebook BGP 互聯(lián)網故障的歷史記錄。

這是一個 GUI 工具,所以我將貼上一堆屏幕截圖。

這個工具下載地址在 https://stat.ripe.net/special/bgplay 。我輸入了 IP 地址 129.134.30.12(Facebook的IP之一)進行驗證。

首先,讓我們看看一切出錯之前的狀態(tài)。我在10月4日13:11:28點擊了時間線,得到了這個結果。

bgplay-before

最初發(fā)現(xiàn)這非常難以看懂。發(fā)生了什么事?但后來有人在 Twitter 上指出,下一個要看的地方是點擊 Facebook 故障發(fā)生后的時間線(10月4日18點38分)

bgplay-after

很明顯,這張圖有問題 -- 所有的 BGP 路由都消失了!可以看到各個 AS 之間已經沒有了連線!

上面的文字顯示了最后一條 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 路由開始回來了,這是 FB 工程師開始進行故障恢復了。

bgplay-return

可以看到,第一條恢復的是 BGP 路由規(guī)則是 137409 32934。

但我不認為這實際上是第一個恢復的--在同一秒內(在2021-10-04 21:00:40)有很多路由規(guī)則同時在恢復,我認為 BGPlay 內部的排序是隨機的。

如果我再次點擊 "快進 "按鈕,越來越多的路由開始回來,路由開始恢復正常

可以看到這個 GUI 工具還是十分有趣的,可以直觀地帶我們探索 Facebook 網絡故障的過程。

總結

至此,所有工具的介紹基本結束。也許你會看到一堆 BGP 相關術語和知識,或者一些工具的參考,如果你想(作為一個業(yè)余愛好者)實際發(fā)布 BGP 路由,這里有一些鏈接提供參考

  • a guide to getting your own ASN
  • dn42 seems to have a playground for BGP (it’s not on the public internet, but it does have other people on it which seems more fun than just doing BGP by yourself at home)

我想還有很多BGP工具(比如PCH有一堆路由數(shù)據(jù)的每日快照,都是十分有趣的工具),但這篇文章已經很長了,而且我確實也沒有逐個了解過這些工具。

我對我作為一個沒有專業(yè)網絡知識的工程師可以得到這么多關于BGP的信息感到驚訝,我一直認為它是一個 "秘密的網絡向導 "的東西,但顯然有各種公共機器,任何人都可以直接telnet到那里,用來查看路由表! 還有各種資料!

希望以后能更多的接觸到 BGP 相關知識,再和你們做分享!

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容