ESC

開始輸入,可搜尋發票、服務、域名、工單,以及 更多...

搜尋... Ctrl+K
IP 與 ASN

BGP AS 路徑預置(AS-Path Prepending)被對等體拒絕的原因與解決方法:BIRD/FRR 配置示例

5 個步驟 7 分鐘閱讀 931 次閱讀 84
本文目錄

AS 路徑預置(AS-Path Prepending)是多線 BGP 環境中最常用的入站流量排程手段:在某條上遊的公告中重複新增自己的 ASN,讓該路徑變長、優先順序降低。但很多使用者配置後發現BGP AS-Path Prepending 被對等體拒絕,字首從該上遊消失或預置不生效。本文分析常見原因(路徑長度限制、AS 路徑過濾策略、IRR/RPKI 校驗),並給出 BIRD 2 與 FRRouting 的正確配置示例,適用於 Debian/Ubuntu 與 CentOS/Rocky/AlmaLinux。示例本端 ASN 64500、上遊 203.0.113.1(AS64496)、字首 198.51.100.0/24,請替換為您的真實值。

步驟 1:確認 AS-Path Prepending 被拒絕的現象

先確認本機確實以預置後的路徑發出了公告,再通過日誌檢視是否收到 NOTIFICATION 或會話重置;同時用公共 Looking Glass 檢視全球看到的 AS 路徑。如果本機發出的路徑正確、但外部完全看不到經該上遊的路徑,基本可以判定被上遊或更遠的網路過濾。

# BIRD 2
birdc show route 198.51.100.0/24 export upstream1 all
journalctl -u bird --since "1 hour ago" --no-pager
# FRRouting
vtysh -c "show bgp ipv4 unicast neighbors 203.0.113.1 advertised-routes"
vtysh -c "show bgp ipv4 unicast neighbors 203.0.113.1" | grep -iE "state|prefix|notification"
curl -s "https://stat.ripe.net/data/looking-glass/data.json?resource=198.51.100.0/24" | grep -o '"as_path":"[^"]*"' | sort | uniq -c

步驟 2:BGP 預置只能使用自己的 ASN

最常見的錯誤是預置了別的 ASN(例如上遊或其他網路的 ASN),或者在路徑末尾插入了別的 ASN,導致起源 AS 改變。上遊通常會檢查路徑首個 ASN 必須等於鄰居 ASN,並按您的 as-set 校驗起源;路徑中出現不相關的 ASN 會被視為路由劫持而丟棄。私有 ASN(64512–65534)也常被直接過濾。以下為 BIRD 2 的正確寫法,BIRD 在 eBGP 匯出時會自動再加一次本端 ASN:

# /etc/bird/bird.conf (BIRD 2)
filter export_upstream1 {
  if net = 198.51.100.0/24 then {
    bgp_path.prepend(64500);   # own ASN only
    bgp_path.prepend(64500);
    accept;
  }
  reject;
}

protocol bgp upstream1 {
  local as 64500;
  neighbor 203.0.113.1 as 64496;
  ipv4 {
    import none;
    export filter export_upstream1;
  };
}

birdc configure

步驟 3:在 FRRouting 中正確配置 AS 路徑預置

FRR 通過出方向 route-map 實現預置。修改後使用 soft out 重新傳送公告,不會中斷會話。

vtysh
configure terminal
ip prefix-list MY-NETS seq 10 permit 198.51.100.0/24
route-map UPSTREAM-OUT permit 10
 match ip address prefix-list MY-NETS
 set as-path prepend 64500 64500
exit
route-map UPSTREAM-OUT deny 100
exit
router bgp 64500
 address-family ipv4 unicast
  neighbor 203.0.113.1 route-map UPSTREAM-OUT out
 exit-address-family
end
write memory
clear bgp ipv4 unicast 203.0.113.1 soft out

步驟 4:控制 AS 路徑長度,避免觸發長度限制

不少網路會丟棄 AS 路徑過長的路由,有的還專門限制同一 ASN 連續重複的次數。預置 1–3 次就足以顯著影響選路,超過 5 次幾乎不再帶來收益,反而容易被過濾。另一個常見原因是上遊的 AS 路徑過濾器寫得過嚴,例如只允許正則 ^64500$,預置後的 “64500 64500 64500” 就會被拒絕;此時需要請上遊改為 ^(64500_)+$ 一類的規則。

可以這樣確認實際發出的 AS 路徑長度:

birdc show route 198.51.100.0/24 export upstream1 all | grep BGP.as_path
vtysh -c "show bgp ipv4 unicast 198.51.100.0/24"
許多上遊支援通過 BGP Community 讓其代為預置(只對其特定對等體生效),這比自己預置更精確、更不容易被過濾。具體 Community 值請查閱上遊的公開文件或諮詢上遊。

步驟 5:檢查 IRR 路由物件與 RPKI/ROA

預置本身不改變起源 AS,但如果字首缺少 IRR route 物件、未包含在提交給上遊的 as-set 中,或 ROA 的起源 ASN、最大字首長度不匹配,上遊同樣會拒絕。可以用以下命令檢查:

whois -h whois.radb.net -- '-i origin AS64500'
whois -h whois.ripe.net -- '-T route 198.51.100.0/24'
curl -s "https://stat.ripe.net/data/rpki-validation/data.json?resource=AS64500&prefix=198.51.100.0/24"

RPKI 狀態為 valid 才最穩妥;若為 invalid,請先修正 ROA。修正後,上遊的過濾列表通常需要一段時間自動更新,也可以聯絡上遊手動重新整理。

常見問題

預置後流量沒有變化?

對方網路可能通過 Local Preference 等高於 AS 路徑長度的屬性選路,預置對其無效。此時可嘗試上遊提供的 Community 或調整廣播的字首粒度。

可以預置上遊的 ASN 嗎?

不可以。只能重複自己的 ASN,加入其他 ASN 會破壞路徑真實性,大多數網路會直接丟棄。

IMIDC 能協助配置預置嗎?

在 IMIDC 伺服器上廣播自有或租用的 IP 時,可以通過工單說明需求,技術人員會協助檢查會話、過濾和 IRR/ROA 狀態。

如仍無法解決,可提交工單聯絡 IMIDC 7×24 技術支援。

這篇文章有幫助嗎?

相關教程