我是在大概三个月前得知了 overture 并开始使用,其相对 ChinaDNS 的优点是设置更丰富、使用国内外 DNS 的判断逻辑更完善、支持 ECS (edns-client-subnet),并且设置比 Pcap DNSProxy 简单很多。
本文会介绍在 PC 及 openwrt 路由器上部署 overture 的方法和要点。
即便现在由于 SNI 阻断,无污染 DNS 的作用越来越小,但这还是我此生不变的信仰(x
Head Pic: 「雨上がり」/「Mauve」のイラスト [pixiv]
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,否则使用 ExternalIPmanual
:如果 ExternalIP 不为空则使用,否则当客户端IP不是保留IP的时候使用客户端IPdisable
:关闭该功能
- ExternalIP(外部IP)
如果该项为空并且发起查询请求的IP不是外部IP,则该功能会被禁用
也就是说,如果想启用该功能,则 Policy 填auto
如果你是在自己的 PC 上运行 overture,则 ExternalIP 填你当前网络环境的公网IP
如果你是用你自己的 VPS 搭建 DNS,则 ExternalIP 可以留空
xxxxxFile
这些文件的指定是用于筛选主备DNS返回的结果,并将“合格”的作为最终结果,作用有点像黑白名单
填写路径的时候注意绝对/相对路径之间的区别,建议填写绝对路径
以及,Windows 路径的反斜杠需要转义,即使用\\
(我有点担心所以还是说一下):不支持直接使用在线 URL,所以后续提到的文件请下载到本地后使用
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 的新版固件
我只大概说一下我的改法,不详细解释了,具体作用自行领会,不懂别问我
Sh15_ss.sh
中nvram set app_112="0"
改为nvram set app_112="1"
,否则如果开启 ss_tproxy 的话你在 web 中设置“跳过自动开启第三方 DNS”是无效的sh_ss_tproxy.sh
中在update_wanlanlist_ipset
函数的末尾restart_dhcpd
之前插一句sed -i '/^server=/d' /opt/app/ss_tproxy/dnsmasq.d/*.conf
/opt/app/ss_tproxy/dnsmasq_conf_file.txt
中写上no-resolv
和server=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
找到 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
版权声明:本文为原创文章,版权归 神代綺凜 所有。
本文链接:https://moe.best/tutorial/overture.html
所有原创文章采用 知识共享署名-非商业性使用 4.0 国际许可协议 进行许可。
您可以自由的转载和修改,但请务必注明文章来源并且不可用于商业目的。
一般都是将 DNSMasq 作为主 DNS 服务,因为 DHCP 也是靠它,剩下的工作流程需要你自己看 SS 的脚本,看着改
root@OpenWrt:/overture# ./overture
INFO[2020-02-02 03:41:21] Overture v1.6-rc6
INFO[2020-02-02 03:41:21] If you need any help, please visit the project repository: https://github.com/shawn1m/overture
INFO[2020-02-02 03:41:21] Domain TTL file ./domain_ttl_sample has been loaded with 1 records (0 failed)
INFO[2020-02-02 03:41:21] Domain file ./domain_primary_sample has been loaded with 1 records (regex-list)
INFO[2020-02-02 03:41:21] Domain file ./domain_alternative_sample has been loaded with 1 records (regex-list)
WARN[2020-02-02 03:41:21] No element has been loaded from IP network file: ./ip_network_primary_sample
WARN[2020-02-02 03:41:21] No element has been loaded from IP network file: ./ip_network_alternative_sample
INFO[2020-02-02 03:41:21] Minimum TTL has been set to 60
INFO[2020-02-02 03:41:21] CacheSize is 1000
INFO[2020-02-02 03:41:21] Hosts file has been loaded successfully
INFO[2020-02-02 03:41:21] Overture is listening on :8053
运行后就停留在这里了,看进程里也没有,看上去已经退出了,什么问题?
你可以直接
nohup ./overture &
或者用 supervisor 守护如果你希望日志里显示所有 DNS 请求细节以满足强迫症,可以加
-v
我现在把DNS污染的问题解决了,通过另一台防火墙直接翻墙连接Google的DNS,设置了ECS,国内域名解析也正常,不会解析到境外。
我现在要解决,国内外的分流问题,国内IP的通过国内的网关连接,其他的都走另一个网关(已经翻墙)。你有什么好的方案推荐吗?OpenWRT自带了IPtable,是不是能实现?感觉比较复杂。
我解压缩后上传到OpenWRT的tmp目录下
./overture 运行不了,提示Illegal Instruction。
Nov 02 21:12:31 aml overture[3550]: time="2019-11-02 21:12:30" level=error msg="Error parsing IP network CIDR 101.126.0.0/16\r\n: invalid CIDR address: 101.126.0.0/16\r"
Nov 02 21:12:31 aml overture[3550]: time="2019-11-02 21:12:30" level=error msg="Error parsing IP network CIDR 101.128.0.0/22\r\n: invalid CIDR address: 101.128.0.0/22\r"
Nov 02 21:12:31 aml overture[3550]: time="2019-11-02 21:12:30" level=error msg="Error parsing IP network CIDR 101.128.8.0/21\r\n: invalid CIDR address: 101.128.8.0/21\r"
Nov 02 21:12:31 aml overture[3550]: time="2019-11-02 21:12:30" level=error msg="Error parsing IP network CIDR 101.128.16.0/20\r\n: invalid CIDR address: 101.128.16.0/20\r
Nov 02 21:12:31 aml overture[3550]: time="2019-11-02 21:12:30" level=error msg="Error parsing IP network CIDR 101.128.32.0/19\r\n: invalid CIDR address: 101.128.32.0/19\r
Nov 02 21:12:31 aml overture[3550]: time="2019-11-02 21:12:30" level=error msg="Error parsing IP network CIDR 101.129.0.0/16\r\n: invalid CIDR address: 101.129.0.0/16\r"
Nov 02 21:12:31 aml overture[3550]: time="2019-11-02 21:12:30" level=error msg="Error parsing IP network CIDR 101.130.0.0/15\r\n: invalid CIDR address: 101.130.0.0/15\r"
Nov 02 21:12:31 aml overture[3550]: time="2019-11-02 21:12:30" level=error msg="Error parsing IP network CIDR 101.132.0.0/15\r\n: invalid CIDR address: 101.132.0.0/15\r"
Nov 02 21:12:31 aml overture[3550]: time="2019-11-02 21:12:30" level=error msg="Error parsing IP network CIDR 101.134.0.0/17\r\n: invalid CIDR address: 101.134.0.0/17\r"
Nov 02 21:12:31 aml overture[3550]: time="2019-11-02 21:12:30" level=error msg="Error parsing IP network CIDR 101.134.128.0/19\r\n: invalid CIDR address: 101.134.128.0/19
使用这类智能 DNS 软件势必会影响 DNS 响应速度,特别是在路由器这类性能低且查询并发高的场景下
你也可以通过配置 cache size 来缓解这种情况
不过如果内网 DNS 做 PrimaryDNS 也没问题就确实不需要 DNSMasq 了
server=127.0.0.1#8053
),在 DNSMasq 中配置具体哪些域名使用自定的上游 DNS(例如server=/taobao.com/223.5.5.5
)理论上 openwrt 开机自启应该跟 linux 一样,通过
/etc/rc.d
中的脚本::1
我在小鸡上dig了hosts里面的一个列表的域名返回正确,但是到了电脑上ping返回的还是解析正确的域名
HostsFile
记得指定为小鸡 hosts 路径/etc/hosts
我把他的项目git下来就懵逼了
WARN[0080] DNSPod Fail: read udp 172.19.51.126:38202->119.29.29.29:53: i/o timeout
WARN[0085] DNSPod Fail: read udp 172.19.51.126:57058->119.29.29.29:53: i/o timeout
WARN[0090] DNSPod Fail: read udp 172.19.51.126:42885->119.29.29.29:53: i/o timeout
WARN[0096] DNSPod Fail: read udp 172.19.51.126:50712->119.29.29.29:53: i/o timeout
WARN[0101] DNSPod Fail: read udp 172.19.51.126:46151->119.29.29.29:53: i/o timeout
WARN[0106] DNSPod Fail: read udp 172.19.51.126:36140->119.29.29.29:53: i/o timeout
WARN[2931] DNSPod Fail: read udp 172.19.51.126:33076->119.29.29.29:53: i/o timeout
WARN[2936] DNSPod Fail: read udp 172.19.51.126:54772->119.29.29.29:53: i/o timeout
WARN[2941] DNSPod Fail: read udp 172.19.51.126:46273->119.29.29.29:53: i/o timeout
Orz
我遇到的都是什么魔鬼问题
而且我顺便直接在路由器上部署了