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:tun的部分更簡單
加入ARP Table elif 是Neighbor advertisement: 加入Neighbor Table else: 拔掉L2丟去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強大的功能是甚麼?反正我也不一定用的到,先能動再說
留言
張貼留言