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.dev 和 alive.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 上配置的,初看了下,提不起兴趣,读者可自行试用。
版权申明:
- 未标注来源的内容全部为原创,未经授权请勿转载(因转载后排版往往错乱、内容不可控、无法持续更新等);
- 非营利为目的,演绎本博客任何内容,请以'原文出处'或者'参考链接'等方式给出本站相关网页地址(方便读者)。
相关文章:
- Airflow接管galler-dl下载任务
- 如何使用gallery-dl批量下载图像
- Arch核显下如何愉快玩Dota2和CS2
- Arch/labwc 环境网络相关设置
- Rime添加dota2词库
- Supertuxkart iOS版终于发布了
- 剪切板管理工具clipcat推荐
- 微信小程序开发记
- Rofi试用
- 解决Arch下VSCode无法输入中文的问题