跳转至

eBPF

sing-box 1.14.0 中的更改

eBPF 入站仍为实验功能,仅在带有 with_ebpf 编译标签的 Linux 和 Android 构建中可用。

eBPF 入站透明接管选中的本机或下游 TCP/UDP 流量,被接管的连接仍进入 sing-box 常规路由流程。所需的系统网络状态由 sing-box 自动创建并清理。

eBPF 入站不使用监听字段

结构

{
  "type": "ebpf",
  "tag": "ebpf-in",
  "network": ["tcp", "udp"],
  "udp_timeout": "5m",
  "tc_priority": 1,
  "bypass_rule_set": [],
  "local": {
    "enabled": true,
    "data_plane": "cgroup",
    "dns_mode": "respect_policy",
    "ipv6": true,
    "bypass_private_address": true,
    "include_uid": [],
    "include_uid_range": [],
    "exclude_uid": [],
    "exclude_uid_range": [],
    "include_android_user": [],
    "include_package": [],
    "exclude_package": [],
    "bypass_port": [],
    "bypass_port_range": []
  },
  "shared": {
    "enabled": true,
    "data_plane": "packet_rewrite",
    "dns_mode": "respect_policy",
    "interface": ["wlan1"],
    "ipv6": true,
    "bypass_private_address": true,
    "include_source_cidr": [],
    "exclude_source_cidr": [],
    "include_mac_address": [],
    "exclude_mac_address": [],
    "bypass_port": [],
    "bypass_port_range": []
  }
}

字段

network

启用的传输协议,可选 tcp 和/或 udp,默认同时启用。

udp_timeout

UDP 会话超时,默认 5m

tc_priority

TC filter 优先级,范围为 1 至 65535,默认 1。仅在需要与相同接口上的其他 TC filter 协调顺序时修改。 保持默认值时,支持 TCX 的内核会优先使用 TCX link;配置自定义优先级时继续使用 传统 clsact 挂载,以保持数值排序语义。

bypass_rule_set

匹配这些规则集中目标 IP CIDR 的流量绕过此入站,非 IP 规则会被忽略。

local

local.enabled

启用本机产生流量的接管。只要任一路径使用了新的 enabled 字段,另一路径省略 enabled 时即视为 false。至少需要启用一条路径。

默认的 cgroup 数据面接管当前可见 cgroup v2 层级中的 socket,不依赖网络接口。 可选的 TC 数据面跟随系统当前默认网络接口;默认网络变化时会自动切换,没有可用默认 接口时会保留旧 attachment,待新接口准备好后切换。

local.data_plane

选择本机接管的数据面。默认值 cgroup 接管当前可见 cgroup v2 层级中的 socket; 如需在当前默认接口接管流量,应显式配置 tc

local.cgroup_path

data_plane: cgroup 的接管范围限制到指定的绝对 cgroup v2 子树。省略时接管 当前可见的 cgroup v2 根层级及其所有子 cgroup。它不是 sing-box 服务自身 cgroup 的配置项,除非用户确实只希望接管该服务子树。

local.dns_mode

行为
hijack 接管已启用 TCP/UDP 协议的目标端口 53 流量。
respect_policy 先应用本机 UID 与包名选择,再接管目标端口 53。
off 不接管目标端口 53。

默认值为 respect_policy。该设置仅应用于已启用的 TCP/UDP 协议,不识别 DoH 或 DoT 流量。

local.ipv6

启用本机 IPv6 接管,默认 true。禁用后,本机 IPv6 流量绕过此入站。

local.bypass_private_address

绕过私有和特殊用途目标地址,默认 true

local.include_uid

需要接管的 UID。只要配置了 include UID、UID 范围或包名,其他 UID 默认绕过。

local.include_uid_range

需要接管的 UID 范围,格式为 start:end

local.exclude_uid

需要绕过的 UID。exclude 策略优先于 include 策略。

local.exclude_uid_range

需要绕过的 UID 范围,格式为 start:end

local.include_android_user

需要接管的 Android 用户 ID,仅 Android。

local.include_package

需要接管的 Android 包名,仅 Android。

local.exclude_package

需要绕过的 Android 包名,仅 Android。无法区分共用同一 UID 的包。

local.bypass_port

绕过本机接管的目标端口。local tccgroup 两种数据面均支持;启用的 network 协议(TCP 和/或 UDP)分别适用。该选项只匹配目标端口。FakeIP 始终强制 接管。DNS 处理也优先于此设置:hijack 始终接管 53 端口,respect_policy 先应用 UID 策略再处理 DNS,off 已经绕过 DNS。配置 53 端口时 sing-box 会在启动时告警。

local.bypass_port_range

需要绕过的目标端口范围,格式为 start:end,范围包含两端端口。

shared

shared.enabled

启用从配置的下游接口进入流量的接管。

shared.data_plane

行为
socket_assign 将选中的流量直接分配给内部透明监听器。
packet_rewrite 将选中的流量改写到内部 token 地址,并在下游接口恢复回复报文。默认值。

packet_rewrite 要求下游接口使用以太网帧,不使用 socket_assign 所需的策略路由。 两种 shared 数据面均不会创建 local TC 使用的 delivery veth。local 与 shared 数据面 可以独立选择。

shared.dns_mode

取值与 local.dns_mode 相同。respect_policy 模式会先应用来源 CIDR 与 MAC 选择,再接管目标端口 53。

shared.interface

启用 shared 接管时必填

客户端流量进入本机的下游接口。默认的 packet_rewrite 数据面要求接口使用以太网 帧;Ethernet/IPoE、raw-IP(包括 Android rmnet)、PPP/PPPoE 或 IPIP/SIT/GRE 隧道接口应显式配置 socket_assign。也可同时配置多个接口。暂时不存在的接口会在网络更新后重试, 当某个接口成为当前默认上游时,会停止其 shared 接管;该接口重新作为下游后自动 恢复。不接受 loopback。

shared.ipv6

启用 shared IPv6 接管,默认 true。禁用后,shared 接口上的 IPv6 流量绕过此入站。

shared.bypass_private_address

绕过私有和特殊用途目标地址,默认 true

shared.include_source_cidr

需要接管的客户端来源 CIDR。列表非空时,不匹配的来源绕过。

shared.exclude_source_cidr

需要绕过的客户端来源 CIDR。exclude 策略优先于 include 策略。

shared.include_mac_address

需要接管的 48 位客户端来源 MAC 地址。

仅适用于使用以太网帧的 shared 接口。

shared.exclude_mac_address

需要绕过的 48 位客户端来源 MAC 地址。exclude 策略优先于 include 策略。

仅适用于使用以太网帧的 shared 接口。

shared.bypass_port

绕过 shared 接管的目标端口。socket_assignpacket_rewrite 两种 shared 数据面 均支持;启用的 network 协议(TCP 和/或 UDP)分别适用。该选项只匹配目标端口; FakeIP 和 DNS 的优先级与 local.bypass_port 相同,配置 53 端口时会在启动时告警。

shared.bypass_port_range

需要绕过的目标端口范围,格式为 start:end,范围包含两端端口。

Note

shared 模式不会启用 IP 转发,也不提供 NAT、DHCP、IPv6 路由器通告或热点管理。 请在 Android、Linux 或路由器系统中配置这些功能。可以同时配置 Wi-Fi、USB 网络共享等多个下游接口。

限制

  • 一个 sing-box 实例中只能有一个启用 local 接管的 eBPF 入站;其他 eBPF 入站必须 仅启用 shared 接管。
  • 已分片的 IPv4 和 IPv6 数据报绕过接管;IPv6 atomic fragment 作为普通 IPv6 报文处理。
  • 网络变化后会自动恢复接管状态。

在供应商内核或 Android 内核上启用前,请阅读 eBPF 内核要求