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無法輸入中文的問題