跳到主要内容

dae + SmartDNS 搭建透明代理

· 阅读需 6 分钟

之前一直以为透明代理会因为规则问题导致很多时候要手动切换是否代理,很麻烦,体验了一下感觉很好,基本无感。

我使用的 openwrt.ai 定制的固件,预装了 smartdns 和 daed

我的代理节点是 trojan 协议的。

SmartDNS

SmartDNS 是一个用于 DNS 解析的工具,支持多种 DNS 服务器和协议。它可以将 DNS 请求转发到不同的 DNS 服务器,并根据配置的规则选择最优的 DNS 服务器进行解析。

我主要用来防止 DNS 污染,例如运营商 DNS 会把raw.githubusercontent.com 被解析到127.0.0.1,导致无法下载文件。

同时 SmartDNS 也充当分流的作用,要直连的域名使用国内 DNS,要代理的域名使用国外 DNS。

SmartDNS 的配置文件在/etc/config/smartdns,可以 ssh 登陆使用 vim 编辑。

DNS 选择

我的 DNS 服务商配置如下:

config server
option enabled '1'
option name 'CN-阿里-DOH'
option ip 'https://223.5.5.5/dns-query'
option type 'https'
option server_group 'cn'

config server
option enabled '1'
option name 'CN-阿里-DOH2'
option ip 'https://223.6.6.6/dns-query'
option type 'https'
option server_group 'cn'

config server
option enabled '1'
option name 'CN-腾讯-DOH'
option ip 'https://1.12.12.12/dns-query'
option type 'https'
option server_group 'cn'

config server
option enabled '1'
option name 'CN-腾讯-DOH2'
option ip 'https://120.53.53.53/dns-query'
option type 'https'
option server_group 'cn'

config server
option enabled '1'
option name 'GW-谷歌-DOH'
option ip 'https://8.8.8.8/dns-query'
option type 'https'
option server_group 'en'

config server
option enabled '1'
option name 'GW-谷歌-DOH2'
option ip 'https://8.8.4.4/dns-query'
option type 'https'
option server_group 'en'

config server
option enabled '1'
option name 'GW-CF-DOH'
option ip 'https://1.1.1.1/dns-query'
option type 'https'
option server_group 'en'

config server
option enabled '1'
option name 'GW-CF-DOH2'
option ip 'https://1.0.0.1/dns-query'
option type 'https'
option server_group 'en'

DNS 服务商可以去 dns.iui.im 或者 dns.icoa.cn 选择。

第二 DNS 服务器

启用第二 DNS 服务器

指定服务组为en

因为我的代理不支持 IPv6,所以要启用 停用 ipv6 地址解析

域名列表

域名列表存放在/etc/smartdns/domain-set/

en组的 DNS 请求本身也要走代理,首先要新建一个域名列表,里面放我们代理节点的域名。

trojan.txt
trojan.example.com
trojan2.example.com

等会配置这些域名走国内 DNS,防止 en组的 DNS 要走代理,而代理的域名要使用en组的 DNS 解析这样的循环。

接着配置域名列表,使用vim编辑/etc/config/smartdns文件

/etc/config/smartdns
config download-file
option name 'geosite.dat'
option url 'https://github.com/Loyalsoldier/v2ray-rules-dat/releases/latest/download/geosite.dat'
option type 'list'

config download-file
option name 'geoip.dat'
option url 'https://github.com/Loyalsoldier/v2ray-rules-dat/releases/latest/download/geoip.dat'
option type 'list'

config download-file
option name 'gfw.txt'
option url 'https://raw.githubusercontent.com/Loyalsoldier/v2ray-rules-dat/release/gfw.txt'
option type 'list'
option desc 'GFWList 域名列表'

config download-file
option name 'proxy-list.txt'
option url 'https://raw.githubusercontent.com/Loyalsoldier/v2ray-rules-dat/release/proxy-list.txt'
option type 'list'
option desc '代理域名列表'

dae 也要用到geoipgeosite,为了避免重复下载,将 smartdns 的下载文件链接到 dae 的目录中。

geo.sh
rm /usr/share/v2ray/*.dat
ln -s /etc/smartdns/domain-set/geoip.dat /usr/share/v2ray/geoip.dat
ln -s /etc/smartdns/domain-set/geosite.dat /usr/share/v2ray/geosite.dat
rm /usr/share/xray/*.dat
ln -s /etc/smartdns/domain-set/geoip.dat /usr/share/xray/geoip.dat
ln -s /etc/smartdns/domain-set/geosite.dat /usr/share/xray/geosite.dat
rm /usr/share/daed/*.dat
ln -s /etc/smartdns/domain-set/geoip.dat /usr/share/daed/geoip.dat
ln -s /etc/smartdns/domain-set/geosite.dat /usr/share/daed/geosite.dat

最好启用自动更新,保证规则的及时更新。

第一次如果不能正常下载可以手动下载后放到指定目录中,等配置好代理后应该就可以正常更新了。

域名规则

域名规则列表 一栏配置,或者手动编辑文件:

/etc/config/smartdns
config domain-rule-list
option enabled '1'
option name 'trojan'
option domain_list_file '/etc/smartdns/domain-set/trojan.txt'
option block_domain_type 'none'
option force_aaaa_soa '1'
option server_group 'cn'

config domain-rule-list
option enabled '1'
option name 'gfw'
option server_group 'en'
option domain_list_file '/etc/smartdns/domain-set/gfw.txt'
option block_domain_type 'none'
option force_aaaa_soa '1'

config domain-rule-list
option enabled '1'
option name 'proxy'
option server_group 'en'
option domain_list_file '/etc/smartdns/domain-set/proxy-list.txt'
option block_domain_type 'none'
option force_aaaa_soa '1'

debug

可以在自定义设置中启用日志,日志级别设为debug,日志文件在/var/log/smartdns.log中。

通过查看日志可以判断是否走了代理。

客户端可以通过以下命令测试 DNS:

nslookup baidu.com
nslookup google.com
nslookup raw.githubusercontent.com
nslookup google.com 192.168.0.1
nslookup -port=6553 google.com 192.168.0.1

Daed

Dae 是一个基于 eBPF 的高效代理工具,Daed 是他的 web 控制页面。

Global

  • 连接选项:domain+
  • TLS 实现:utls
  • uTLS 模仿:chrome_auto

DNS

DNS 全部交给 SmartDNS 处理,配置如下:

upstream {
smartdns: 'udp://127.0.0.1:53'
}
routing {
request {
fallback: smartdns
}
}

路由

最重要的部分,定义分流规则。官方文档写的不好,这部分配置只能自己琢磨。官方文档: 路由

我的配置参考:

pname(NetworkManager, systemd-resolved, dnsmasq, tailscaled) -> must_direct
pname(AdGuardHome) && l4proto(udp) && dport(53) -> direct(must)
pname(smartdns) && l4proto(udp) && dport(53) -> must_direct
# lucky
pname(lucky) -> must_direct
# 雷神加速器
pname(acc-gw.linux.arm64, leigod) -> must_direct
# 国内,内网直连
dip(geoip:private) -> direct(must)
dip(geoip:cn) -> direct
domain(geosite:cn) -> direct

# https://github.com/daeuniverse/dae/discussions/298 Apple 设备未收到 Apple 推送通知
dip(17.0.0.0/8) -> direct

# 内网
domain(lan) -> must_direct
dip(192.168.0.0/24) -> direct
dip(192.168.1.1/32) -> direct

# 设备控制
sip(192.168.0.234/32) -> direct

# ipv6 走直连,代理不支持
ipversion(6) -> direct

# CN DOH 不走代理
dip(223.5.5.5/32) -> direct
dip(223.6.6.6/32) -> direct
dip(1.12.12.12/32) -> direct
dip(120.53.53.53/32) -> direct

# GW DOH 走代理
dip(8.8.8.8/32) -> proxy
dip(8.8.4.4/32) -> proxy
dip(1.1.1.1/32) -> proxy
dip(1.0.0.1/32) -> proxy

# diy
domain(bing.com) -> proxy
domain(cn.bing.com) -> proxy
domain(raw.githubusercontent.com) -> proxy

fallback: proxy

Reference