如何檢查 BGP 路由與 RPKI 有效性

BGP 路由檢查回答的是伺服器檢查答不了的問題:不是「機器活著嗎?」,而是「網際網路真的在把流量送到這個前綴嗎、且來自正確的起源嗎?」。它讀取其他網路所看到的通告——起源自治系統、AS 路徑、有多少路由收集器能看到這個前綴——並用 RPKI 檢驗它們,RPKI 是簽名的註冊表,寫明誰被允許起源什麼。本指南逐一講清每個訊號的含義、它在哪裡會誤導人,並用本站的 BGP 查詢給出一套五步流程。

路由出錯的時候

跑過公共服務的人都熟悉這個場景:網站在你這裡能開啟,伺服器健康,憑證有效——而另一個國家的客戶什麼都打不開。你辦公室裡的監控說一切正常。他們的流量根本到不了,因為可達性不是你的伺服器的屬性。它是那些把你的前綴穿越他人網路送出去的通告的屬性,而這些通告可以在你機器上什麼都沒變的情況下改變、被過濾、或被另一條通告反駁。「網站掛了」有時是一個穿著伺服器外衣的路由事實。

路由故障有三種值得區分的形狀。劫持:另一個自治系統通告你的前綴——或它的一塊更具體切片——把從不屬於它的流量吸了過去。路由洩漏:一個網路把收到的路由傳播給了本不該發給的對等方或提供商,於是流量走上荒謬的繞路,或掉進一個無法投遞的網路裡。還有安靜的那種:一條通告被撤銷,或被組態變更、對等糾紛或 RPKI 丟棄過濾掉,於是網際網路的一部分乾脆沒有了路徑。三種的修法完全不同,所以第一件工作是把它們區分開——而這從看清實際通告了什麼開始。

從通告開始

第一個問題最樸素:這個前綴到底有沒有被通告到全球路由表裡,如果有,由誰通告?通告的最後一個 AS——起源 ASN——點名聲稱持有該前綴的網路,它背後的註冊資料點名該 ASN 所屬的組織。如果起源是你自己的 ASN,或你的提供商的,這條通告至少聲稱了正確的家。如果是一個你從未見過的名字,你在頭十秒裡就已經學到了重要的東西。

資訊藏在邊緣情形裡。一個完全沒有起源的前綴,意味著它在收集器能看到的任何地方都沒有被通告——前綴打錯了、通告從未發出、或已在各處被撤銷;在下結論前,先查有沒有一個覆蓋它的較不具體前綴,因為流量也許仍在聚合之下流動。同一前綴的多個起源並不自動可疑:anycast 服務和大型 CDN 本來就設計成從許多網路起源同一前綴,一個正在提供商之間轉移的前綴也可以合理地在一段時間內顯示兩個起源。多個起源,再加上一個你不認識的持有者,且開始時間你什麼都沒改過——這個組合才值得警覺。

可見度與 AS 路徑

looking glass 不問你的路由器;它問路由收集器——本站資料背後的 RIPE RIS 收集器與全世界的網路對等,記錄這些對等方向它們通告了什麼。可見度是能看到你的前綴的收集器對等方數量。一個健康、存在已久的前綴通常被幾乎所有收集器看到。一個正在自由落體的計數——或昨天還滿格、今天只剩一把——都提示一條通告正在被撤銷、被過濾,或只能透過一組不斷收窄的路徑被看到。

AS 路徑是一條通告走過的網路鏈:從右往左讀,從起源經由傳輸提供商向外,一直到收集器的對等方。它告訴你哪些上游在承載這條路由、你自己的提供商在鏈中坐在哪裡——洩漏發生時,路徑會顯示那個不該出現的網路,坐在中間,把流量橫向轉發。養成一個讀法習慣:路徑中重複的 ASN 通常是刻意的 prepend(路徑預填充),是一種流量工程訊號,不是環路;而最短的路徑並不總是真實流量走的那條,因為路由服從的是商業政策,不是地理。

信任儀表之前先校準它。收集器看到的是與它們對等的那些網路的視圖——一個龐大、位置優越的樣本,但不是地球上的每一台路由器。一個前綴可以對收集器不可見,卻在一個不與 RIS 對等的提供商內部可達;也可以對收集器可見,卻被某個具體的傳輸網路在下游過濾掉。looking glass 的結果是關於「從嚴肅的觀察點看到的全球路由表」的證據。它不是此刻正在對你的前綴做出的每一個轉發決定的照片。

用大白話講 RPKI

RPKI 是網際網路讓「我有權通告這個」成為可檢驗主張、而不只是喊一嗓子的嘗試。前綴持有者發布一個 ROA——路由起源授權,一份簽名的物件,聲明某個具名 ASN 可以起源該前綴,直到一個聲明的最大前綴長度。Routinator 這樣的驗證器——本站檢查背後的正是它——從五個區域註冊機構的信任錨(APNIC、ARIN、LACNIC、RIPE NCC 和 AFRINIC)擷取 ROA,並逐條檢驗通告。一份簽名聲明要麼覆蓋你的通告,要麼不覆蓋;整個機制就是這麼多。

每條通告都落進三種狀態之一。有效(valid):一個 ROA 覆蓋這個前綴、這個起源 ASN 和這個長度。無效(invalid):一個 ROA 覆蓋該前綴,但通告違反了它的條款——而無效內部的區別要緊:invalid_asn 意味著起源它的網路不對,而 invalid_length 意味著正確的網路通告了比 ROA 允許的更具體的前綴。未知(unknown,常稱 not-found):根本沒有 ROA 覆蓋該前綴,所以無從檢驗。

現在說誠實的部分。無效是證據,不是劫持的證明。ROA 會被錯發、在前綴轉移後變陳舊,或寫了一個維運團隊隨後在拆分聚合時忘掉的最大長度——錯 ASN 的情形值得一個快速電話,但在指責任何人之前,先查你自己的文件。而未知通常只意味著沒人發布過 ROA;世界上很大一部分前綴至今沒有 ROA,所以未知是系統裡的一個缺口,不是對該前綴的不利標記。不過無效確實有真實的牙齒:許多大型網路如今直接丟棄無效通告,所以一個無效狀態可能正是你一開始遇到的那個可達性窟窿的直接成因。

一套五步檢查流程

先排除更簡單的層——一條還在傳播中的新 DNS 記錄(用 DNS 傳播檢查器查)或一個對外部關閉的服務連接埠(用連接埠掃描器查),都能完美地模仿路由故障。然後開啟 BGP 查詢按順序做。第一步,前綴:輸入 IP 或前綴,確認實際承載你流量的那條覆蓋通告。第二步,起源:讀起源 ASN 和持有者——你的、你的提供商的,還是陌生人的。第三步,可見度:有多少收集器對等方能看到它,這個計數看起來像該前綴的常態嗎?

第四步,RPKI:有效、無效(是哪一種?)還是未知——如果 invalid_asn 點名了一個陌生人,在做完清單之前先升級處理。第五步,AS 路徑:哪些上游在承載這條通告,有沒有哪個網路坐在它不屬於的路徑裡?然後趁它還在眼前寫下來:前綴、起源 ASN 與持有者、可見度計數、RPKI 狀態、你看到的路徑——以及時間,用 UTC。該工具的資料來自 RIPEstat 和 RIPE RIS,並快取約一小時,所以沒有時間戳記的截圖只是一個軼事;帶時間戳記的記錄才是可以與下一次檢查做對比的證據。

值得寫明的限制

有三個限制屬於任何引用這份資料的報告。收集器覆蓋有偏:RIS 的對等方很多,但分布不均——某些地區和某些類型的網路被代表得遠好於其他,所以可見度計數是一個樣本,不是一次普查。傳播以分鐘計,不以秒計:你剛做的合法變更,可能合理地尚未可見;一條已撤銷的路由也可能在真實流量轉移之後仍滯留在收集器裡;在宣稱修好或宣稱災難之前,先等一等再複查。RPKI 覆蓋是局部的:許多前綴仍沒有 ROA,驗證層只能評判路由表中參與它的那部分。

還有爭論中最要緊的那條限制:這裡的一個乾淨結果,證明不了你自己路由器的路由表裡有什麼。你的工作階段、你的過濾器、你的本機優先順序,都可以讓網際網路的你這個角落合理地與收集器不一致。用 BGP 查詢確立世界通告和看到了什麼;用你自己路由器的 BGP 表確立你對此做了什麼。一份把這兩種主張分開的事故報告,是沒人需要收回的那種。

常見問題

RPKI 無效到底是什麼意思?

意味著一個 ROA 覆蓋該前綴,但這條通告違反了它的條款:要麼起源 ASN 不是 ROA 授權的那個(invalid_asn),要麼被通告的前綴比 ROA 允許的最大長度更具體(invalid_length)。它是證據,不是劫持的證明——錯發的和陳舊的 ROA、以及轉移中的前綴,也會產生無效通告。儘管如此還是要緊急對待:許多大型網路會丟棄無效路由,所以無效狀態本身可能就是網際網路的一部分無法到達該前綴的原因。

looking glass 能看到我自己路由器的路由表嗎?

不能。looking glass 展示的是 RIPE RIS 這樣的路由收集器從與之對等的網路那裡收到的內容——全球路由表的一個龐大而有用的樣本,但不是你路由器自己的視圖。你的路由器會套用你的工作階段、過濾器和本機優先順序,所以它的表可以合理地不同。要看你自己的視圖,沒有什麼能替代直接問路由器本身(它的 BGP 彙總和路由查詢);用 looking glass 看世界看到了什麼,用你的路由器看你正在做什麼。

為什麼兩個 looking glass 對同一前綴說法不一致?

因為它們坐在不同的椅子上看。每個收集器與一組不同的網路對等,所以一個可能收到另一個從未聽到的通告;它們也可能在一個變更還在傳播時相隔幾分鐘查詢,而途中的網路會套用各自的過濾——包括丟棄 RPKI 無效的路由——所以不同觀察點誠實地持有不同的表。不一致本身就是資訊:如果一個地區的收集器能看到該前綴而另一個地區的不能,這種不一致的形狀往往就是問題本身的形狀。