Rootless Router(Part: 0): 用戶態DN42節點
- Rootless Router(Part: 0): 用戶態DN42節點
- Rootless Router(Part: 1): wggo-vpp
- Rootless Router(Re: 0): VPP Host stack
- Rootless Router(Part: 2): BIRD-vpp
- Rootless Router(Part: 3): EtherGuard
- Rootless Router(Extra):蒐集的Userspace 網路棧
- Rootless Router(Part: 4): 被VPP Host Stack衝康
- Rootless Router(Part: 5): 完結
- Rootless Router(Fin): UML版本上線啦!
- Rootless Router(Afterword): Azure App Service真的很靈
起因是網路上有些免費的容器,例如heroku,或是Azure web service之類,給的權限有夠小
沒有tun/tap,沒有wireguard。這些功能都是kernel獨有,但都沒給
但是我想把它變成一台dn42節點!
理論上來說,一個dn42節點,說穿了不過就只是從A收udp wireguard封包,然後弄一弄轉給B而已嗎?,完全不需要root權限
理想中的這隻程式,對外維持許多wireguard udp session,沒別的東西了。
對內則是維護一個network stack,wg解包出來丟進stack,經過BGP daemon+routing以後跑去另一個wireguard。在這之中完全沒有kernel的參與
於是我想,一般的路由功能,全部都大量依賴linux kernel。
frr/bird等常見的bgp daemon,也都是把收到的路由表寫入linux kernel。
難道就不能在userspace實現嗎?
要做到這個目的,必須要實現2點:
1: 用戶態的網路堆疊+路由轉發表
2: 在上面的堆疊裡面運作一個BGP daemon
我查了查,用戶態的網路堆疊還不少。但是第二點才是困難的
眾多現有的程式,有一個吸引了我的注意: fd.io/VPP。
因為linux kernel網卡驅動模型的特性,每個packet都是一個CPU中斷,注定快不起來。所以有人搞了個DPDK,讓網卡封包直接跑去userspace,就不會有那麼多中斷。不過這樣就要有用戶態的封包處理程式。於是就有了fd.io/VPP
不過以上都不是重點,我會看上fd.io/VPP是因為它有個神奇的操作,利用LD_PRELOAD,劫持掉普通應用程式的socket, bind, sendmsg, recvmsg, getsockname, if_nametoindex 等等syscall,讓他改用VPP裡面的網路堆疊
這樣就可以不用打任何patch,直接就能讓任意linux程式加入自己的網路堆疊,而不是用kernel提供的。群友說這個技巧叫做kernel bypass。而這正是我需要的,bypass掉那沒權限的kernel
VPP是為了性能而誕生,但我這裡完全不是為了這個。
VPP的正常用法,是搭配下層搭配DPDK,上層劫持socket api,讓普通讀程式可以連入DPDK網
但是我只是想要他的用戶態網路堆疊的處理能力,再用memif把流量送到wireguard-go。讓這台沒權限的docker裡面的任意app加入dn42網路
群友還有推薦另一個freertr,也是userspace的network stack。
dataplane/controlplane都有。不過缺點就是沒有ld_preload讓其他elf可以不經修改直接加入網路
還有ns3也是我考慮過的,不過缺點一樣是沒有ld_preload可以用。
而且我還看到VPP有router plugin,一度讓我覺得終於要搞定了。但很可惜,問題沒解決
留言
張貼留言