【零信任安全架构】微分段深度拆解:从 VLAN 到 eBPF 的访问控制演化
微分段是零信任在网络层的核心机制——从传统 VLAN 的广播域隔离,到 Kubernetes NetworkPolicy 的 IP 级别过滤,再到 Cilium 基于身份的 eBPF 执行和 Istio 的 L7 策略。本文拆解四层微分段技术的实现原理、性能差异和适用场景,以及从'全通'到'全白名单'的策略制定流程。
发布来自土法炼钢兴趣小组的知识、笔记、进展和应用。主题包括数据结构和算法、编程语言、网络安全、密码学等。
共 44 篇文章 · 返回首页
微分段是零信任在网络层的核心机制——从传统 VLAN 的广播域隔离,到 Kubernetes NetworkPolicy 的 IP 级别过滤,再到 Cilium 基于身份的 eBPF 执行和 Istio 的 L7 策略。本文拆解四层微分段技术的实现原理、性能差异和适用场景,以及从'全通'到'全白名单'的策略制定流程。
从 eBPF 虚拟机的 11 个 64-bit 寄存器和 struct bpf_insn 出发,逐条拆解 ALU64/ALU32、跳转、加载存储、call 四类指令的字段语义与编码格式,建立后续 verifier 和 JIT 讨论的精确基础。
跟踪 BPF_PROG_LOAD 系统调用的内核执行路径,逐层拆解 bpf_prog_load()→bpf_check()→do_check_main() 的调用链,建立 verifier 执行全景——这是理解 verifier 安全保证的入口。
深入 verifier 的静态分析引擎——寄存器状态 reg_state 的类型/值域表示、栈状态 stack_state 的初始化标记、explore_state 的 DFS 搜索、states_equal 的等价判定、precision tracking——这是整个系列最难也最核心的一篇。
把 02-03 的理论落地为可操作的编程指南——unbounded memory access、variable-length read、pointer arithmetic on scalar、循环上界推断失败、helper 参数类型不匹配等 18 种常见 verifier 错误的根因分析、最小复现与正确写法。
从 bpf_jit_compile() 入口出发,拆解 BPF 字节码到 x86-64/ARM64 本地指令的翻译过程——寄存器映射策略、ALU 指令的 one-to-one/many-to-one 翻译、尾调用与 call 的本地实现、JIT 镜像的 kallsyms 集成,以及 JIT 与 interpreter 的性能边界。
从 bpf_map_ops 虚函数表出发,逐层拆解 BPF_MAP_TYPE_HASH、BPF_MAP_TYPE_ARRAY、per-CPU 变体的内核实现——htab 的 bucket 链表与 prealloc、bpf_array 的零拷贝共享、per-CPU 分配器的无锁语义。
拆解性能关键的 ring buffer(mmap 双缓冲与 record 提交语义)、perf event array(perf_event_output 路径)、bloom filter(N_HASH 位图)、queue/stack(链式辅助结构)、LPM trie(前缀树),以及 devmap/cpumap 等重定向 map。
从 bpf_func_proto 结构体出发,讲解 helper 函数的注册机制(BPF_CALL_n 宏链)、参数类型编码(ARG_PTR_TO_MAP_KEY 等枚举)、返回值策略,以及 verifier 在 check_helper_call() 中对每个参数的类型与边界检查。
完整跟踪一个 BPF 程序从加载到销毁的全生命周期——aux->refcnt 引用计数模型、BPF_PROG_LOAD 验证与 JIT 之后发生了什么、各种 attach 类型的差异、bpffs 持久化与 FD 泄露的坑。
深入 libbpf 的加载生命周期:bpf_object__open() 的 ELF 解析、bpf_object__load() 的程序批量加载与 map 创建、map pinning 与跨进程复用、skeleton 自动生成器、SEC() 注解解析、auto-attach 的链路跟踪、ring_buffer__new() 的 mmap 消费者模式。
从 BTF 的二进制编码格式(btf_header + type entries + string table)出发,讲清 BTF 如何编码基本类型、结构体、联合体、函数原型与 typedef——BTF.ext 节的 func_info/line_info 记录,以及内核 pahole 的 BTF 生成与去重算法 btf_dedup。
从 clang 内置函数 __builtin_preserve_access_index 出发,追踪 BPF_CORE_READ 等宏如何生成 BTF.ext CO-RE 重定位记录,再到 libbpf 加载时 bpf_core_apply_relo() 根据目标内核 BTF 计算正确字段偏移量并修补 BPF 指令——可移植 BPF 的核心引擎。
从 clang -target bpf 的 LLVM BPF 后端出发,讲清 BPF 目标文件 .o 的 ELF section 布局约定、DWARF 到 BTF 的转换管线、bpftool gen 的工具链集成,以及 BPF 特有的 inline asm 语法。
从 verifier log 的级别控制(log_level 1/2/自选寄存器)出发,覆盖 bpftool prog dump xlated/jited 的反汇编、bpftool map dump 运行时检查、bpftool btf 类型查阅、BPF selftests 结构与编写,以及生产环境下的 BPF 排障方法论。
fentry/fexit 通过 BPF 蹦床机制在目标函数的 nop 位置直接替换为 call 指令进入 BPF,避免了 kprobe 的 int3 中断开销。本文拆解 bpf_trampoline 内核实现、arch_prepare_bpf_trampoline 的架构相关栈帧构造、struct_ops 与蹦床的协作——以及蹦床在什么条件下开销并不为零。
BPF 程序在内核上下文中并发执行——同一程序可能在多个 CPU 同时运行。本文讲清 BPF 环境下的内存模型(BPF_ATOMIC 指令的语义)、bpf_spin_lock 的实现限制、RCU 保护的 map 读取、per-CPU map 的免锁读写,以及中断上下文与进程上下文的执行语义差异。
BPF 程序在内核态执行——安全不只是 verifier 的事。本文讲清 CAP_BPF 与 CAP_SYS_ADMIN 的权限梯度、unprivileged BPF 的历史沿革与现状、Spectre v2 的 bpf_jit_harden 缓解(常数盲化与 retpoline)、Spectre v4 的 speculation_barrier、以及 BPF_LSM 的安全策略可编程性。
从 struct sched_ext_ops 的 10+ 回调语义出发,拆解 select_cpu/enqueue/dispatch/tick 等核心回调、scx_bpf_dispatch/scx_bpf_kick_cpu 等 kfunc 的内核实现、ext 调度类与 CFS/EEVDF 的共存策略(SCX_OPS_SWITCH_PARTIAL),以及 scx_layered 和 scx_rustland 的用户态调度器参考实现。
eBPF 不只是 Linux 的技术——Windows eBPF (ebpf-for-windows) 如何把 BPF 字节码挂载到 Windows 内核的 NetBufferList 和 System Call、ubpf 的用户态 VM 实现(JIT 与解释器双模)、rbpf 的 Rust 生态、以及 IETF BPF ISA 标准化草案的进展。
把 01--17 的知识串成一条实践线——从 libbpf skeleton 写第一个 BPF 程序、加载到内核、用 ring buffer 回传事件、用 CO-RE 实现跨内核版本兼容、map pinning 实现热升级、配上半自动化的 verifier 错误排障流程——构建一个麻雀虽小五脏俱全的 eBPF 可观测 Agent。
回顾 eBPF 从 Linux 3.18 到 6.x 十年演进的关键节点,梳理 BPF 维护者的开发节奏与合并策略、eBPF Foundation 的标准化工作、kfunc 与 dynptr 的能力扩展方向、以及 eBPF 与内核模块、DPDK、Wasm 的技术竞争格局。
eBPF 内核虚拟机内部实现系统讲解:BPF 指令集与寄存器机器、验证器的抽象解释与状态裁剪、JIT 编译器后端、Map 各类型的并发与内存模型、helper 函数注册与类型检查、BTF 格式规范与 CO-RE 重定位引擎、libbpf 加载器工程、fentry/fexit 蹦床机制、sched_ext 调度器内核接口。面向想读懂 eBPF 内核源码、写生产级 BPF 程序的系统工程师。
当用户态观测工具无法定位问题时,深入 Linux 内核追踪层。拆解 ftrace、kprobe、uprobe、tracepoint、bpftrace 的适用场景、生产安全边界和实战案例。
从 Metrics、Logs、Traces 到 Profiling、eBPF、OpenTelemetry 与 SLO 治理,面向中国工程团队的可观测性系统化手册。全 25 篇。
从 L3/L4/L7 三层观测视角出发,讲 eBPF socket filter / tc / XDP 数据采集与 Cilium Hubble 流日志、Tetragon 安全可观测、Pixie 协议自动解析、DeepFlow 架构;展开 bpftrace + kfree_skb_reason 的内核丢包定位、TLS 解密、HTTP/2 解析与服务拓扑自动发现。
深入剖析持续性能分析(Continuous Profiling)的原理、架构与落地实践,覆盖 Parca、Pyroscope、Grafana Beyla 三大主流方案,包含 eBPF 采样、符号解析、火焰图、差异分析以及字节跳动、美团的生产案例与工程坑点。
汇总本站 Linux 内核工程相关文章,覆盖 eBPF、bpftrace、Cilium、io_uring 协同以及内存分配器实践。
从 CPU/heap/goroutine/lock/off-CPU 等 Profiling 种类出发,比较采样与插桩两类 profiler 的工作原理,深入 Go pprof、Java async-profiler/JFR、Python py-spy、Pyroscope、Parca eBPF Profiling,以及 OpenTelemetry Profiles 的最新进展,给出国内字节美团的真实落地经验与工程坑点。
eBPF 如何实现零侵入、内核级、低开销的可观测性:从 kprobe/uprobe/tracepoint/fentry 钩子机制,到 bcc 工具集、bpftrace 脚本语言、libbpf+CO-RE 可移植编程,再到 Pixie、DeepFlow、Grafana Beyla 等商业化工具,结合内核版本兼容性与生产部署实战。
从 sk_buff 到 XDP,从收包路径到 TC 框架——系统拆解 Linux 内核网络子系统的每一个核心模块。基于 Linux 6.6 LTS 源码,配合 bpftrace/perf 实测追踪。
BPF 为什么能成为 Linux 的第二用户态?verifier、JIT、map 家族、BTF、CO-RE、BPF_LSM、sched_ext——本文讲 eBPF 的内核侧机制。
eBPF 正在重新定义网络工程——从传统的 iptables/netfilter 规则堆砌,到可编程、可观测、高性能的网络数据平面。本文系统讲解 eBPF 网络程序类型(XDP/TC/Socket)、Map 数据结构、Cilium 的 eBPF 数据平面实现,以及 eBPF 在负载均衡、可观测性和网络安全中的工程实践。
XDP 在内核网络栈最早期处理数据包,兼顾 DPDK 级性能与内核生态兼容性。本文从 XDP 的三种执行模式、程序编写实战、AF_XDP 的零拷贝路径到 Facebook Katran L4 负载均衡器的 XDP 实现,系统讲解 eBPF 驱动的高性能包处理。
系统讲解 eBPF 在网络诊断中的工程应用:bcc 工具集(tcplife/tcpretrans/tcpdrop)的使用场景、bpftrace 自定义网络探针编写、XDP 丢包分析、内核协议栈延迟追踪,建立基于 eBPF 的系统化网络诊断方法。
容器网络为什么比裸机慢?veth + bridge 每个包经过两次 netfilter,macvlan 跳过了 bridge,Cilium 用 eBPF 替掉了 iptables。到底慢多少?我们用 iperf3、wrk 和自定义 echo server 实测。
eBPF 让你在内核里插代码而不用写内核模块。听起来很美,但验证器的限制、Map 的性能陷阱、BTF 的兼容性噩梦,这些他们不会在教程里告诉你。
你的 P99 延迟突然飙到 500ms,但平均值只有 3ms。日志里什么都没有,Prometheus 图表一片祥和。bpftrace 一行命令,30 秒定位问题。这篇文章告诉你怎么做到的。
5000 个 Service、十万条 iptables 规则、一次更新锁五秒——这就是 kube-proxy 的现实。Cilium 用 eBPF Map 的 O(1) 查找干掉了整条 KUBE-SERVICES 链,顺便把 sidecar 也一起埋了。
eBPF 在内核里做决策,io_uring 在内核里做 I/O。当这两个东西连起来,你的数据包从网卡到应用可以完全不经过传统协议栈。
你有火焰图,但它只能告诉你 CPU 在忙什么——CPU 不忙的时候呢?从 perf 到 Parca,Linux 性能分析工具链走过了 15 年,是时候搞清楚每个工具的真正定位了。
Seccomp 只能说 yes or no,但攻击者早就学会了在 yes 里面做文章。是时候让 eBPF 接管安全审计了。
当 DDoS 洪水来袭,iptables 在协议栈里挣扎,而 XDP 在网卡驱动层就把垃圾包丢了。不进协议栈、不分配 skb、不走 netfilter——这才是丢包该有的样子。
从 eBPF 基础到 XDP 防火墙、安全监控、容器网络、性能分析——eBPF 在现代 Linux 的完整应用图谱。