docker 搭建 overture 无污染 DNS

  • 自编译overture镜像,国内DNS分流,无污染DNS等.

  • 资料来源:

    https://github.com/shawn1m/overture
    https://moe.best/tutorial/overture.html
    https://hub.docker.com/r/daxingplay/docker-overture/dockerfile

  • 更新

1
2
3
19.01.30 初始化
19.07.22 添加dockerhub相关内容
19.12.28 重构脚本,更新新版本,重写了大部分博文内容等.

导语

  • 升级overture时候,才发现配置文件有更改,且支持了dot,索性扔进docker里面,方便维护.
  • (12.28) overture 更新到了 v1.6-rc6.这两天重构一下脚本,升级到最新版本,重新整理一下博文内容.
  • 非常多的内容参考了 [overture] 无污染的智能 DNS 折腾记 #4.

需求

  • 国内/国外 DNS 解析分流.
  • 对CDN友好.
  • 带有DNS缓存.
  • 跨平台等

方案

  • overture 基本可以满足上面的需求.比较磨的是配置.

overture 配置

  • DNS: 支持tcp udp 和 dot

    • 主DNS(PrimaryDNS) : 主要用于国内解析
    • 备用DNS(AlternativeDNS) : 一般配置成无污染DNS,解析国外域名.
  • IPNetworkFile: 按ip地址过滤

    • Primary: 当主 DNS 返回的结果在此集合中时,不再等待备用 DNS 结果,直接返回.
    • Alternative: 当备用 DNS 返回的结果在此集合中时,不再等待主 DNS 结果,直接返回.
  • DomainFile: 按域名过滤

    • Primary: 只使用主 DNS 的域名
    • Alternative: 只使用备用 DNS 的域名,一般要配置成 gfwlist.
    • Matcher: 1.6版本以后,增加了域名文件的过滤方式,这里保持默认 regex-list 即可.

配置选取

  • 主DNS 要解决 1. 国内域名劫持 2.解析速度 3.CDN友好.

    • 对国内域名的劫持,大部分是 ISP 提供的 DNS 本身不纯净,还有类似移动/长城宽带这样无差别劫持 udp-53 端口( tcp 倒是不劫持).
    • 对 CDN 友好要求 DNS 支持 EDNS (在 DNS 解析时传递用户的 ip 地址).
    • ISP 的 DNS 没得选. 只剩下国内的公共 DNS . 如果是移动/长城宽带还需考虑 支持 tcp.
    • 国内的公共 DNS 像 DNSPOD@119.29.29.29 , AliDNS@223.5.5.5 ,还有老牌的 114@114.114.114.114 .都支持 tcp 查询.也支持 EDNS .
    • 从我这里测试来看 114 和 AliDNS 可在 tcp 查询时支持 EDNS ,DNSPOD 还是有些问题. 114 延迟有点高,最后选择 AliDNS 作为主 DNS 同时选择 tcp 查询, EDNS 开启,这样能得到不错的国内解析效果.
    • ps: 测试的命令在 overture 项目介绍的最后,需要对 bind 做个 patch 支持 ENDS.
  • 备用 DNS 要解决 1.域名污染 2.解析延迟要在尚可接受范围.

    • 无污染 DNS 有 5 种
    • 非标准 udp 端口: 主要指的是 opendns 的 udp-5353.
    • tcp 查询: 主要指 opendns的 tcp-443端口.
    • DNSCrypt: 加密DNS查询,貌似走的是 UDP .支持此项的公共DNS很多,被干扰的也比较厉害.
    • DoT : DNS over Tls 做到了 DNS 加密查询,代价是 tls 握手的额外延迟.运行在 853 端口.有 Cloudflare Google Quad9 等.
    • DoH: DNS over HTTPS 与 dot 类似,但是实现更容易.运行在 443 端口.有 Cloudflare Google .
    • overture 支持 非标准udp端口 , tcp 查询 和 DoT . opendns 在各个地区被干扰劫持程度都不同.有的地区基本没有干扰,有的地区干脆连不上. 总的来说如果 opendns 的非标准端口 和 tcp 能使用时, 备用 DNS 选择 opendns.
    • 如果对 DNS 有加密需求,可以选择 dot. Cloudflare 的两个地址 1.1.1.11.0.0.1 .1.1.1.1 在很多地方直接被配置成了内网地址,完全不能用,只能用1.0.0.1. 如果 1.0.0.1 也不能用那可以选择 Quad9 的 9.9.9.9
    • 额外的 DNSCrypt 和 DoH 都需要额外安装其他软件支持,作为 overture 的上级 DNS.在这里暂且不表.
    • overture 默认是 Cloudflare 的 dot 这里保持默认,有需求自行修改.
  • IPNetworkFile 1.加快主DNS 的国内域名解析.

    • 只需要配置 Primary 即可.使用 国内 ip 列表.这里是 IPIP 维护的 chnrouter. 已足够使用.
  • DomainFile 1.区分国内外域名

    • Alternative需要配置为 gfwlist,这里把 gfwlist 和 Koolshare 综合一下.

      1
      2
      3
      4
      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 > gfwlist.txt
      curl https://raw.githubusercontent.com/hq450/fancyss/master/rules/gfwlist.conf | sed 's/ipset=\/\.//g; s/\/gfwlist//g; /^server/d' > koolshare.txt
      cat gfwlist.txt koolshare.txt | sort -u > gfw_list.txt
      rm gfwlist.txt koolshare.txt
    • Primary 可以不做配置.也可以配置成常见国内域名. 目前有找到的有 Koolsharednsmasq-china-list 但是很可惜简单的转成 overture 的格式后,测试发现对 google.com 解析有干扰. 需要进一步处理才行.(等我重新复习下 shell 脚本)

      1
      2
      curl https://raw.githubusercontent.com/felixonmars/dnsmasq-china-list/master/accelerated-domains.china.conf  | sed 's/server=\///g;s/\/114.114.114.114//g' > china_list.txt
      curl https://raw.githubusercontent.com/hq450/fancyss/master/rules/WhiteList_new.txt | sed 's/Server=\///g;s/\///g' > china_list.txt

config.json

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
{
"BindAddress": ":53",
"DebugHTTPAddress": "127.0.0.1:5555",
"PrimaryDNS": [
{
"Name": "AliDNS",
"Address": "223.5.5.5:53",
"Protocol": "tcp",
"SOCKS5Address": "",
"Timeout": 2,
"EDNSClientSubnet": {
"Policy": "auto",
"ExternalIP": "",
"NoCookie": true
}
}
],
"AlternativeDNS": [
{
"Name": "CloudflareDNS",
"Address": "one.one.one.one:853@1.0.0.1",
"Protocol": "tcp-tls",
"SOCKS5Address": "",
"Timeout": 6,
"EDNSClientSubnet": {
"Policy": "disable",
"ExternalIP": "",
"NoCookie": true
}
}
],
"OnlyPrimaryDNS": false,
"IPv6UseAlternativeDNS": false,
"WhenPrimaryDNSAnswerNoneUse": "PrimaryDNS",
"IPNetworkFile": {
"Primary": "./data/china_ip_list.txt",
"Alternative": "./ip_network_alternative_sample"
},
"DomainFile": {
"Primary": "./data/china_list.txt",
"Alternative": "./data/gfw_list.txt",
"Matcher": "regex-list"
},
"HostsFile": "./hosts_sample",
"MinimumTTL": 0,
"DomainTTLFile" : "./domain_ttl_sample",
"CacheSize" : 2000,
"RejectQType": [255]
}

docker镜像

  • 项目地址 overture

  • 镜像简介

    • 基于alpine:latest
    • 每天 2:00 定时更新 分流 和 ip 文件.(此处有尾巴,见后)
    • 整体大小在 6M 作用.(配合定时任务 需要 curl )
  • 容器已经上传了dockerhub 可以直接 docker pull jasperhale/overture.

docker-compose

  • 对应的 docker-compose

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    version: '2.1'

    services:
    overture:
    image: jasperhale/overture
    container_name: overture
    restart: always
    ports:
    - "127.0.0.1:53:53/tcp"
    - "127.0.0.1:53:53/udp"
    volumes:
    - ./overture/config.json:/home/overture/config.json
  • 关联 udp53 和 tcp53 .

尾巴

  • 原本想自动更新分流文件,如果分流文件有变化时,自动重启 overture .
  • 但是一个 docker 本质是就是一个进程对应一个容器.中止了 overture 相当于直接结束了容器.
  • 还有另外的解决办法是,不把 overture 当作容器对应的进程.启动一个无关的进程.这样就可以随便重启 overture.但是这样完全违反了容器的最佳实践.
  • 应该还是有别的解决办法,等待把 shell 脚本复习一遍..