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

相關文章:

翻譯: