eBPF 在网络栈中的角色
把网络变成"可编程数据平面"
EBPF · NETWORK DATA PLANE eBPF 最重磅的应用领域——网络。可以说,eBPF 能在今天这么火,一半功劳要算在网络场景上。这一节先把一个核心概念讲透:可编程数据平面到底是什么,eBPF 又是怎么把它变成现实的。一、先搞懂两个词:控制平面 vs 数据平面
网络设备里的活儿,向来分两摊:
控制平面决定"怎么走"
负责算路由、下策略、维护转发表。它不亲自搬包,只负责"指挥"——告诉数据平面哪些包该往哪儿送、哪些该丢。相当于交通管制中心,规划路线、发布限行规则。
数据平面负责"实际搬"
真正接触每一个数据包,按控制平面给的规则做转发、过滤、改写。包来了就得立刻处理,慢一拍都不行。相当于路口的红绿灯和分拣工,每辆车经过都得现场动手。
为啥要拆开?因为数据平面要的是"快",控制平面要的是"准"。一个在毫秒级逐包处理,一个慢慢算策略、同步给数据平面。两者节奏不同,自然分而治之。
而 eBPF 最厉害的地方,恰恰是它直接进了数据平面——不是在外围喊口号,而是真的站到流水线边上,对每一个路过的包动手。
二、传统 Linux 网络栈:一条写死的流水线
Linux 的网络栈本质上是一条固定流水线:网卡收到包 → 驱动 → 协议栈 → 路由判断 → socket 分发。每一站该干啥,内核源码里写得明明白白。
问题来了:你想在中间插点自己的逻辑怎么办?比如"凡是访问 3306 端口的包,先记个日志再放行"。传统路子只有两条:
A改内核源码——能干,但得重新编译内核、重启机器,线上谁敢动?而且上游合并不了一定等多久。B写内核模块(KO)——灵活些,但模块跑在内核态,一个 bug 就能整台机器宕机,安全风险极高。至于大家熟悉的 iptables / netfilter,它确实在数据平面上开了钩子,能挂规则。但它设计得偏"通用",规则一多,逐条匹配的开销就上来了,在高吞吐场景下性能顶不住。于是工程师们常常陷入两难:要么改不动,要么改得起但跑不快。
三、eBPF 带来的变化:在流水线上插自己的工位
eBPF 的解法很巧妙:它不重写流水线,而是在流水线的关键位置开了"挂载点"。你写一段 eBPF 小程序,加载进去,它就会在数据包经过那个位置时自动执行——改包、丢包、转发、统计,随你。
打个比方:快递分拣线上,原本每个工位都是厂里焊死的。eBPF 相当于在几个关键工位旁边留了个"临时工位",你随时能放一个自己的质检员上去,看看包、贴个标签、甚至拦下来。质检员(eBPF 程序)不用经过厂长审批(改内核),上岗下岗也不停流水线(不重启)。
而且这个"质检员"不是随便放的闲人——他得先通过验证器的体检(安全检查),保证不会把流水线搞崩,才能上岗。这就是 eBPF 既能灵活、又不出乱子的底气。
关键区别:iptables 是"内核给你一套固定规则语法,你照着填";eBPF 是"内核给你一个挂载点,你写任意逻辑塞进去"。前者是填表,后者是编程——自由度高了一个量级。四、eBPF 在网络栈的关键挂载点
那这些"工位"具体在哪儿?eBPF 在 Linux 网络栈里主要开了这么几个挂载点,按数据包流向从早到晚排列:
XDP网卡驱动层 · 最早能碰包的地方,丢包/转发都快得离谱TC ingress流量控制入口 · 包已进内核,能做更细的分类和改写协议栈 / 路由内核处理 · 传统网络栈核心,决定包往哪走TC egress流量控制出口 · 包要发出前最后一道关卡Socket / cgroup应用层 · 按进程/容器粒度管控,最贴近业务注意这条路径的妙处:越靠前的挂载点,性能越高、能做的事越"粗";越靠后,能拿到的上下文越丰富、能做的事越"细",但开销也越大。比如 XDP 在驱动层,连 socket 信息都没有,但每秒能处理上千万包;到了 socket 层,你能知道是哪个进程在收发,但包已经走了一大段路。
所以选挂载点,本质是在"性能"和"信息丰富度"之间做权衡"。这也是后面几节我们会反复纠结的核心问题。
五、"可编程数据平面"到底香在哪?
把上面这些拼起来,eBPF 给网络带来的"可编程数据平面",核心价值就三条:
| |
|---|
| 程序直接跑在内核里,数据包不用切到用户态再切回来,省掉了大量上下文切换开销。XDP 甚至能在驱动层就把包处理掉。 |
| 随时加载、随时卸载,不用改内核、不用重启。今天想加个负载均衡,明天想加个 DDoS 防护,都是动态挂上去的。 |
| 网络转发、安全策略、流量观测,原本是三套系统,现在用同一套 eBPF 机制就能搞定。Cilium 就是这么把"网络+安全+可观测"揉到一起的。 |
再套回那个快递分拣的比喻:传统方式是"想加质检得停线改造,或者用厂里统一发的固定规则模板";eBPF 是"随时能放自己的质检员,还不耽误分拣速度,连安保和统计都能让同一个质检员顺手干了"。
"不动内核源码,不重启机器,
却能让网络数据平面按你的逻辑跑——
这就是 eBPF 给网络打开的新大门。"