[overture] 无污染的智能 DNS 折腾记

发布时间: 2024-02-06

我是在大概三个月前得知了 overture 并开始使用,其相对 ChinaDNS 的优点是设置更丰富、使用国内外 DNS 的判断逻辑更完善、支持 ECS (edns-client-subnet),并且设置比 Pcap DNSProxy 简单很多。

本文会介绍在 PC 及 openwrt 路由器上部署 overture 的方法和要点。

即便现在由于 SNI 阻断,无污染 DNS 的作用越来越小,但这还是我此生不变的信仰(x

 

overture

这是 Go 语言编写的一个 DNS 服务端

你可以直接在 Releases 页面下载到编译好的可执行文件

Windows 请下载overture-windows-386.zip(32位)或overture-windows-amd64.zip(64位)
Linux 请根据架构下载对应版本,常见的x86_64请下载overture-linux-amd64.zip
Openwrt 路由器一般是 mipsle,至于是不是 64 以及 softfloat / hardfloat 不清楚的话就自己试吧

 

配置

此处稍微解释下配置内容,过于简单的部分就不赘述了
你也可以在项目 README 看到完整的英文说明

{
    "BindAddress": ":53",
    "PrimaryDNS": [{ //主DNS:一般使用国内DNS
        "Name": "DNSPod",
        "Address": "119.29.29.29:53",
        "Protocol": "udp",
        "SOCKS5Address": "",
        "Timeout": 6,
        "EDNSClientSubnet": { //ECS设置,在后文详述
            "Policy": "auto",
            "ExternalIP": ""
        }
    }],
    "AlternativeDNS": [{ //备DNS:一般使用支持非53端口的国外DNS
        "Name": "OpenDNS",
        "Address": "208.67.222.222:443",
        "Protocol": "tcp",
        "SOCKS5Address": "",
        "Timeout": 6,
        "EDNSClientSubnet": {
            "Policy": "disable",
            "ExternalIP": ""
        }
    }],
    "OnlyPrimaryDNS": false,
    "IPv6UseAlternativeDNS": false,
    //对于IPv6是否仅使用备DNS查询的作为结果
    "IPNetworkFile": { //IP黑白名单配置,在后文详述
        "Primary": "./ip_network_primary_sample",
        "Alternative": "./ip_network_alternative_sample"
    },
    "DomainFile": { //域名黑白名单配置,在后文详述
        "Primary": "./domain_primary_sample",
        "Alternative": "./domain_alternative_sample",
        "Matcher": "suffix-tree" // 无特殊需求请用这个
    },
    "HostsFile": "./hosts_sample",
    //指定Hosts
    "MinimumTTL": 0,
    //解析记录最小缓存时间(秒),0则不使用
    "CacheSize": 0,
    //缓存条数,0则不使用
    "RejectQtype": [255]
}

ECS

不清楚 edns-client-subnet 可先百度了解

国内的话目前 DNSPod 有 EDNS 支持
国外的话谷歌支持,CloudFlare 为了保持匿名性而不会支持

  • Policy 可填以下几种
    • auto:如果客户端IP不是保留IP(你可以简单的将保留IP理解成 内网IP + localhost),则使用客户端IP,否则使用 ExternalIP
    • manual:如果 ExternalIP 不为空则使用,否则当客户端IP不是保留IP的时候使用客户端IP
    • disable:关闭该功能


  • ExternalIP(外部IP)
    如果该项为空并且发起查询请求的IP不是外部IP,则该功能会被禁用

也就是说,如果想启用该功能,则 Policy 填auto
如果你是在自己的 PC 上运行 overture,则 ExternalIP 填你当前网络环境的公网IP
如果你是用你自己的 VPS 搭建 DNS,则 ExternalIP 可以留空

 

xxxxxFile

这些文件的指定是用于筛选主备DNS返回的结果,并将“合格”的作为最终结果,作用有点像黑白名单

填写路径的时候注意绝对/相对路径之间的区别,建议填写绝对路径
以及,Windows 路径的反斜杠需要转义,即使用\\

(我有点担心所以还是说一下):不支持直接使用在线 URL,所以后续提到的文件请下载到本地后使用

 

如果你想在路由器上使用,并且用的是H大的老毛子固件,后续有使用 overture 代替固件中自带的 ChinaDNS 的配置方法详述,不需要下载下面提到的文件

IPNetworkFile

文件内容为一行一个 CIDR

Primary 可使用 chnrouter,Alternative 不需要理会

这样的作用是当主DNS查询结果是国内 IP 的时候则立即采用,抛弃备DNS的结果,以加快查询速度和防止将国内服务解析到国外服务器

推荐 IPIP 维护的 chnrouter

DomainFile

文件内容为一行一个域名

Primary 不需要理会(可以使用国内常见域名列表,但没必要),Alternative 可使用 gfwlist 域名列表

Matcher 是匹配方式,说明详见 issue#180

你可以使用以下 Linux 命令生成一个可使用的域名列表(其中包含 gfwlist + Koolshare 列表)(来自H大的老毛子固件)

curl https: //raw.githubusercontent.com/gfwlist/gfwlist/master/gfwlist.txt | base64 -d | sort -u | sed '/^$\|@@/d'| sed 's#!.\+##; s#|##g; s#@##g; s#http:\/\/##; s#https:\/\/##;' | sed '/\*/d; /apple\.com/d; /sina\.cn/d; /sina\.com\.cn/d; /baidu\.com/d; /qq\.com/d' | sed '/^[0-9]\+\.[0-9]\+\.[0-9]\+\.[0-9]\+$/d' | grep '^[0-9a-zA-Z\.-]\+$' | grep '\.' | sed 's#^\.\+##' | sort -u > /tmp/temp_gfwlist.txt
curl https: //raw.githubusercontent.com/hq450/fancyss/master/rules/gfwlist.conf | sed 's/ipset=\/\.//g; s/\/gfwlist//g; /^server/d' > /tmp/temp_koolshare.txt
cat / tmp / temp_gfwlist.txt / tmp / temp_koolshare.txt | sort - u > gfw_all_domain.txt

如果你没有 Linux,你可以开一个虚拟机或者 Windows 下的 Linux 子系统或者使用 Cmder/MinGW

 

HostsFile

如果是在本机搭建并使用,建议修改

Windows 使用C:\\Windows\\System32\\drivers\\etc\\hosts

Linux / Openwrt 使用/etc/hosts

 

运行

Windows

直接运行 .exe 文件即可,但这样会一直存在一个命令提示符窗口,想必会很难受

因此你可以将以下代码保存为一个 VBS 脚本,例如overture.vbs,用来运行或直接添加到开机启动中,可以不显示窗口

建议直接将脚本放在和可执行文件同目录下,并且添加开机启动时使用脚本的快捷方式,这样不需要额外写路径
CreateObject("WScript.Shell").Run "overture-windows-amd64.exe",0
 

Linux / Openwrt

在 Linux 中运行时推荐手动使用-c参数指定配置文件路径,并且推荐使用绝对路径,特别是你写入/etc/rc.local中的时候

 

H大的老毛子固件

有 ss_tproxy 的新版固件

我只大概说一下我的改法,不详细解释了,具体作用自行领会,不懂别问我

  1. Sh15_ss.shnvram set app_112="0"改为nvram set app_112="1",否则如果开启 ss_tproxy 的话你在 web 中设置“跳过自动开启第三方 DNS”是无效的
  2. sh_ss_tproxy.sh中在update_wanlanlist_ipset函数的末尾restart_dhcpd之前插一句sed -i '/^server=/d' /opt/app/ss_tproxy/dnsmasq.d/*.conf
  3. /opt/app/ss_tproxy/dnsmasq_conf_file.txt中写上no-resolvserver=127.0.0.1#8053,假设你第三方 DNS 监听8053端口

无 ss_tproxy 的旧版固件

可以使用 overture 代替 ChinaDNS

只建议可以使用内存卡或U盘的路由器来使用 overture,因为 overture 体积比较大无法保存在路由器闪存中

以下默认你已经将 overture 文件夹放置在/media/AiCard_01/overture,并且将可执行文件直接更名为overture

注:/media/AiCard_01为外置储存路径

 

1. 修改 overture 配置文件

端口改为8053,和 ChinaDNS 的端口一致

IPNetworkFile 的 Primary 使用/tmp/ss/chnroute.txt
DomainFile 的 Alternative 使用/tmp/ss/all_domain.txt

 

2. 修改H大固件中的 ChinaDNS 脚本

脚本路径/etc/storage/script/Sh19_chinadns.sh

请灵性修改,固件中的脚本在将来可能有变化因此我报的行数不一定是正确的,宗旨就是让 ChinaDNS 的启动和守护全换成 overture 的

找到 119 行的chinadns_keep () {,在后面插入新行

chinadns_path="/media/AiCard_01/overture/overture"

找到 164 行,仿照这两句 killall,在后面加上两行

killall overture
killall -9 overture

将 198 行改为

chinadns_path="/media/AiCard_01/overture/overture"

将 221 行改为

eval "$chinadns_path -c /media/AiCard_01/overture/config.json" &

改完记得mtd_storage.sh save,并且将修改后的脚本备份一份,以免更新固件后脚本被换回原版还得重改累得半死

接着就可以设置酸酸“DNS 服务模式选择”为dnsmasq了,固件会使用我们改好的 ChinaDNS 脚本启动 overture

请在下方留下您的评论.加入TG吹水群