Dae 是一种高性能透明代理解决方案,在 Linux 内核中使用 eBPF 实现了代理能力;支持以域名、源 IP、目的 IP、源端口、目的端口、TCP/UDP、IPv4/IPv6、进程名、MAC 地址等对流量进行分流;相对于其他代理方案,如 Clash 等,Dae 的代理规则相对灵活,直连的性能更好(本机进程,作为网关实际效果差距不大)

Dae 的出栈协议支持 HTTPS/VMess/VLESS/Shadowsocks/Trojan/Tuic/Juicity/Hysteria2 等

Dae 和其他的代理软件如 Clash 等相比,在可靠性、稳定性、速度、容灾等方面并没有明显的优势,并且对设备的要求较高,因此并不见得是最佳选择

安装 OpenWrt

因为 dae 是基于 eBPF 实现的,所以需要 OpenWrt 内核支持 eBPF,内核版本需要大于 5.17,并且需要开启 eBPF;OpenWrt 官方提供的镜像未开启 eBPF 支持,需要自行编译,或者使用 ImmortalWRT 构建的镜像

使用 ImmortalWRT 构建镜像

访问 https://firmware-selector.immortalwrt.org/,我是在 x86 机器的 PVE 中使用虚拟机的方式运行 OpenWrt,因此选择 Generic x86/64,其他平台如 arm 等选择对应的平台即可

在 Installed Packages 后面追加 eBPF 和 Dae 相关的包:

kmod-xdp-sockets-diag kmod-veth kmod-sched-core kmod-sched-bpf kmod-nft-bridge dae-geosite dae-geoip dae

软件包的作用如下:

软件名作用
kmod-xdp-sockets-diag提供 XDP 套接字诊断,用于监控与排查基于 XDP 的高性能网络程序
kmod-veth支持成对虚拟以太网设备(veth),常用于容器网络隔离
kmod-sched-core提供 Linux 内核的流量调度核心框架,支撑 QoS 策略
kmod-sched-bpf基于 BPF 的流量调度扩展,支持自定义数据包处理策略
kmod-nft-bridge在桥接接口上集成 nftables 防火墙规则
dae-geosite为 dae 守护进程提供 GeoSite 支持,可按域名或网站分类过滤流量
dae-geoip为 dae 守护进程提供 GeoIP 支持,可按 IP 地理位置过滤或路由流量
dae核心 dae 守护进程,实现后台流量过滤与转发等网络服务

完整的包列表如下:

autocore automount base-files block-mount ca-bundle default-settings-chn dnsmasq-full dropbear fdisk firewall4 fstools grub2-bios-setup i915-firmware-dmc kmod-8139cp kmod-8139too kmod-button-hotplug kmod-e1000e kmod-fs-f2fs kmod-i40e kmod-igb kmod-igbvf kmod-igc kmod-ixgbe kmod-ixgbevf kmod-nf-nathelper kmod-nf-nathelper-extra kmod-nft-offload kmod-pcnet32 kmod-r8101 kmod-r8125 kmod-r8126 kmod-r8168 kmod-tulip kmod-usb-hid kmod-usb-net kmod-usb-net-asix kmod-usb-net-asix-ax88179 kmod-usb-net-rtl8150 kmod-usb-net-rtl8152-vendor kmod-vmxnet3 libc libgcc libustream-openssl logd luci-app-package-manager luci-compat luci-lib-base luci-lib-ipkg luci-light mkf2fs mtd netifd nftables odhcp6c odhcpd-ipv6only opkg partx-utils ppp ppp-mod-pppoe procd-ujail uci uclient-fetch urandom-seed urngd kmod-amazon-ena kmod-amd-xgbe kmod-bnx2 kmod-e1000 kmod-dwmac-intel kmod-forcedeth kmod-fs-vfat kmod-tg3 kmod-drm-i915 kmod-xdp-sockets-diag kmod-veth kmod-sched-core kmod-sched-bpf kmod-nft-bridge dae-geosite dae-geoip dae

OpenWrt 在线构建页面添加 Dae 插件选项

然后选择 REQUEST BUILD 构建镜像;等待构建完成后选择 COMBINED-EFI (EXT4) 下载到本地

在 PVE 中运行 OpenWrt

使用刚才下载的镜像在 PVE 中创建 OpenWrt 的虚拟机并运行,详细参考 OpenWrt 在 PVE 中以虚拟机方式安装

配置 Dae

修改配置文件

登录 OpenWrt 的命令行进行修改,关于 Dae 配置的详细解释可以参考: dae-代理软件的配置

配置文件位置在 /etc/dae/ 路径下,创建 /etc/dae/config.dae 文件,文件内容如下:

  • /etc/dae/config.dae
# 完整配置参考 https://github.com/daeuniverse/dae/blob/main/example.dae
global {
    # 修改日志级别为 debug,方便调试
    log_level: debug
    # lan 口绑定 eth0
    lan_interface: eth0
    # 用强制 SNI 嗅探进行分流
    dial_mode: domain++
}

# DNS 配置
dns {
  # 使用 IPv4 的 DNS,避免部分 node 不支持 IPv6 导致请求失败
  ipversion_prefer: 4
  # 上游 DNS
  upstream {
    # 阿里云 DNS,用于国内域名查询
    alidns: 'udp://223.5.5.5:53'
    # 本地 DNS,用于内网自定义的  DNS 查询
    adguard: 'udp://10.0.0.1:53'
    # Cloudflare DNS,用于非国内的 DNS 查询
    cfdns: 'tcp+udp://1.1.1.1:53'
  }

  # DNS 查询规则
  routing {
    # 根据 DNS 查询,决定使用哪个 DNS 上游,按由上到下的顺序匹配
    request {
      # svc.local 结尾的域名,用本地的 DNS 查询
      qname(suffix: svc.local) -> adguard
      # 对于中国大陆域名使用 alidns,其他使用 cfdns 查询。
      qname(geosite:cn) -> alidns
      # fallback 即默认兜底 DNS
      fallback: cfdns
    }
  }
}

# 如果使用订阅地址,必须是符合 SIP008 格式或者 base64/urlencode 编码或者 txt 格式的节点列表,详细参考: https://blog.hellowood.dev/posts/dae-%E4%BB%A3%E7%90%86%E8%BD%AF%E4%BB%B6%E7%9A%84%E9%85%8D%E7%BD%AE/

# subscription 的节点解析过滤后作为 node,tag 是
subscription {
  sub_airport_1: 'https://订阅地址'
}

# 自己搭建的节点,直接配置到 node 方便调试
node {
    # HTTPS/VMess/VLESS/Shadowsocks/Trojan/Tuic/Juicity/Hysteria2 等格式
    hy2: "hysteria2://user:password@host:443/?insecure=false"
}

# 节点分组
group {
    # 分组一,名称是 proxy,用于 routing 选择
    # 没有过滤条件,使用所有节点
    proxy {
        # 节点选择策略使用 最小移动平均延迟节点
        policy: min_moving_avg
    }

    # AI 分组,用于 claude 等对地区有限制的服务商
    ai {
        # 从 subscription 的 sub_airport_1 中过滤名称包含新加坡的作为这个分组的可用节点
        filter: subtag(sub_airport_1) && name(keyword: '新加坡')
        # 节点选择策略使用 最小移动平均延迟节点
        policy: min_moving_avg
    }
}

# 路由配置
routing {
    # DNS/SSH 等相关进程强制直连
    pname(dnsmasq, dropbear) -> must_direct
    # DNS 地址或域名,强制直连
    dip(8.8.8.8) -> must_direct
    dip(1.1.1.1) -> must_direct
    domain(dns.alidns.com) -> must_direct
    domain(dns.google) -> must_direct
    domain(cloudflare-dns.com) -> must_direct

    # 目标 IP 多播、广播地址,直连
    dip(224.0.0.0/3, 'ff00::/8') -> direct
    # 目标 IP geoip 中的内网地址,直连
    dip(geoip:private) -> direct

    # 目标 IP 中国 IP,直连
    dip(geoip:cn) -> direct
    # 中国域名,直连
    domain(geosite:cn) -> direct

    # 广告域名,拒绝
    domain(geosite:category-ads) -> block

    # AI 域名,AI 分组代理
    domain(suffix: claude.ai) -> ai
    domain(suffix: openai.com) -> ai

    # 未命中上面的规则的走 proxy 代理
    fallback: proxy
}

需要注意,dae 要求配置文件的权限是 640 以下的权限,否则会提示 permissions 0644 for '/etc/dae/config.dae' are too open;通过以下命令修改:

chmod 600 /etc/dae/config.dae
  • 检查配置文件

通过 dae 检查配置文件是否正确,如果没有输出错误信息,表示配置没有问题

/usr/bin/dae validate -c /etc/dae/config.dae

启动 dae

  • 通过 /etc/init.d/dae 脚本启动 dae

允许 dae 自动启动

/etc/init.d/dae enable

然后启动 dae

/etc/init.d/dae start
  • 检查 dae 状态

可以通过 ps 查看 dae 的进程

ps w |grep dae
13609 root     1359m S    /usr/bin/dae run --disable-timestamp -c /etc/dae/config.dae
14819 root      1184 S    grep dae
  • 查看 dae 的日志
tail -f /var/log/dae.log

可以从日志中看到 dae 启动、更新 Node 的信息

level=info msg="Include config files: [/etc/dae/config.dae]"
level=info msg="Waiting for network..."
level=debug msg="CheckNetwork: Get "http://www.gstatic.com/generate_204": context deadline exceeded (Client.Timeout exceeded while awaiting headers)"
level=info msg="Network online."
level=info msg="Fetching subscriptions..."
level=debug msg="ResolveSubscription: https://订阅地址"
level=debug msg="Try to resolve as sip008"
level=debug msg="failed to unmarshal json to sip008"
level=debug msg="Try to resolve as base64"
level=info msg="Loading eBPF programs and maps into the kernel..."
level=info msg="The loading process takes about 120MB free memory, which will be released after loading. Insufficient memory will cause loading failure."
level=info msg="Loaded eBPF programs and maps"
level=info msg="Bind to LAN: eth0"
level=info msg="Group "proxy" node list:"
level=info msg="	hy2"
level=info msg="	剩余流量:322.88 GB"
level=info msg="	套餐到期:长期有效"
level=info msg="	新加坡01aws"
# ...

使用

如果 OpenWrt 作为主路由,则不需要任何设置;如果是作为旁路网关,则需要将设备的网关指向 OpenWrt

  • 修改网络配置

网关地址改为 OpenWrt 的地址,如 10.0.0.254

修改设备网关指向 OpenWrt 地址

  • 修改 DNS 地址

DNS 地址也可以修改为指向 OpenWrt,这样能够保证 dae 正确分流,配置 DNS 不是必须的,但是配置之后效果会更好;如果不配置 DNS,也可以将 dial_mode 设置为 domain++ 进行强制 SNI 嗅探分流

OpenWrt 修改设备网关和 DNS 地址配置界面

  • 查看访问日志

以 claude.ai 为例,配置完成后,访问 claude.ai 地址,检查 OpenWrt 的日志,发现使用 DNS 查询使用了 cloudflare,节点使用了新加坡的节点,outbound 的分组为 ai,嗅探到的域名是 claude.ai,符合预期

tail -f /var/log/dae.log |grep claude
level=info msg="10.0.0.1:61301 <-> 1.1.1.1:53" _qname=claude.ai. dialer=direct dscp=0 mac="00:11:22:33:44:55" network="udp4(DNS)" outbound=direct pid=0 pname= policy=fixed qtype=HTTPS
level=info msg="10.0.0.1:27818 <-> 1.1.1.1:53" _qname=claude.ai. dialer=direct dscp=0 mac="00:11:22:33:44:55" network="udp4(DNS)" outbound=direct pid=0 pname= policy=fixed qtype=A
level=info msg="10.0.0.1:27818 <-> 1.1.1.1:53" _qname=claude.ai. dialer=direct dscp=0 mac="00:11:22:33:44:55" network="udp4(DNS)" outbound=direct pid=0 pname= policy=fixed qtype=AAAA
level=info msg="10.0.0.1:64316 <-> claude.ai:443" dialer="新加坡09aws" dscp=0 ip="10.0.0.2:443" mac="00:11:22:33:44:55" network=tcp4 outbound=ai pid=0 pname= policy=min_moving_avg sniffed=claude.ai
level=info msg="10.0.0.1:64376 <-> claude.ai:443" dialer="新加坡07aws" dscp=0 ip="10.0.0.2:443" mac="00:11:22:33:44:55" network=tcp4 outbound=ai pid=0 pname= policy=min_moving_avg sniffed=claude.ai

优化

需要适当调整 OpenWrt 的配置,如调整 TCP 拥塞控制算法、窗口大小、UDP缓冲区灯

优化内核配置

直接在命令行执行即可

cat > /etc/sysctl.conf << EOF
# User defined entries should be added to this file not to /etc/sysctl.d/* as
# that directory is not backed-up by default and will not survive a reimage

# === TCP 缓冲区优化(高带宽下载推荐)===
net.core.rmem_max = 67108864
net.core.wmem_max = 67108864
net.ipv4.tcp_rmem = 4096 87380 67108864
net.ipv4.tcp_wmem = 4096 65536 67108864

# === TCP Fast Open ===
net.ipv4.tcp_fastopen = 3

# === 连接追踪表优化(代理场景)===
net.netfilter.nf_conntrack_max = 1000000

# === 流量导向(RPS)===
net.core.rps_sock_flow_entries = 128

# === BBR 拥塞控制 + 代理场景核心优化 ===
net.core.default_qdisc = fq_codel
net.ipv4.tcp_congestion_control = bbr

# === 额外 TCP 优化(提升代理连接复用与稳定性)===
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_slow_start_after_idle = 0
net.ipv4.tcp_mtu_probing = 1
net.ipv4.tcp_ecn = 1

# === UDP 缓冲区(Hysteria / WireGuard 等 UDP 代理推荐)===
net.ipv4.udp_mem = 4096 87380 67108864
net.ipv4.udp_rmem_min = 4096
net.ipv4.udp_wmem_min = 4096

# === Conntrack 超时优化(代理长连接专用)===
net.netfilter.nf_conntrack_tcp_timeout_established = 600
net.netfilter.nf_conntrack_tcp_timeout_fin_wait = 30
net.netfilter.nf_conntrack_tcp_timeout_time_wait = 30
EOF

流量导向优化

流量导向优化就是通过软分流将原本挤在单个 CPU 核心上的网络处理压力平均分配给多核并行处理,从而消除千兆带宽或代理场景下的单核瓶颈,显著降低延迟并提升系统吞吐量

在网络-接口-全局网络选项-流量导向(RPS)中启用流量导向,设置为 128;可以适当调大流量导向的值,如 256

启用软件流量卸载

软件卸载(Software Offloading)与 SQM 完全兼容,在千兆以下链路,尤其是需要流量整形避免缓冲膨胀的代理场景是首选

在网络-防火墙-路由/NAT 卸载-流量卸载类型中选择 软件流量卸载

参考文档