Hello World

吞风吻雨葬落日 欺山赶海踏雪径

0%

ubuntu 22.04 install dae

dae, means goose, is a high-performance transparent proxy solution.

环境准备

确定内核版本

内核版本需要在5.8或以上

1
uname -r

启用ip转发

1
vim /etc/sysctl.conf
1
2
net.ipv4.ip_forward=1
net.ipv6.conf.all.forwarding=1
1
sysctl -p

手动安装

下载

https://github.com/daeuniverse/dae/releases

当前最新版本为v0.6.0rc2

1
2
3
4
5
6
7
8
9
10
11
# 下载amd64
wget https://github.com/daeuniverse/dae/releases/download/v0.6.0rc2/dae-linux-x86_64.zip

# 下载arm64
wget https://github.com/daeuniverse/dae/releases/download/v0.6.0rc2/dae-linux-x86_64.zip

# 解压
unzip dae-linux-x86_64.zip

# 进入到解压目录
cd dae-linux-x86_64

配置

  1. 配置文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 创建配置目录
mkdir -p /etc/dae

# 将案例配置文件移动到配置目录
mv example.dae /etc/dae

# 创建最小配置文件
cat <<EOF> /etc/dae/config.dae
global{}
routing{}
EOF

# 设置配置文件权限,限制只有配置文件所有者才可以读写。不设置dae无法启动
chmod 0640 /etc/dae/config.dae
  1. Geo数据库文件
1
2
3
4
5
# 创建数据目录
mkdir -p /usr/local/share/dae/

# 将geo数据库文件移动到数据目录
mv geoip.dat geosite.dat /usr/local/share/dae/
  1. 主程序文件
1
2
3
4
5
# 添加可执行权限 *文件名不同架构不一样
sudo chmod +x dae-linux-x86_64

# 将主程序文件安装到用户bin目录
sudo install -Dm755 dae-linux-x86_64 /usr/bin/dae
  1. 服务文件
1
2
3
4
5
# 将服务文件移动到systemd目录
mv dae.service /etc/systemd/system/

# 刷新配置
sudo systemctl daemon-reload

服务

启动+自启

1
sudo systemctl enable dae.service --now

状态

1
sudo systemctl status dae.service

重启

1
sudo systemctl restart dae.service

重载配置

1
sudo systemctl reload dae.service

日志

1
journalctl -xfu dae.service

一键脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
wget -P /tmp/ https://github.com/daeuniverse/dae/releases/download/v0.4.0rc1/dae-linux-x86_64.zip
unzip /tmp/dae-linux-x86_64.zip -d /tmp/dae
cd /tmp/dae
mkdir -p /etc/dae
mv example.dae /etc/dae
cat <<EOF> /etc/dae/config.dae
global{}
routing{}
EOF
chmod 0640 /etc/dae/config.dae
mkdir -p /usr/local/share/dae/
mv geoip.dat geosite.dat /usr/local/share/dae/
sudo chmod +x dae-linux-x86_64
sudo install -Dm755 dae-linux-x86_64 /usr/bin/dae
mv dae.service /etc/systemd/system/
sudo systemctl daemon-reload
sudo systemctl enable dae.service --now
rm -rf /tmp/dae-linux-x86_64.zip
rm -rf /tmp/dae
cd /etc/dae

手动卸载

1
2
3
4
rm -rf /etc/dae
rm -f /usr/bin/dae
rm -rf /usr/local/share/dae
rm -f /etc/systemd/system/dae.service

官方脚本安装

安装

默认配置目录:/usr/local/etc/dae/

1
sudo sh -c "$(curl -sL https://github.com/daeuniverse/dae-installer/raw/main/installer.sh)" @ install

卸载

1
sudo sh -c "$(curl -sL https://raw.githubusercontent.com/daeuniverse/dae-installer/main/uninstaller.sh)"

更新Geo数据库

1
sudo sh -c "$(curl -sL https://github.com/daeuniverse/dae-installer/raw/main/installer.sh)" @ update-geoip update-geosite

基本示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
# 全局配置
global {
# 绑定lan网口提供给内网设备,填自己服务器的网口,多个逗号隔开
lan_interface: eth0
wan_interface: auto
log_level: info
auto_config_kernel_parameter: true
dial_mode: domain
allow_insecure: false
so_mark_from_dae: 1234

# tls配置
tls_implementation: utls
utls_imitate: chrome_auto
}

# 订阅配置
subscription {
}

# 节点配置
node {
# 节点URI
vless: 'vless://22e694e4-093d-44bb-8ed2-b0e548c87a2e@idev.example.com:443?type=ws&security=tls&host=idev.example.com&path=%2Fvideo'
}

# 分组配置,以下采用固定策略,使用第一个节点
group {
elden_proxy {
policy: fixed(0)
}
}

# dns配置
dns {
upstream {
googledns: 'tcp://dns.google.com:53'
alidns: 'udp://dns.alidns.com:53'
}
routing {
request {
qname(geosite:cn) -> alidns
fallback: googledns
}
response {
upstream(googledns) -> accept
fallback: accept
}
}
}

# 路由配置
routing {
pname(NetworkManager) -> direct
dip(224.0.0.0/3, 'ff00::/8') -> direct
dip(geoip:private) -> direct

### 以下是自定义规则

## 规则
ip(geoip:cn) -> direct
domain(geosite:cn) -> direct
domain(geosite:category-ads) -> block


# 默认出站分组
fallback: elden_proxy
}

配置说明

全局配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
global {
# tproxy监听端口
tproxy_port: 12345

# 设置为true开启可保护tproxy端口不受未经请求的流量的影响
tproxy_port_protect: true

# so_mark标记网络数据包,如果不为零,则从 dae 发送的流量将被设置为 SO_MARK
so_mark_from_dae: 0

# 日志级别: error, warn, info, debug, trace.
log_level: info

# 是否禁止等待网络,在拉取订阅之前
disable_waiting_network: false

##### 网络接口和内核选项
# 如果你需要为其他局域网设备提供代理,需要绑定LAN接口,多个网卡","分割
lan_interface: eth0,docker0

# 如果你要代理本机流量,需要绑定WAN接口,多个接口","分割,也可以使用自动检测"auto"
wan_interface: auto

# 自动配置Linux内核参数。ip_forward和send_redirects
auto_config_kernel_parameter: true

##### 节点连通性检查
# 如果你主机有双栈的话,检查链接需要有IPV4和IPV6
# 第一个是URL,其他可以指定IP
# 考虑到流量消耗,建议选择anycast IP(CDN)、响应数据少的站点。
#tcp_check_url: 'http://cp.cloudflare.com'
tcp_check_url: 'http://cp.cloudflare.com,1.1.1.1,2606:4700:4700::1111'

# 检查的HTTP请求方法
tcp_check_http_method: HEAD

# 用于检查节点的UDP连接. 如果dns_upstream配置包含 tcp, 同样可以用来检查TCP节点
# 第一个是URL,其他是IP
# 如果你主机有双栈的话,IPV4和IPV6都需要指定
#udp_check_dns: 'dns.google.com:53'
udp_check_dns: 'dns.google.com:53,8.8.8.8,2001:4860:4860::8888'

# 检查间隔
check_interval: 30s

# 当节点延迟差多少会切换节点
check_tolerance: 50ms


##### 连接选项.
# 拨号模式:ip,domain,domain+,domain++
dial_mode: domain

# 是否允许不安全的TLS证书
allow_insecure: false

# 等待第一次嗅探数据发送的超时时间
# 如果dial_mode是ip,那么设置为0
sniffing_timeout: 100ms

# tls实现,设置为tls则使用crypto/tls,设置为utls则使用uTLS,可以模仿浏览器的指纹
tls_implementation: utls

# utls要模仿的客户端,仅当utls时生效
# 参考 https://github.com/daeuniverse/dae/blob/331fa23c16/component/outbound/transport/tls/utls.go#L17
utls_imitate: chrome_auto
}

订阅配置

1
2
3
4
5
6
7
8
9
10
subscription {
# 添加订阅链接.
my_sub: 'https://www.example.com/subscription/link'
# 多个订阅
another_sub: 'https://example.com/another_sub'
# 无标签订阅
'https://example.com/no_tag_link'
# 本地文件订阅,将内容存放在/etc/dae/relative/path/to/mysub.sub
'file://relative/path/to/mysub.sub'
}

节点配置

1
2
3
4
5
6
7
8
9
node {
# 支持 socks5, http, https, ss, ssr, vmess, vless, trojan, tuic, juicity, etc.
# Full support list: https://github.com/daeuniverse/dae/blob/main/docs/en/proxy-protocols.md
'socks5://localhost:1080'
mylink: 'ss://LINK'
node1: 'vmess://LINK'
node2: 'vless://LINK'
chains: 'tuic://LINK -> vmess://LINK'
}

分组配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
# 出站
group {
# 组名
my_group {
# 没有设置过滤器,代表使用全部节点

# 节点选择策略

# random:随机选择
#policy: random

# fixed:固定选择,以下是固定选择第一个节点
#policy: fixed(0)

# min:最小延迟节点
#policy: min

# 每个连接选择平均延迟最小的节点
policy: min_moving_avg
}
# 组名
group2 {
# 将会从全局节点池中过滤节点,包括订阅和手动添加的节点

# subtab是过滤订阅的标签,并且订阅中存在ExpireAt关键字的会被过滤
#filter: subtag(regex: '^my_', another_sub) && !name(keyword: 'ExpireAt:')

# 过滤节点,根据标签
#filter: name(node1, node2)

# 过滤香港节点
filter: name(HK_node)
# 过滤美国节点,并添加一个延迟偏差,下面的意思是美国的节点延迟计算会减去500ms
filter: name(US_node) [add_latency: -500ms]

# 对于每个连接,都会从组里面选择最近平均延迟最小的10个节点
policy: min_avg10
}
}

DNS配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
dns {
# ip偏好,如果为4,则当域名有ipv4和ipv6记录,则只会响应ipv4
#ipversion_prefer: 4

# 固定域名的ttl,若设置0,代表不缓存DNS查询结果
fixed_domain_ttl {
ddns.example.org: 10
test.example.org: 3600
}

upstream {
# 格式为 scheme://host:port, 支持 tcp/udp/tcp+udp.
# 如果是host是域名而且有IPv4和IPv6记录, dae 会通过组策略自动选择,例如最小延迟策略
# 请确保DNS流量通过dae并由dae转发, 这是域路由必须的
# 如果 dial_mode 是 "ip", 则上游DNS应答不应该被污染, 所以不推荐使用国内公共DNS.
alidns: 'udp://dns.alidns.com:53'
googledns: 'tcp+udp://dns.google.com:53'
}
routing {
# 根据DNS查询的请求,决定使用哪个DNS服务器
# 规则从上到下匹配
request {
# 内置出站:asis,reject
# 可用的方法qname, qtype
# 广告拒绝
qname(geosite:category-ads-all) -> reject
# 这里的意思是google中是cn的域名使用alidns
qname(geosite:google@cn) -> alidns
# 匹配后缀,匹配关键字
qname(suffix: abc.com, keyword: google) -> googledns
# 全匹配和正则匹配
qname(full: ok.com, regex: '^yes') -> googledns
# DNS 请求类型
# ipv4和ipv6请求使用alidns
qtype(a, aaaa) -> alidns
# cname请求googledns
qtype(cname) -> googledns
# 默认DNS服务器
fallback: alidns
}
# 根据DNS查询的响应,决定接受或者使用另外一个DNS服务器重新查询记录
# 规则从上到下匹配
response {
# 内置出站:accept,reject
# 可用的方法:qname, qtype, upstream, ip.
# 如果是发送到googledns的请求响应,则接受,可用于避免循环
upstream(googledns) -> accept
# 意思是如果请求的域名不是国内网站,但是返回了一个私有的IP,那就是被污染了。重新通过googledns请求
ip(geoip:private) && !qname(geosite:cn) -> googledns
# 以上不匹配,默认
fallback: accept
}
}
}

模版1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 中国大陆网站使用alidns,其他使用googledns,若响应的结果出现DNS污染则重新使用googledns查询
dns {
upstream {
googledns: 'tcp+udp://dns.google.com:53'
alidns: 'udp://dns.alidns.com:53'
}
routing {
request {
qname(geosite:cn) -> alidns
qname(geosite:category-ads-all) -> reject
fallback: googledns
}
response {
upstream(googledns) -> accept
ip(geoip:private) && !qname(geosite:cn) -> googledns
fallback: accept
}
}
}

模版2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 所有dns查询使用alidns,但如果检测到DNS污染,则重新使用googledns查询
dns {
upstream {
googledns: 'tcp+udp://dns.google.com:53'
alidns: 'udp://dns.alidns.com:53'
}
routing {
request {
qname(geosite:category-ads-all) -> reject
fallback: alidns
}
response {
upstream(googledns) -> accept
ip(geoip:private) && !qname(geosite:cn) -> googledns
fallback: accept
}
}
}

路由配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
routing {
### 以下是预设规则

# 本地的网络管理器应该直连,以避免在绑定WAN接口的时候出现错误的网络连通性检查结果
pname(NetworkManager) -> direct

# 把它放在前面,可以防止多播应该发送到局域网的数据包被代理转发。
# "dip" 意思是目的IP.
dip(224.0.0.0/3, 'ff00::/8') -> direct

# 该设置允许你直接访问私有地址而不是通过代理,如果你想访问代理主机的私有网络地址,可以修改下面配置
dip(geoip:private) -> direct

### 以下是自定义规则

# 内置出站:block, direct, must_rules
# must_rules表示不将DNS流量重定向到dae并继续匹配
# must_direct和must_my_groupName 表示不会将DNS流量重定向到dae,不会继续匹配
# 对于单个规则,direct会劫持并处理DNS请求(用于流量分割),而must_direct不会
# 如果存在DNS请求循环时,must_direct很有用
# "must_direct" 可以写成 "direct(must)".
# 同样,“must_groupname”也支持不劫持和处理 DNS 流量,
# 相当于“groupname(must)”。groupname指的是出站分组
# 如果没有任何规则匹配,默认的出站分组
fallback: my_group

## 域名规则

# 后缀匹配
domain(suffix: v2raya.org) -> my_group
# 全匹配,两种写法
# equals to domain(v2raya.org) -> my_group
domain(full: dns.google.com) -> my_group
# 关键字匹配
domain(keyword: facebook) -> my_group
# 正则匹配
domain(regex: '\.goo.*\.com$') -> my_group
# geosite匹配
domain(geosite:category-ads) -> block
domain(geosite:cn) -> direct
# 组合规则
domain(keyword: google, suffix: www.twitter.com, suffix: v2raya.org) -> my_group

## 目的IP规则
# 单个IP匹配
dip(8.8.8.8) -> direct
# 单个IP段匹配
dip(101.97.0.0/16) -> direct
# geoip匹配
dip(geoip:private) -> direct
# 多目的IP规则
dip(geoip:cn, geoip:private) -> direct
dip(9.9.9.9, 223.5.5.5) -> direct


## 源IP规则
sip(192.168.0.0/24) -> my_group
sip(192.168.50.0/24) -> direct
# 多源IP规则
sip(192.168.0.6, 192.168.0.10, 192.168.0.15) -> direct

# ip规则
ip(geoip:cn) -> direct


## 目的端口规则
# 单个端口
dport(80) -> direct
# 端口范围
dport(80) -> direct
# 端口范围
dport(10080-30000) -> direct

## 源端口规则
# 单个端口
sport(38563) -> direct
# 端口范围
sport(10080-30000) -> direct

## 四层协议规则:
# tcp
l4proto(tcp) -> my_group
# udp
l4proto(udp) -> direct

## IP版本规则:
# IPv4
ipversion(4) -> block
# IPv6
ipversion(6) -> ipv6_group

## 源MAC规则
mac('02:42:ac:11:00:02') -> direct

## 进程名规则 (当绑定WAN接口是只支持本地进程)
pname(curl) -> direct

## DSCP规则 (匹配 DSCP; 对于绕过BT有用).
# See https://github.com/daeuniverse/dae/discussions/295
dscp(0x4) -> direct

## "且"规则
dip(geoip:cn) && dport(80) -> direct
dip(8.8.8.8) && l4proto(tcp) && dport(1-1023, 8443) -> my_group
dip(1.1.1.1) && sip(10.0.0.1, 172.20.0.0/16) -> direct

## “非“规则
# 下面代表,域名不是geosite类型为google-scholar或者category-scholar-!cn或者category-scholar-cn
!domain(geosite:google-scholar,
geosite:category-scholar-!cn,
geosite:category-scholar-cn
) -> my_group

## 更复杂的规则,我觉得少用
domain(geosite:geolocation-!cn) &&
!domain(geosite:google-scholar,
geosite:category-scholar-!cn,
geosite:category-scholar-cn
) -> my_group

## 自定义 DAT 文件
domain(ext:"yourdatfile.dat:yourtag")->direct
dip(ext:"yourdatfile.dat:yourtag")->direct

## 设置 fwmark(Firewall Mark)
# 当您想要将流量重定向到特定接口(例如wireguard)或用于其他高级用途时,标记非常有用
# 以下是将Disney的流量重定向到wg0接口的过程
# You need set ip rule and ip table like this:
# 1. Set all traffic with mark 0x800/0x800 to use route table 1145:
# >> ip rule add fwmark 0x800/0x800 table 1145
# >> ip -6 rule add fwmark 0x800/0x800 table 1145
# 2. Set default route of route table 1145:
# >> ip route add default dev wg0 scope global table 1145
# >> ip -6 route add default dev wg0 scope global table 1145
# Notice that interface wg0, mark 0x800, table 1145 can be set by preferences, but cannot conflict.
# 3. Set routing rules in dae config file.
domain(geosite:disney) -> direct(mark: 0x800)

## Must rules
# 对于以下规则,DNS请求将会被强制重定向到dae,除了mosdns的请求
# 不同于must_direct/must_my_group,来自mosdns的流量会继续匹配其他规则
pname(mosdns) -> must_rules
ip(geoip:cn) -> direct
domain(geosite:cn) -> direct
fallback: my_group
}