Poema IX 升級之旅
Poema IX 是一個非營利的分部式虛擬 IX,讓散佈在各地的節點透過 L2 overlay 連成一個大二層交換網路,提供 BGP 實驗交流和學習的平台。 一開始,內網用的是 FRR 的 OSPF + VXLAN + EVPN 最內層 VXLAN,中間包一層 GRE,最外面再套 WireGuard。 套 GRE 是為了借用 GRE 的 nopmtudisc 選項啟用切片。內網可以跑 MTU 9000 的 jumbo frame,GRE 層負責切片再送出去。OSPF 跑在 GRE 層上面,用來保證節點之間的可達性 EVPN 則靠 VXLAN 做 MAC 學習和轉發 再來,節點是 NAT 環境,所以外面再套一層 WireGuard,把整個東西變成 UDP,順便加密。 以前為了相容性,IX LAM MTU 9000,靠 GRE 層切片。三層封裝疊起來 overhead 不小,還有切片重組的開銷 現在回頭看,為了一個虛無縹緲的「相容性」犧牲速度,實在不值得 能不能只用一層 VXLAN? 我開始想:能不能把 GRE 和 WireGuard 都拿掉,只用純 VXLAN? 問題是,一般的 VXLAN 要求所有節點都能互相直連。傳統做法是靠上層 OSPF 來保證可達性。但我們的節點散佈在公網上,顯然不可能在公網直接跑 OSPF。 自己跑 OSPF 就又要多一層隧道——GRE 或 WireGuard 層跑 OSPF,VXLAN 層跑 EVPN 所以我在想:能不能 只靠 VXLAN 本身 ,不依賴 OSPF,做到依據 MAC 轉發的效果? 本地測試了一下,發現 只要 bridge 上面的 vxlan port 設了 hairpin,就可以做到轉發 。封包從一個 VXLAN port 進來,bridge 查 FDB,如果目標 MAC 在另一個 VXLAN port 後面,就從那個 port 轉發出去。不需要所有節點全互連,只要 FDB 填對了,中間節點可以幫忙轉發。 但是馬上就碰到一個新問題。 廣播 L2 有一個 L3 沒有的行為: 廣播 。ARP、NDP 的 Neighbor Solicitation、DHCP,這些都是廣播或組播。在傳統 VXLAN + EVPN 環境下,EVPN 知道所有節點的位置,廣播封包直接複製 N 份分發給其他所有人。因為不轉發(h...