[#]: subject: "Tools to explore BGP" [#]: via: "https://jvns.ca/blog/2021/10/05/tools-to-look-at-bgp-routes/" [#]: author: "Julia Evans https://jvns.ca/" [#]: collector: "lujun9972" [#]: translator: "wxy" [#]: reviewer: "wxy" [#]: publisher: "wxy" [#]: url: "https://linux.cn/article-13857-1.html" 由 Facebook 事故引发的 BGP 工具探索 ====== ![](https://img.linux.net.cn/data/attachment/album/202110/07/093743krr8ftrpvgfrvffx.jpg) 昨天,Facebook 发生了由 BGP 引起的离线事故。我对学习更多关于 BGP 的知识已经隐约感兴趣了很长时间,所以我阅读了一些文章。 我感到很沮丧,因为没有一篇文章告诉我如何在我的电脑上实际查找与 BGP 有关的信息,因此我 [写了一条询问有关工具的推特][1]。 我一如既往地得到了一堆有用的回复,所以这篇博文展示了一些你可以用来查询 BGP 信息的工具。这篇文章中可能会有较多的错误,因为我对 BGP 不是很了解。 ### 我不能发布 BGP 路由 我从来没有了解过 BGP 的原因之一是,据我所知,我没有在互联网上发布 BGP 路由的权限。 对于大多数网络协议,如果需要,你可以非常轻松地自己实现该协议。例如,你可以: * 发行你自己的 TLS 证书 * 编写你自己的 HTTP 服务器 * 编写你自己的 TCP 实现 * 为你的域名编写你自己的权威 DNS 服务器(我现在正在为一个小项目尝试这样做) * 建立你自己的证书机构(CA) 但是对于 BGP,我认为除非你拥有自己的 ASN,否则你不能自己发布路由(你*可以*在你的家庭网络上实现 BGP,但这对我来说有点无聊,当我做实验的时候,我希望它们真的在真正的互联网上)。 无论如何,尽管我不能用它做实验,但我仍然认为它超级有趣,因为我喜欢网络,所以我将向你展示我找到的一些用来学习 BGP 的工具。 首先我们来谈谈 BGP 的一些术语。我打算很快掠过,因为我对工具更感兴趣,而且网上有很多关于 BGP 的高水平解释(比如这篇 [cloudflare 的文章][2])。 ### AS 是什么? 我们首先需要了解的是 AS(“自治系统autonomous system”)。每个 AS: 1. 由一个组织拥有(通常是一个大型组织,如你的 ISP、政府、大学、Facebook 等)。 2. 控制一组特定的 IP 地址(例如,我的 ISP 的 AS 包括 247,808 个 IP 地址)。 3. 有一个编号 ASN(如 1403)。 下面是我通过做一些实验对 AS 的一些观察: * 一些相当大的科技公司并没有自己的 AS。例如,我在 BGPView 上查看了 Patreon,就我所知,他们没有自己的 AS,他们的主要网站(`patreon.com`,[104.16.6.49][3])在 Cloudflare 的 AS 中。 * 一个 AS 可以包括许多国家的 IP。Facebook 的 AS([AS32934][4])肯定有新加坡、加拿大、尼日利亚、肯尼亚、美国和其他国家的 IP 地址。 * 似乎 IP 地址可以在一个以上的 AS 中。例如,如果我查找 [209.216.230.240][5],它有 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][6]的 工具来看看一个真实的 AS。 我的 ISP(EBOX)拥有 [AS 1403][7]。这是 [我的 ISP 拥有的 IP 地址][8]。如果我查找我的计算机的公共 IPv4 地址,我可以看到它是我的 ISP 拥有的IP地址之一:它在 `104.163.128.0/17` 块中。 BGPView 也有这个图,显示了我的 ISP 与其他 AS 的连接情况。 ![][9] ### 工具 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`),中间有一个“互联网交换”。 > 我不确定 [互联网交换][10]internet exchange(IX)是什么,但我知道它是互联网的一个极其重要的部分。不过这将是以后的事了。我猜是,它是互联网中实现“对等”的部分,就假设它是一个有巨大的交换机的机房,里面有无限的带宽,一堆不同的公司把他们的电脑放在里面,这样他们就可以互相发送数据包。 #### mtr 用 DNS 查找 ASN 我对 `mtr` 如何查找 ASN 感到好奇,所以我使用了 `strace`。我看到它看起来像是在使用 DNS,所以我运行了 [dnspeep][11],然后就看到了! ``` $ 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(“数据包交换所packet clearing house”)是运行大量互联网交换点的组织。“观察镜looking glass”似乎是一个通用术语,指的是让你从另一个人的计算机上运行网络命令的 Web 表单。有一些观察镜不支持 BGP,但我只对那些能显示 BGP 路由信息的观察镜感兴趣。 这里是 PCH 的观察镜: 。 在该网站的 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` 语法,也许是因为他们运行的是同一个软件?我不太确定。 * * * 似乎有很多这样的观察镜服务,远不止这 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 观察镜][12] 页面。 ### 工具 4:BGPlay 到目前为止,所有其他的工具都只是向我们展示了 Facebook 路由的当前状态,其中一切正常,但这第四个工具让我们看到了这个 Facebook BGP 互联网灾难的历史。这是一个 GUI 工具,所以我将包括一堆屏幕截图。 该工具在 。我输入了 IP 地址 `129.134.30.12`(Facebook 的一个 IP),如果你想一起试试。 首先,让我们看看一切出错之前的状态。我点击了在 10 月 4 日 13:11:28 的时间线,得到了这个结果: ![][13] 我最初发现这很让人不知所措。发生了什么事?但后来有人在推特上指出,下一个要看的地方是点击 Facebook 灾难发生后的时间线(10 月 4 日 18 点 38 分)。 ![][14] 很明显,这张图有问题:所有的 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 ``` 如果我再点击“快进fast forward”按钮,我们看到 BGP 路由开始回来了。 ![][15] 第一个宣告的是 `137409 32934`。但我不认为这实际上是第一个宣布的,在同一秒内有很多路由宣告(在 2021-10-04 21:00:40),我认为 BGPlay 内部的排序是任意的。 如果我再次点击“快进fast forward”按钮,越来越多的路由开始回来,路由开始恢复正常。 我发现在 BGPlay 里看这个故障真的很有趣,尽管一开始界面很混乱。 ### 也许了解一下 BGP 是很重要的? 我在这篇文章的开头说,你不能改变 BGP 路由,但后来我想起在 2016 年或 2017 年,有一个 [Telia 路由问题][16],给我们的工作造成了一些小的网络问题。而当这种情况发生时,了解为什么你的客户无法到达你的网站其实是很有用的,即使它完全不受你控制。当时我不知道这些工具,但我希望能知道! 我认为对于大多数公司来说,应对由其他人的错误 BGP 路由造成的中断,你所能做的就是“什么都不做,等待它得到修复”,但能够_自信地_什么都不做是很好的。 ### 一些发布 BGP 路由的方法 如果你想(作为一个业余爱好者)真正发布 BGP 路由,这里有一些评论中的链接: * [获取你自己的 ASN 的指南][17] * [dn42][18] 似乎有一个 BGP 的实验场(它不在公共互联网上,但确实有其他人在上面,这似乎比自己在家里做 BGP 实验更有趣) ### 目前就这些了 我想还有很多 BGP 工具(比如 PCH 有一堆 [路由数据的每日快照][19],看起来很有趣),但这篇文章已经很长了,而且我今天还有其他事情要做。 我对我作为一个普通人可以得到这么多关于 BGP 的信息感到惊讶,我一直认为它是一个“秘密的网络巫师”这样的东西,但显然有各种公共机器,任何人都可以直接 telnet 到它并用来查看路由表!没想到! -------------------------------------------------------------------------------- via: https://jvns.ca/blog/2021/10/05/tools-to-look-at-bgp-routes/ 作者:[Julia Evans][a] 选题:[lujun9972][b] 译者:[wxy](https://github.com/wxy) 校对:[wxy](https://github.com/wxy) 本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 [a]: https://jvns.ca/ [b]: https://github.com/lujun9972 [1]: https://twitter.com/b0rk/status/1445199475195236356 [2]: https://blog.cloudflare.com/october-2021-facebook-outage/ [3]: https://bgpview.io/ip/104.16.6.49 [4]: https://bgpview.io/asn/32934#prefixes-v4 [5]: https://bgpview.io/ip/209.216.230.240 [6]: https://bgpview.io [7]: https://bgpview.io/asn/1403 [8]: https://bgpview.io/asn/1403#prefixes-v4 [9]: https://jvns.ca/images/ebox-graph.png [10]: https://en.wikipedia.org/wiki/Internet_exchange_point [11]: https://github.com/jvns/dnspeep/ [12]: https://lg.he.net/ [13]: https://jvns.ca/images/bgplay-before.png [14]: https://jvns.ca/images/bgplay-after.png [15]: https://jvns.ca/images/bgplay-return.png [16]: https://news.ycombinator.com/item?id=14246888 [17]: https://labs.ripe.net/author/samir_jafferali/build-your-own-anycast-network-in-nine-steps/ [18]: https://dn42.eu/Home [19]: https://www.pch.net/resources/Routing_Data/IPv4_daily_snapshots/