Open cody0704 opened 1 year ago
@cody0704 哈喽 cody,这个项目最初始的目标是想实现类似防火墙+dns cache的功能。就像dns_cache_server这个示例,还有这个xpress-dns项目。
但是现在我想把这个项目做成一个教学实验的Lab,因为我发现c+go来应用xdp的教学项目很少(主要是我不太熟悉c)。 我目前正在学习packet03-redirecting, 我的很多示例都是产考这个项目,但是现在我用c+go复现这个小节(packet03-redirecting)没有成功,我正在排查原因。我想要最终实现load balancing的效果。
你有什么想法吗? @cody0704
@Zhouchaowen 我當初有想過 load balancing 方案是透過 xdp_examples - forward_packets 分散到好幾個主機上,然後實現成 DSR Packet Routing 或是 xdp_examples - port_roundrobin 透過 Port 分散到不同的核心上,這邊的構想是有些 software 沒有很好使用到全部的 CPU 然後你可以參考一下這位的專案 xdp-redirect 有比較進階的用法,可以透過 Go 去更改轉送路徑
@Zhouchaowen dns_cache_server 很酷,但是實現在 ebpf 中不會有很多不方便嗎? 有考慮過讓 ebpf 實現 firewall 和 AF_XDP Socket 來繞過 Linux networking stack 就好嗎? 之後應用邏輯的部分還是在 Application layer 處理, ebpf 專心處理 network layer 的東西
ebpf 在 network 相關的優點是避開 linux networking stack,來達到網路的高效能 xpress-dns 也提到避開 Linux networking stack 來達到高速,至於避開之後在 application 處理或是在 ebpf 中處理的效果好壞,我覺得可以 stress test 看看,我覺得差異應該不會到十分大
如果沒有太大,會考慮 ebpf firewall + AF_XDP 的方案嗎? 這樣 Go 好像才有點作用 :D
@cody0704 哦,我还不太了解AF_XDP,我以为只能在ebpf处理dns相关的cache。如果通过AF_XDP可以将dns的数据包转移到Application layer中的话,那就可以做许多事情了。非常感谢你告诉我这些,我将去实践一下😄。
@cody0704 哈喽,cody。我产考了你的recv_udp重新实现了parse_udp_dns。在实现后我有一个疑问:通过AF_XDP把数据包发送到用户态后,还可以通过什么方式把这份数据包交给应用程序处理吗?(列如:Coredns) 在这个实例中dns_cache_server我会将没有匹配到cache的数据直接XDP_PASS交给应用程序自己处理。我想在AF_XDP也实现这样的逻辑,但是现在我没有任何思路,你有什么建议吗?😄
@Zhouchaowen
基本上你原本的作法是將 cache 的功能寫到 XDP 中,剩下原本的 Packet 還是走 Linux Network Stack 後,回到原本的應用 (例如: Coredns)。 更改成 AF_XDP 後,所有的 Packet 都會繞過 Linux Network Stack 然後進入應用程序(暫時稱呼: AF_XDP_APP),但你希望辨識完之後發現如果 cache 不存在,希望可以回到 Coredns 處理,不曉得我的理解有沒有錯誤。
Packet 透過 AF_XDP 進入到應用層之後,你將該 Packet 進行 cache 確認,發現沒有 match 後,我目前我已知的作法如下
AF_XDP_APP
,這樣一來所有 Packet 都會繞過 Linux Network StackAF_XDP_APP
進行封包轉送 (udp localhost、unix socket) 至 coredns 然後將結果再回到 AF_XDP_APP
,AF_XDP_APP
再回應給 Client目前我只有想到這兩種方案,如果你有思考到更好的方法,也希望你可以告訴我
你這邊對於使用 XDP 有沒有想要達到的目的? 還是單純現階段學習?
如果你有一些想法,我們可以一起做