Skip to content

L3 重写 eBPF 加速

UA3F 可以通过在出口网卡挂载 TC eBPF 程序来加速 L3 重写。

对于 TTL、IPID 重写等功能,UA3F <= v3.1.0 基于 netfilter NFQUEUE 将流量从内核态劫持到用户态,并在 L3 视角进行重写修改。该路径涉及上下文切换与数据拷贝,性能开销较高。

UA3F 3.2.0 引入 eBPF 加速能力,基于 TC egress 将重写逻辑下沉到内核态,大幅降低包处理开销并提高转发效率。目前 UA3F L3 eBPF 加速要求 Linux 内核版本 >= 5.15

IMPORTANT

eBPF 对 Linux 内核和处理器架构均有要求。常见可用架构包括 x86-64、x86-32、ARM32、ARM64、MIPS 64、RISC-V;不支持 MIPS 32。

配置

yaml
l3-rewrite:
  ttl: true
  ipid: true
  tcpts: true
  tcpwin: true
  bpf-offload: true

开启 l3-rewrite.bpf-offload 后,UA3F 会优先尝试使用 TC eBPF 处理已启用的 L3 重写功能。若初始化失败,可关闭该选项回退到 netfilter/NFQUEUE 路径。

程序选择

UA3F 会根据启用的 L3 功能选择 TC 程序:

功能TC 程序
IPIDset_ip_id_zero
TTLset_ip_ttl
TCP 初始窗口set_tcp_syn_window
TCP 时间戳clear_tcp_syn_ts

挂载行为

UA3F 会选择带 IPv4 默认路由、封装类型为 Ethernet 或 PPP 的出口接口,并跳过 loopback、lobr-lan。它会优先尝试较新内核的 TCX,失败后回退到 classic cls_bpf

如果 TC eBPF 初始化失败,关闭 l3-rewrite.bpf-offload 可回退到 netfilter/NFQUEUE 路径。

性能测试

UA3F L3 重写 eBPF 性能测试使用 netperf 进行。测试开启 L3 重写全部功能选项,并分别测试 TCP_STREAMTCP_RRTCP_CRR

整体优化结果如下:

测试类型整体吞吐/QPSCPU 占用本地时延
TCP_STREAM+4.56%-82.46%-83.23%
TCP_RR+9.22%-77.01%-78.93%
TCP_CRR+1.19%-52.73%-53.75%

相较于 NFQUEUE,eBPF 在三类测试中使整体吞吐平均提升约 5.0%,同时 CPU 使用率平均下降约 70.7%,本地时延平均降低约 72.0%。

TCP_STREAM

指标NFQUEUEeBPF提升幅度
Throughput (Mbps)409.83428.53+4.56%
Local CPU (%)44.877.87-82.46%
Send us/KB35.8736.020-83.23%

TCP_RR

指标NFQUEUEeBPF提升幅度
Transactions/s252.03275.26+9.22%
Local CPU (%)2.740.63-77.01%
Local us/Tr435.56291.781-78.93%

TCP_CRR

指标NFQUEUEeBPF提升幅度
Transactions/s25.2025.50+1.19%
Local CPU (%)0.550.26-52.73%
Local us/Tr879.750406.912-53.75%

Released under the GPL-3.0 license.