Rootless Router (Re:0): VPP Host stack

前篇: Rootless Router (Part 1): wggo-vpp
前情提要: wireguard和vpp終於串在一起了,接下來就是讓BGP Daemon跑起來了。

為什麼是Re:0 呢? 當然是因為進度歸零了。之前弄的東西,今天發現都不能用了,我難過QQ😢


因為主機上是看不到VPP裡面的interface的,所以socket() bind()一定連不到東西。

這時就如一開始預期的,使用VPP Host stack的功能。

VPP會內部維護一個網路堆疊,應用程式設定LD_PRELOAD來攔截程式內的socket(), bind(), sendmsg(), recvmsg(),轉去VPP內部的網路堆疊

理想是美好的...但是經測試這功能根本不是一個可以用的狀態

當初開始前有大致測試一下,python3 -m http.server 然後 wget ,能正常運作,我才放心地開始弄wggo-vpp

結果多測試幾下就不行了

先用普通的 python3 -m http.server 架設一個簡單的web server

我從另一端(普通的linux+wireguard)用 wget 10.127.111.1:8080 來發送請求,第2個請求以後,VPP端的python必定當掉

可以看到第3個wget就沒反應了
這邊看到第二個請求以後,disconnected

VPP 裡面,可以看到API client died

之後我又陸續測試了
frr/bgpd(with no_kernel and no_zebra option)
gobgp
exabgp
沒有一個能變成Established狀態

只有wget/nc 之類的程式有正常運作

哀,我沒想到VPP Host stack的bug這麼多,連python3 -m http.server都沒能正常運作,更別指望exabgp之類要求更高的程式了...

現在又回到最初的狀態,弄一個在userspace運作的網路堆疊,並把bgp daemon+wireguard整合進去了

不知道gVisor和UML哪個比較好。

不過這2個無論哪個,相容性都變差了。

因為他們是用ptrace來達到kernel bypass的效果,然而docker預設不開放這個權限
我的dn42 in heroku計畫就🈚️了😭😭😭

目前我找到的用戶態網路堆疊/kernel bypass的程式列表: https://www.kskb.eu.org/2021/09/userspace.html

只能再看看往哪個弄會比較好了,有甚麼建議的話也歡迎留言

留言