V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
holyshawn
V2EX  ›  DNS

overture: DNS 分流净化器(更新 1.3.0)

  •  2
     
  •   holyshawn · 2017-02-16 11:42:40 +08:00 · 14939 次点击
    这是一个创建于 2844 天前的主题,其中的信息可能已经有所发展或是发生改变。

    Github 项目传送门: https://github.com/holyshawn/overture

    Binary 下载地址: https://github.com/holyshawn/overture/releases

    添加了多上游 DNS 功能,自动选择最快应答。

    添加了缓存功能,如果开启了 edns-client-subnet ,则命中时就会考虑到缓存时所用的 ip 。

    添加了本地 Hosts 支持。

    如需开启 edns-client-subnet,外网 IP 请手动填写,策略是如果访问 IP 是内网 IP 就用填的外网 IP,否则用访问 IP 进行查询。原先自动填写不太稳定而且耗时,这版本就取消了。

    其他功能参见 README 。

    配置文件语法有更改,请参照新版配置文件修改。

    1.0.0 版本介绍传送门: https://www.v2ex.com/t/331100

    1.1.0 版本介绍传送门: https://www.v2ex.com/t/332764

    1.2.0 版本介绍传送门: https://www.v2ex.com/t/334691

    第 1 条附言  ·  2017-02-17 19:44:43 +08:00
    更新 1.3.1 版本:

    + 修复一个在使用多个上游 DNS 服务器时可能无法顺利分流的 bug ,感谢 bazingaterry
    第 2 条附言  ·  2017-03-01 15:01:12 +08:00

    更新 1.3.1 版本:

    • 为上游 DNS 服务器添加 SOCKS5 代理支持
    • 添加 Linux 下 arm, mips 等二进制包,方便路由器用户使用(mips 得益于 go 1.8 的更新)
    第 3 条附言  ·  2017-03-01 15:04:07 +08:00
    上面的是 1.3.2 版本,笔误,望管理员看到的话帮忙改下~~~
    65 条回复    2018-04-26 17:50:26 +08:00
    hronro
        1
    hronro  
       2017-02-16 12:55:54 +08:00
    有机会试试
    ewex
        2
    ewex  
       2017-02-16 13:20:12 +08:00

    1. 第一行提示个人认为可以去掉;
    2. “口”是本来这样还是字体缺失?还没看源码;
    3. "AlternativeDNS":[ "EDNSClientSubnet":{ 冒号后面加个空格更统一,强迫症晚期;
    4. gfwlist.txt 和 hosts 能否去除最后一样空行,还是强迫症。

    以上问题通过自行编译应该都可以解决(感谢楼主开源)。

    环境: Win10 Ent N 2016 LTSB x64 英文版, Overture 64 位,系统自带 CMD

    感谢!
    holyshawn
        3
    holyshawn  
    OP
       2017-02-16 13:46:56 +08:00
    @ewex #2
    1. 还是留着吧,方便下载新版和提 issue ,主要是 程序本身除了这一行外是没有任何版权或者版本信息的。
    2. 应该是字体,我在 osx 和 linux 下都没有问题, windows 下有人测试过了也没有这种问题。
    3.4. 可以提 PR 。
    Havee
        4
    Havee  
       2017-02-16 13:54:58 +08:00
    “对策略是如果访问 IP 是内网 IP 就用填的外网 IP ,否则用访问 IP 进行查询。”
    ===

    呃,这是打错字了还是本来就是如此, cdn 怎么解决。

    还没看源码,感谢开源。
    holyshawn
        5
    holyshawn  
    OP
       2017-02-16 14:05:26 +08:00
    @Havee #4 这里的 IP 指的是发送 EDNS client subnet 请求时附属的 IP ,用于上游 DNS 服务器根据该 IP 返回合适的地址。我这里的策略是,对于来自客户端的请求,如果客户端的 IP 地址是内网 IP ,那我就用在配置文件中手动填写的外网 IP 发送给上游;如果客户端的 IP 地址是外网 IP ,那就直接用客户端的 IP 地址。这样就解决了 CDN 的问题。
    bazingaterry
        6
    bazingaterry  
       2017-02-16 15:57:17 +08:00 via iPhone
    从第一个版本用到现在了,支持一下。

    话说每次更新都改一次配置文件的格式啊(手动滑稽
    JackyBao
        7
    JackyBao  
       2017-02-16 16:02:42 +08:00
    比 dnsmasq 多了上游 tcp 请求的功能是吗?
    其他还有什么创新,少年?
    holyshawn
        8
    holyshawn  
    OP
       2017-02-16 16:11:06 +08:00
    @bazingaterry #6 小版本改 bug 并没有动配置文件啊 ,大版本添加功能的话,想不动也是没有办法。
    maojy1989
        9
    maojy1989  
       2017-02-17 08:47:15 +08:00
    想在树莓派上跑这个程序要怎么玩呢? CPU 架构不一样,可以自己编译吗,我不会改代码。。。
    whx20202
        10
    whx20202  
       2017-02-17 09:40:33 +08:00
    hi , 我问个题外问题希望不要嫌弃
    不管是你这个软件还是 chinaDNS , 所谓的 alternative DNS 如果填写成国外的 那还不是一样被污染么? 加密这块是需要用户自己做还是说软件里已经做好了?
    holyshawn
        11
    holyshawn  
    OP
       2017-02-17 09:53:57 +08:00   ❤️ 1
    @maojy1989 #9
    如果是 64 位的 arm 可以用:
    GOOS=linux GOARCH=arm64 CGO_ENABLED=0 go build -o overture-linux-arm64 main/main.go

    参见: https://golang.org/doc/install/source#environment
    holyshawn
        12
    holyshawn  
    OP
       2017-02-17 09:56:42 +08:00   ❤️ 1
    @whx20202 #10
    目前只要在非 53 端口或者使用 TCP 两种手段下选择一项即可避免污染,如果在特定情况下这些都失效的话那可以用代理穿透, DNSCrypt 或者 HTTP DNS 之类的方案,这些由于需求多样,用户自己搭建填进去就好了。
    maojy1989
        13
    maojy1989  
       2017-02-17 09:56:53 +08:00
    @holyshawn #11 好的,晚上回去试试,谢谢啦
    whx20202
        14
    whx20202  
       2017-02-17 10:14:17 +08:00
    @holyshawn 那么 overture 或者 chinaDNS 默认支持 TCP 吗?
    holyshawn
        15
    holyshawn  
    OP
       2017-02-17 10:34:29 +08:00
    @whx20202 #14 可以配置,请先看 README 吧。
    maojy1989
        16
    maojy1989  
       2017-02-18 19:52:13 +08:00
    GOOS=linux GOARCH=arm CGO_ENABLED=0 go build -o overture-linux-arm main/main.go

    main/main.go:11:2: cannot find package "github.com/Sirupsen/logrus" in any of:
    /usr/local/golang/go/src/github.com/Sirupsen/logrus (from $GOROOT)
    /usr/local/golang/go/bin/src/github.com/Sirupsen/logrus (from $GOPATH)
    main/main.go:12:2: cannot find package "github.com/holyshawn/overture/core" in any of:
    /usr/local/golang/go/src/github.com/holyshawn/overture/core (from $GOROOT)
    /usr/local/golang/go/bin/src/github.com/holyshawn/overture/core (from $GOPATH)

    这个怎么解决啊
    holyshawn
        17
    holyshawn  
    OP
       2017-02-19 08:58:26 +08:00
    @maojy1989 #16
    go get 一下吧,如果有 arm 的需求我等会把 binary 一起编译了传上去。
    maojy1989
        18
    maojy1989  
       2017-02-19 10:42:32 +08:00 via iPhone   ❤️ 1
    @holyshawn 谢谢大佬,我在树莓派上设置国外 IP 段走单独的通道,然后没有合适的 dns 客户端,暂时只能用中科大的 DNS 来避免污染,效果是有的,但是 cdn 不太好
    huanter
        19
    huanter  
       2017-02-20 09:04:41 +08:00
    这个能用来科学上网吗?
    holyshawn
        20
    holyshawn  
    OP
       2017-02-20 09:34:32 +08:00 via iPhone
    @huanter 可以用来规避 DNS 污染科技,其他高科技无能为力。
    kiman
        21
    kiman  
       2017-02-20 13:41:34 +08:00 via iPhone
    非常好用,项目开始用到现在还在用,望继续给力更新。
    maojy1989
        22
    maojy1989  
       2017-02-20 17:09:33 +08:00
    再问大神一个问题,我现在使用 DNS 分流的需求是这样的:
    我在本地做了流量分流,国内 IP 走正常线路,国外走单独通道,这个时候我需要的是一个 CDN 友好并且准确的 DNS
    我在本地用 overture 设置主 DNS 为一个 CDN 友好的 DNS ,然后国外的域名转到备用 DNS 解析。

    备用 DNS 是我在 VPS 上的 overture ,因为流量会通过远程服务器,所以我不需要 DNS 按照我本地的 IP 来优化解析结果。

    直接返回远程服务器的 DNS 解析是最好的,但是我把 VPS 上面的 overture 配置改成使用服务器本地的 DNS ,并且关掉 EDNS 却不能解析了,会一直提示:
    WARN[0061] Maybe your primary dns server does not support edns client subnet
    主 DNS 使用 8.8.8.8 备用 DNS 用服务器本地的也是这个提示,然后不能解析国外的域名

    换成 8.8.8.8 关闭 EDNS 能够正确返回不按本地 IP 优化的解析结果,但是跟服务器本地 DNS 的解析结果还是不一致,这个问题能够优化一下吗
    holyshawn
        23
    holyshawn  
    OP
       2017-02-20 17:27:14 +08:00 via iPhone   ❤️ 2
    @maojy1989 建议 VPS 上直接用 dnsmasq ,把 alternative dns 填上 vps 的地址即可,关掉 edns 。不建议把 overture 套起来用。
    suitrue
        24
    suitrue  
       2017-02-23 18:05:07 +08:00
    多上游 DNS 功能 要怎么配置使用?由于我的 primary dns 经常很久不反应,我希望添加多个 DNS 。但找了半天也没看到怎么用这个功能。
    suitrue
        25
    suitrue  
       2017-02-23 19:44:58 +08:00
    我觉得副 DNS 可以不要等待主 DNS 解析完再开始,因为对很多国外网站,主 DNS 解析的非常慢,这样即使副 DNS 解析的比较快,最后的时间也是要两者相加。
    holyshawn
        26
    holyshawn  
    OP
       2017-02-24 09:36:48 +08:00
    @suitrue #24 上游 DNS 的配置是一个 JSON 数组,自行添加即可。
    @suitrue #25 未来值得考虑,算是一个改进,不过如果这样目前的 EDNSClientSubnet 的缓存逻辑有一些问题,需要一些处理。
    suitrue
        27
    suitrue  
       2017-02-24 18:06:15 +08:00
    @holyshawn 感谢作者回复,我把副 DNS 复制一遍也添加到 Primary DNS 里就可以实现之前的想法了。(关于 EDNS 我不太懂,反正我没开)
    lybtongji
        28
    lybtongji  
       2017-03-12 22:07:46 +08:00
    你好,我想问下 overture 这样配置是否正确,目的是 IPv4 地址通过 8.8.8.8 查询, IPv6 地址通过 2001:4860:4860::8888 查询。

    overture 配置: https://ooo.0o0.ooo/2017/03/12/58c553ee25443.png

    但发现查询结果并未如预期一样。

    直接查询 Google DNS 能够返回 ping 值各自最小的 IPv4 和 IPv6 地址:
    https://ooo.0o0.ooo/2017/03/12/58c553ee9d61a.png
    https://ooo.0o0.ooo/2017/03/12/58c553eea6ee9.png

    但通过 overture 查询获得的 IPv4 地址并非 8.8.8.8 返回的最佳地址:
    https://ooo.0o0.ooo/2017/03/12/58c553ef22931.png

    返回的 IPv6 地址正常:
    https://ooo.0o0.ooo/2017/03/12/58c553ef25cbd.png

    IPv4 ping 值对比:
    https://ooo.0o0.ooo/2017/03/12/58c5560602017.png
    https://ooo.0o0.ooo/2017/03/12/58c556067be4b.png
    holyshawn
        29
    holyshawn  
    OP
       2017-03-13 12:24:41 +08:00
    @lybtongji 按照你的配置,查询 www.google.com 应该都是走 Alternative DNS 的,所以不一样,详细流程请看 README 。 按照默认配置, Primary DNS 最好找个国内的 DNS 吧, CDN 友好一些。
    lybtongji
        30
    lybtongji  
       2017-03-13 22:23:44 +08:00
    @holyshawn 那有什么办法查询 www.google.com 的 IPv4 地址走 Primary DNS , IPv6 地址走 Alternative DNS 么?因为用的 V6VPN
    holyshawn
        31
    holyshawn  
    OP
       2017-03-14 22:22:27 +08:00
    @lybtongji #30 IPv6 地址 在绝大多数操作系统中都是优先的,不需要这么麻烦, IPv4 的地址无所谓。
    huanter
        32
    huanter  
       2017-03-23 13:52:22 +08:00
    @holyshawn 这个 HostsFile 只能一个文件吗?
    能否设成不同的,比如这样:
    "HostsFile": "./hosts_sample1",
    "HostsFile": "./hosts_sample2",
    holyshawn
        33
    holyshawn  
    OP
       2017-03-23 14:31:28 +08:00
    @huanter #32 目前不行,多个文件请并在一起。
    huanter
        34
    huanter  
       2017-04-05 15:25:23 +08:00
    @holyshawn overture 怎么设置 SNI PROXY 的呢?
    holyshawn
        35
    holyshawn  
    OP
       2017-04-06 12:53:30 +08:00
    @huanter #34 overture 只提供 DNS 相关的功能,不支持 SNI PROXY
    huanter
        36
    huanter  
       2017-04-14 14:52:49 +08:00
    @holyshawn overture 怎么将日志输出到文件呢?
    holyshawn
        37
    holyshawn  
    OP
       2017-04-14 23:21:32 +08:00
    @huanter #36 目前还没有这个功能,可以考虑未来加,可以考虑用 supervisor 等进程管理软件导出,或者 nohup 运行。
    Oi0Ydz26h9NkGCIz
        38
    Oi0Ydz26h9NkGCIz  
       2017-04-20 23:16:10 +08:00
    请问能否把 2 个 overture 串起来用?
    c 是客户机, a 主机安装 overture , b 主机也安装 overture ,然后 b 收到的查询请求递归到 a , a 在递归到 8.8.8.8
    那么这样一来,传递给 8.8.8.8 的源 ip 是 c 还是 b 还是 a 呢?
    bobopu
        39
    bobopu  
       2017-04-21 11:26:20 +08:00
    有没有进行下压测 QPS ,并与 bind 和 unbound 对比呢?
    另,有否考虑过支持导入 bind 的 zone 文件呢?
    bobopu
        40
    bobopu  
       2017-04-21 11:29:15 +08:00
    另,开启*通配符后对 cpu 内存的占用能有多大呢?
    holyshawn
        41
    holyshawn  
    OP
       2017-04-21 19:59:22 +08:00 via iPhone
    @aruisi 如果开启 edns ,生效的应该都是 c 的公网出口 ip ;不开启的话,生效的是末端 a 。
    holyshawn
        42
    holyshawn  
    OP
       2017-04-21 20:08:18 +08:00 via iPhone
    @bobopu overture 为了实现 ip 分流 overture 实际上是进行的两段处理,一段是拿 primary dns 的结果,另一段才是根据结果选择进一步的解析策略,和 bind , outbound 之类的一段式静态规则没有可比性。而且,理论上 go 写的肯定会比 c 写的慢,没必要进行比较。 overture 的定位不是做一个完备的 server , server 只是基础,主要功能还是在分流调度修改上, zone 文件导入暂时不再考虑范围。 overture hosts 的通配符是在解析的动态匹配时候,不会对内存产生特殊影响。
    unboy
        43
    unboy  
       2017-04-22 00:39:43 +08:00
    楼主,请问如何把 overture 作为系统服务实现启动重启停止呢,参考网上的教程都搞不定啊,能否给出范例,谢谢。
    bobopu
        44
    bobopu  
       2017-04-22 01:47:45 +08:00
    @holyshawn 你好,测试了下发现 hosts 在使用通配符时存在 bug ,例如当 hosts 设置为 0.0.0.0 *.abc.com 时

    dig www.abc.com 返回的 ip 确为 0.0.0.0
    而当 dig abc.com 时却绕过了 hosts 返回了真实 ip
    通配符对根域不起作用。

    而当 dig a.a.b.abc.com 时同样存在绕过 hosts 的问题,不能返回 0.0.0.0
    通配符对三级以上域名不起作用。

    烦劳修复一下。
    holyshawn
        45
    holyshawn  
    OP
       2017-04-22 11:19:37 +08:00 via iPhone
    @bobopu 这个问题已经有人提过 issue 了,已经在开发分支中修复了还没有 release ,参见 issue ,你可以先自行编译最新源码测试。
    holyshawn
        46
    holyshawn  
    OP
       2017-04-22 11:21:52 +08:00 via iPhone
    @unboy linux 的话用 supervisor , windows 我不是很清楚,可以参见 issue #4
    unboy
        47
    unboy  
       2017-04-23 13:10:13 +08:00
    @holyshawn 请问这个源代码版本的如何编译安装呢?我运行./build.py 没法安装,提示 /usr/bin/env: python3: No such file or directory
    unboy
        48
    unboy  
       2017-04-23 13:16:42 +08:00
    @unboy python -V 当前版本是 3.6
    Oi0Ydz26h9NkGCIz
        49
    Oi0Ydz26h9NkGCIz  
       2017-04-23 14:46:37 +08:00
    请教下第一次运行时 hosts 是全部加载到内存中读取,还是在接到查询请求后仍然在硬盘中查询匹配?
    holyshawn
        50
    holyshawn  
    OP
       2017-04-23 16:09:38 +08:00
    @unboy #48 我已经 release 了 1.3.4 版,可以直接下载。
    holyshawn
        51
    holyshawn  
    OP
       2017-04-23 16:10:51 +08:00
    @aruisi #49 全部加载在内存中, hosts 文件理论上应该比较小。
    unboy
        52
    unboy  
       2017-04-23 18:06:23 +08:00
    @holyshawn 你好,运行 1.3.4 版时报错
    panic: runtime error: index out of range

    goroutine 81 [running]:
    github.com/shawn1m/overture/core/hosts.parseLine(0x18890bf6, 0x1, 0x18846de0)
    /home/travis/gopath/src/github.com/shawn1m/overture/core/hosts/hostsline.go:137 +0x4ae
    github.com/shawn1m/overture/core/hosts.newHostsLineList.func1(0x18846dbf, 0x1860c3f0, 0x18846de0, 0x18846dd0, 0x18890bf6, 0x1)
    /home/travis/gopath/src/github.com/shawn1m/overture/core/hosts/hostsline.go:67 +0x62
    created by github.com/shawn1m/overture/core/hosts.newHostsLineList
    /home/travis/gopath/src/github.com/shawn1m/overture/core/hosts/hostsline.go:73 +0x1d6
    unboy
        53
    unboy  
       2017-04-23 18:31:22 +08:00
    @holyshawn 此问题已确认是由于 hosts 文件有空行的问题,删掉空行就好了。
    Oi0Ydz26h9NkGCIz
        54
    Oi0Ydz26h9NkGCIz  
       2017-04-24 00:08:27 +08:00
    @holyshawn CacheSize 这一项在 Tips:中没有做详细说明,这里缓存大小单位默认是 m 吗?例如 128 、 512 ?您建议缓存大小设置为多少合适呢?
    Oi0Ydz26h9NkGCIz
        55
    Oi0Ydz26h9NkGCIz  
       2017-04-24 00:29:37 +08:00
    发现当 hosts 超过 5000 条时,后面的 hosts 会失效不起作用了,只有前面的起作用。
    holyshawn
        56
    holyshawn  
    OP
       2017-04-24 10:53:02 +08:00
    @unboy #53 @aruisi #55 请把你们出现问题的 hosts 文件提交一下,我排查一下具体 bug 。可以放在
    https://github.com/shawn1m/overture/issues/36 这个 issue 里。

    @aruisi #54 针对单个域名的缓存个数,合适的个数没有推荐,我自用 100000 。
    Oi0Ydz26h9NkGCIz
        57
    Oi0Ydz26h9NkGCIz  
       2017-04-24 17:26:05 +08:00
    @holyshawn 已在 issue 提交。
    holyshawn
        58
    holyshawn  
    OP
       2017-04-24 19:55:22 +08:00
    @unboy #53
    @aruisi #57
    已修复,请测试 1.3.5-rc1
    Oi0Ydz26h9NkGCIz
        59
    Oi0Ydz26h9NkGCIz  
       2017-04-25 13:37:56 +08:00
    @holyshawn 当前的通配符*包含一切字符的方式误伤太大,已在 issue 反馈请您查看下。
    Oi0Ydz26h9NkGCIz
        60
    Oi0Ydz26h9NkGCIz  
       2017-05-03 21:02:57 +08:00
    @holyshawn 关于两台 overture 串联使用时,末端丢失客户端 ip 的问题已在 issue 反馈。
    Digcloud
        61
    Digcloud  
       2017-08-19 19:04:24 +08:00
    请教一下,如何统计在线 IP 数啊?
    feiyang21687
        62
    feiyang21687  
       2018-03-09 19:18:54 +08:00
    试用了一下,不错!
    gesse
        63
    gesse  
       2018-04-26 16:37:01 +08:00
    这里面有个问题,比如以 gfwlist 作为直接走国外解析的依据,但是像谷歌分析业务 www.google-analytics.com ,国内服务器是正常,到国外解析成国外 IP,反而很多网站因为 js 问题访问不了
    gesse
        64
    gesse  
       2018-04-26 17:49:32 +08:00
    还有一个问题,scontent-nrt1-1.xx.fbcdn.net 类似这样的域名,国内 DNS 服务器基本会『卡住』,然后结果会为空,不会继续使用 AlternativeDNS
    gesse
        65
    gesse  
       2018-04-26 17:50:26 +08:00
    楼上我说的是禁用了 DomainFile ( gfwlist )以后
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2592 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 10:38 · PVG 18:38 · LAX 02:38 · JFK 05:38
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.