Rootless Router(Part: 1): wggo-vpp
RootlessRouter系列:
- 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真的很靈
也就是memif+tap2tun的部分
tap2tun的部分邏輯很簡單,如下
tap部分邏輯
收到一個封包
if 是ARP request:
回復一個ARP response
加入ARP Table
elif 是Neighbor solicitation :
回覆一個Neighbor advertisement
加入Neighbor Table
elif 是ARP reply:
加入ARP Table
elif 是Neighbor advertisement:
加入Neighbor Table
else:
拔掉L2丟去tun對面
tun的部分更簡單
收到一個封包
去ARP/Neighbor Table查表
if 查表成功:
目標Mac=查表結果
elif 需要查表(預先定義了一個要查表的範圍,通常是設定成l2內網範圍):
發送一個ARP request/Neighbor solicitation到tap端
丟棄該封包,返回
else:
目標Mac=Gateway Mac Address
補上l2包頭,發送到tap端
幾經波折,終於完成第一部分。把wireguard-go的tun的 CreateTun/Read/Write 改掉,變成用libmemif+vpp-api和vpp互動
成功在vpp裡面ping通對端電腦
對端電腦也成功收到來自vpp的封包
完成了第一部分,至於心得嘛...
govpp根本不是一個可以正常用的package,還得幫他們debug。想用的建議直接改用C++,詳情請看issue 20~22
雖然都是一些小修正,但是又不是很少用的功能出錯。而是example裡面提供的程式碼,也就是最基礎的功能都無法正常運作! 讓人不禁想抱怨一下
有興趣的人可以去這邊下載,原始碼: https://github.com/KusakabeSi/wireguard-go-vpp
至於第2部分,bgp daemon了。目前也沒有任何一個bgp daemon直接支援vpp的
現在想到2個做法
1: 弄一個程式解析Zebra Protocol,然後把路由資訊vpp-api丟給VPP
- 優點
- : FRRouting/Quagga是十分強大的routing daemon,他們都用Zebra Protocol。這部分就不重複造輪子。未來想搞babel/ospf都能直接用,也能用上各種強大的FRRouting的功能
- 缺點
- Zebra Protocol有110個。我肯定是不想全部實現。頂多ZEBRA_IP_PREFIX_ROUTE_ADD/DEL這2個,再弄到讓FRRouting能動
- 要實現上面這點,肯定又是各種FRRouting的程式碼閱讀了... 這麼個大東西實在不想讀
- Zebra Protocol有110個就算了,重點是還找不到他們的文檔! 我找到的這個list只有函數名,定義作用返回值通通沒有。看到這個我直接放棄,下一位
2: exabgp ,收到的路由用 python3-vpp-api 丟給VPP
- 優點: 程式小,又是python寫的,易讀易debug
- 缺點: FRRouting裡面的各種強大功能(ROA/RPKI)肯定是要用python重新實現了
最後因為方法1有3個缺點,所以我決定用方法2了。FRRouting強大的功能是甚麼?反正我也不一定用的到,先能動再說





留言
張貼留言