Arch linux dae 透明代理

最近在查一些资料的时候,发现了个叫 dae 的透明代理,中文名叫大鹅(或者吃鹅?),相比 sing-box、v2ray 等来说是基于 Linux eBPF 的。

所谓 eBPF(extended Berkeley Packet Filter)是一种强大的内核技术,最初源于 BSD 系统中的 BPF(Berkeley Packet Filter),用于高效地过滤网络数据包。在 Linux 中,eBPF 已经演变为一种通用的、安全的、高性能的内核可编程机制,允许用户在不修改内核源码、无需加载内核模块(如 LKM)的情况下,在内核中运行沙箱化的程序。在可观测性、网络、安全、性能优化等领域有应用,一些求职招聘要求上也瞄到过,没想到都卷到透明代理上去了,理论上会比纯用户态代理性能好。

本来这个东西合适部署到路由器或者树莓派等设备上,供其它设备使用,但是 dae 对内核版本有要求,且 arm 设备还要额外编译内核,我的 sing-box 在树莓派上稳定跑好几年了,实在懒得折腾。

所以,只能在 Arch linux 主机上体验安装了,过程如下:

1. 安装

1paru -S daed

查看包信息,依赖如下:

1➜  ~ paru -Qi dae | grep Depends
2Depends On      : glibc  v2ray-geoip  v2ray-domain-list-community

v2ray 大概是为其提供 geoip 等分流数据(下面的软链接中可看出)

1➜  ~ ls -al /usr/share/dae/geoip.dat
2lrwxrwxrwx 1 root root 26 Dec 28 14:36 /usr/share/dae/geoip.dat -> /usr/share/v2ray/geoip.dat

2. 配置

我个人体验下来,这个配置逻辑和 sing-box 对比起来,真是清晰简单多了。sing-box 的配置动不动就冒出不兼容变动,一更新就跑不起来了。

dae 官方文档也有些示例,基本很少配置就能搞定分流规则,这点来说值得点赞👍

我的配置如下(hysteria2 部分脱敏处理了):

 1➜  ~ sudo cat /etc/dae/config.dae
 2global {
 3    # lan_interface: auto
 4    wan_interface: auto
 5    log_level: info
 6    auto_config_kernel_parameter: true
 7    allow_insecure: true
 8    bandwidth_max_tx: '20 m' # uplink, or '200 m' or '200 mb' or '200 mbps' or 25000000(which is 200/8*1000*1000)
 9    bandwidth_max_rx: '100 m'
10}
11
12node {
13    hy2: "hysteria2://password@host:port/?sni=your_name"
14}
15
16dns {
17    upstream {
18        alidns: "udp://dns.alidns.com:53"
19        googledns: "tcp+udp://dns.google:53"
20    }
21    routing {
22        request {
23            fallback: alidns
24        }
25        response {
26      	    upstream(googledns) -> accept
27            ip(geoip:private) && !qname(geosite:cn) -> googledns
28            fallback: accept
29        }
30    }
31}
32
33group {
34    proxy_group {
35        filter: name(hy2)
36        policy: random
37    }
38}
39
40routing {
41
42    pname(NetworkManager) -> direct
43    pname("dnsmasq") -> direct
44
45    #game
46    pname("Counter-Strike") -> direct
47
48    dip("127.0.0.0/8") -> direct
49
50    dip("::1/128") -> direct
51
52    dip(224.0.0.0/3, 'ff00::/8') -> direct
53
54    dip(geoip:private) -> direct
55
56    dip(geoip:cn) -> direct
57    domain(geosite:cn) -> direct
58
59    fallback: proxy_group
60}

大概意思是:

  • global 中设置一些全局配置
  • node 中配置真实的后端代理,比如我这里写的 hysteria2,每个代理能自定义一个名字(比如我这里叫 hy2)
  • group 给代理分组归类,方便分流
  • dns 这个是 dns 相关配置,上面示例的意思是,返回了私有 IP 且非中国域名,重新用 googledns 查询该域名,默认 alidns
  • routing 此部分最核心,分流规则。pname 匹配进程名,dip 匹配 ip 地址,domain 匹配域名,direct意思就是不走后端代理直连,fallabck 规则都没命中就走代理。这样应该就能很容易理解上面的分流规则了,可以根据自己的理解编写规则。

如何检查配置错误?dae 自带核查命令,如下所示:

1sudo dae validate -c /etc/dae/config.dae

没报错的话就说明配置合规。

如何知道某个请求走了代理?我个人是通过日志判断的。

日志级别 log_level: info 设置为 info 以上,通过命令过滤查看

1➜  ~ sudo journalctl -u dae -f |grep hy2
2Jan 03 19:04:58 minipc dae[199596]: level=info msg="192.168.124.5:39926 <-> api.zed.dev:443" dialer=hy2 dscp=0 ip="104.20.29.242:443" mac="e4:c7:67:3f:6a:06" network=tcp4 outbound="proxy_group" pid=0 pname=zed-editor policy=random sniffed=api.zed.dev
3Jan 03 19:06:07 minipc dae[199596]: level=info msg="192.168.124.5:52356 <-> alive.github.com:443" dialer=hy2 dscp=0 ip="140.82.112.26:443" mac="e4:c7:67:3f:6a:06" network=tcp4 outbound="proxy_group" pid=0 pname=firefox policy=random sniffed=alive.github.com

比如上面日志输出中可看出 api.zed.devalive.github.com 是走了代理 hy2 的 dialer=hy2, 如果是 dialer=direct 即表示直连。

3. 启动和查看信息

设置开机启动

1sudo systemctl enable dae.service

启动

1sudo systemctl start dae.service

顺利启动没报错的话,可看出多了一个虚拟网卡 dae0@if15, 脱敏处理,其它网卡信息我手动删除了。

 1➜  ~ ip a
 21: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
 3    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
 4    inet 127.0.0.1/8 scope host lo
 5       valid_lft forever preferred_lft forever
 6    inet6 ::1/128 scope host noprefixroute
 7       valid_lft forever preferred_lft forever
 8
 916: dae0@if15: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
10    link/ether be:62:be:53:a7:f6 brd ff:ff:ff:ff:ff:ff link-netns daens
11    inet6 fe80::ecee:eeff:feee:eeee/128 scope link
12       valid_lft forever preferred_lft forever
13    inet6 fe80::b02d:10ff:fea8:77b2/64 scope link proto kernel_ll
14       valid_lft forever preferred_lft forever

查看进程

1➜  ~ ps -ef |grep config.dae
2root      199596       1  0 18:19 ?        00:00:06 /usr/bin/dae run --disable-timestamp -c /etc/dae/config.dae

也可用 lsof 命令看看打开了哪些文件,便于推断有什么依赖,这里就不贴示例了。

还可以通过 bpftool 命令查看更具体的信息。

 1➜  ~ sudo bpftool prog show | grep -A3 -B3 dae
 2	loaded_at 2026-01-03T18:19:08+0800  uid 0
 3	xlated 976B  jited 527B  memlock 4096B  map_ids 22,105
 4	btf_id 330
 5	pids dae(199596)
 6192: sk_msg  name sk_msg_fast_redirect  tag 61fe221e8612c076  gpl
 7	loaded_at 2026-01-03T18:19:08+0800  uid 0
 8	xlated 528B  jited 328B  memlock 4096B  map_ids 105
 9	btf_id 331
10	pids dae(199596)
11193: sched_cls  name tproxy_dae0_ingress  tag 8e50bed694efcc1a  gpl
12	loaded_at 2026-01-03T18:19:08+0800  uid 0
13	xlated 600B  jited 344B  memlock 4096B  map_ids 106
14	btf_id 333
15	pids dae(199596)
16......

实际体验,启动 dae 比 sing-box 要慢。

4. 测试效果

使用 curl 命令测试访问 google 和 百度,都访问正常。

1➜  ~ curl google.com
2<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
3<TITLE>301 Moved</TITLE></HEAD><BODY>
4<H1>301 Moved</H1>
5The document has moved
6<A HREF="http://www.google.com/">here</A>.
7</BODY></HTML>
8➜  ~ curl baidu.com
9<a href="http://www.baidu.com/">Moved Permanently</a>.

查看日志,可看出是否分流正确。

1➜  ~ sudo journalctl -u dae -f
2Jan 03 19:27:15 minipc dae[199596]: level=info msg="192.168.124.5:44187 <-> 223.5.5.5:53" _qname=google.com. dialer=direct dscp=0 mac="e4:c7:67:3f:6a:06" network="udp4(DNS)" outbound=direct pid=849 pname=dnsmasq policy=fixed qtype=AAAA
3Jan 03 19:27:15 minipc dae[199596]: level=info msg="192.168.124.5:52111 <-> 223.5.5.5:53" _qname=google.com. dialer=direct dscp=0 mac="e4:c7:67:3f:6a:06" network="udp4(DNS)" outbound=direct pid=849 pname=dnsmasq policy=fixed qtype=A
4Jan 03 19:27:15 minipc dae[199596]: level=info msg="192.168.124.5:54620 <-> google.com:80" dialer=hy2 dscp=0 ip="142.251.33.78:80" mac="e4:c7:67:3f:6a:06" network=tcp4 outbound="proxy_group" pid=0 pname=curl policy=random sniffed=google.com
5Jan 03 19:28:14 minipc dae[199596]: level=info msg="192.168.124.5:59191 <-> 223.5.5.5:53" _qname=baidu.com. dialer=direct dscp=0 mac="e4:c7:67:3f:6a:06" network="udp4(DNS)" outbound=direct pid=849 pname=dnsmasq policy=fixed qtype=AAAA
6Jan 03 19:28:14 minipc dae[199596]: level=info msg="192.168.124.5:36765 <-> 223.5.5.5:53" _qname=baidu.com. dialer=direct dscp=0 mac="e4:c7:67:3f:6a:06" network="udp4(DNS)" outbound=direct pid=849 pname=dnsmasq policy=fixed qtype=A

可看出 dns 查询都是 alidns,一个走代理,一个是直连。

全局透明代理,相比我之前的 firefox 浏览器设置 proxy.pac 等还是要方便些。因为很多软件是不支持或者你自己不想设置代理的,比如 paru 设置代理就比较麻烦,下载外网的软件包就会非常慢;steam 这种打游戏的,肯定不希望默认路由到外国。如果不玩游戏只查看 steam 游戏商店时,开启代理优势明显,访问速度非常快,原因你懂的。

要说速度,我感觉比 sing-box 快一点,也有可能是错觉,sing-box 也满足需求,多一个选择也挺好。

如果有一天,不用做这些分流动作,那场面简直不敢想象,人终要面对现实,现状是必须学习代理技术。

此外 dae 还有个 web 界面的版本,方便人在 web 上配置的,初看了下,提不起兴趣,读者可自行试用。

最后修改于: Saturday, January 3, 2026
欢迎关注微信公众号,留言交流;也欢迎使用微信小程序。

相关文章:

翻译: