在我们之前的博客中,我们谈到了我们为eBPF for Windows 项目取得的进展。我们的一个关键目标是与开发人员会面。因此,使为 Linux 编写的 eBPF 程序能够在 eBPF for Windows 平台上运行对我们来说非常重要。在本次更新中,我们想谈谈使用基本上为 Linux 编写的应用程序的学习和观察。
自然地,该应用程序是在 Linux 上开发的,我们很快发现用户模式应用程序使用特定于 Linux 的诸如 netlink 之类的库。因此,我们决定编写一个受 Cilium 代理启发的用户模式应用程序,该应用程序将 Windows SDK 用于一些网络 API,并使用适用于 Windows 平台的 eBPF 来驱动 eBPF 程序。
下表显示了为此目的我们需要添加的钩子和助手,其中带有星号 (*) 的条目被发现是可选的或我们解决的问题。例如,bpf_fib_lookup() 是一个帮助器,我们知道它会提供基于下一跳的信息来发送数据包。对于演示,我们使用来自 Windows SDK 的现有 API 来获取第 2 层数据并将其填充到地图中以供 eBPF 程序使用。
类别
Linux API
通用助手
bpf_map_lookup/update/delete_elem
bpf_tail_call
bpf_get_prandom_u32
bpf_get_smp_processor_id
bpf_csum_diff
bpf_fib_lookup*
bpf_ktime_get_ns
XDP 助手
bpf_xdp_adjust_meta*
bpf_xdp_adjust_tail*
XDP 动作
XDP_TX(发夹)
Map
我们增强了对以下列表中其他类型地图的支持:
类别
Linux API
Map types
bpf_map_type_hash
bpf_map_type_percpu_array
bpf_map_type_percpu_hash
bpf_map_type_prog_array
bpf_map_type_hash_of_maps
bpf_map_type_lru_hash
bpf_map_type_lpm_trie
bpf_map_type_perf_event_array*
验证器功能增强
正如我们取得进展一样,我们开始在 Cilium L4LB 代码上运行 PREVAIL 验证程序时遇到验证失败。深入挖掘,我们注意到 Cilium L4LB 程序嵌入了 Linux 特定的程序集,而不是从 C 编译,并且该程序集显然是由于需要 Linux 内核验证器工件的变通方法。该程序集未能通过 PREVAIL 验证程序验证,但原始 C 代码很好,因此我们回到使用 C 而不是程序集来处理此类代码路径。
客户端向VIP地址40.1.1.1发起源地址为20.1.1.100的web请求。在 SNAT 模式下,负载均衡器在入站和出站方向都转换 IP 标头。使用连接跟踪器映射跟踪连接状态。
图 4:DSR 模式截图
在 DSR 模式下,负载均衡器将传入请求封装在外部 IP 标头中,并将其发送到选定的后端 VM。因此,后端 VM 必须解封装外部 IP 标头并将其提供给 Web 服务器。我们选择了两个后端虚拟机来运行 Windows 和两个虚拟机来运行 Linux。对于 Windows 后端,我们使用 XDP 程序来处理解封装,而 Linux VM 使用基于 TC 的程序。
转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
译文 | 让基于 Linux 的 eBPF 程序与 eBPF for Windows 一起运行https://cn-sec.com/archives/804781.html
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.
评论