使用 CoreDNS 搭建高性能抗污染 DNS 服务器
浏览 2734 | 评论 0 | 字数 10025
NiNya
2020年04月27日
  •   文章最后更新于:.
      受某些因素影响,本文章可能具有一定的时效性,请以实际情况为准!另外,欢迎留言~

    使用了 ChinaDNS 作为本地 DNS 服务器一段时间后,发现它似乎只是单纯的分流器,并没有缓存功能,虽然污染问题得到一定程度缓解,但没有缓存功能还是拖累了上网体验。因此又去寻找一些更好用的 DNS 轮子。

    一开始是用 Overture 的,也不知道是不是因为我配置的问题,一旦需要查询大量的DNS信息的时候,我用做DNS服务器的树莓派3B+就会稳稳地爆缸,CPU使用率稳稳的超过100%,想要通过提升缓存数值的方法来解决这个问题,结果搞了半天无论怎么调CacheSize数值都好像没起到啥作用。后来就又去看了下CoreDNS,结合类库大魔王大佬的配置文件一键生成脚本,感觉是真的好用。因为CoreDNS采用了Caddy的框架,所以无论是弄插件还是配置文件,使用过Caddy的用户应该很快就能上手CoreDNS.

    安装

    编译安装

    首先你需要搭建好Go编译环境,要求Go>=1.11并且开启go module.

    wget https://dl.google.com/go/go1.14.2.linux-amd64.tar.gz
    tar -C /usr/local -xzf go1.12.6.linux-amd64.tar.gz
    echo 'export PATH=$PATH:/usr/local/go/bin' >>/etc/profile
    source /etc/profile

    因为编译CoreDNS需要用到go module,由于某些原因,需要配置一下goproxy,我这里用的是可信度还行的阿里云的源,如果是在非大陆的服务器上编译的话,可以省略一下这个步骤。

    export GOPROXY=https://mirrors.aliyun.com/goproxy/

    而后,你需要做的就是从 GitHub 上git clone

    git clone https://github.com/coredns/coredns
    cd coredns

    如果我们用到类库大魔王大佬的脚本的话,就还需要额外在plugin.cfg的文件结尾处添加以下内容:

    proxy:github.com/coredns/proxy
    ads:github.com/c-mueller/ads
    bogus:github.com/missdeer/bogus
    ipset:github.com/missdeer/ipset
    redisc:github.com/miekg/redis
    dnsredir:github.com/leiless/dnsredir

    然后就是

    make

    直接下载编译好的文件

    你可以在官方 GitHub 上的release上下载适合各个平台已经编译好的文件,也可以去找类库大魔王大佬在GitHub提供的已经编译好了适用于各个平台的文件,与官方 release 不同的是而且Corefile配置文件也已经写好,真正的开箱即用!

    OSArchOptionLink
    Windowsx86_64 https://coredns.minidump.info/dl/coredns-windows-amd64.zip
    Windowsx86 https://coredns.minidump.info/dl/coredns-windows-386.zip
    macOSx86_64 https://coredns.minidump.info/dl/coredns-darwin-amd64.zip
    Linuxx86 https://coredns.minidump.info/dl/coredns-linux-386.zip
    Linuxx86_64 https://coredns.minidump.info/dl/coredns-linux-amd64.zip
    Linuxarm5https://coredns.minidump.info/dl/coredns-linux-armv5.zip
    Linuxarm6https://coredns.minidump.info/dl/coredns-linux-armv6.zip
    Linuxarm7https://coredns.minidump.info/dl/coredns-linux-armv7.zip
    Linuxarm64 https://coredns.minidump.info/dl/coredns-linux-arm64.zip
    Linuxppc64 https://coredns.minidump.info/dl/coredns-linux-ppc64.zip
    Linuxppc64le https://coredns.minidump.info/dl/coredns-linux-ppc64le.zip
    Linuxmips64hardfloathttps://coredns.minidump.info/dl/coredns-linux-mips64-hardfloat.zip
    Linuxmips64softfloathttps://coredns.minidump.info/dl/coredns-linux-mips64-softfloat.zip
    Linuxmips64lehardfloathttps://coredns.minidump.info/dl/coredns-linux-mips64le-hardfloat.zip
    Linuxmips64lesoftfloathttps://coredns.minidump.info/dl/coredns-linux-mips64le-softfloat.zip
    Linuxmipshardfloathttps://coredns.minidump.info/dl/coredns-linux-mips-hardfloat.zip
    Linuxmipssoftfloathttps://coredns.minidump.info/dl/coredns-linux-mips-softfloat.zip
    Linuxmipslehardfloathttps://coredns.minidump.info/dl/coredns-linux-mipsle-hardfloat.zip
    Linuxmipslesoftfloathttps://coredns.minidump.info/dl/coredns-linux-mipsle-softfloat.zip
    Linuxs390x https://coredns.minidump.info/dl/coredns-linux-s390x.zip
    FreeBSDx86_64 https://coredns.minidump.info/dl/coredns-freebsd-amd64.zip
    FreeBSDx86 https://coredns.minidump.info/dl/coredns-freebsd-386.zip
    FreeBSDarm https://coredns.minidump.info/dl/coredns-freebsd-arm.zip
    NetBSDx86_64 https://coredns.minidump.info/dl/coredns-netbsd-amd64.zip
    NetBSDx86 https://coredns.minidump.info/dl/coredns-netbsd-386.zip
    NetBSDarm https://coredns.minidump.info/dl/coredns-netbsd-arm.zip
    OpenBSDx86_64 https://coredns.minidump.info/dl/coredns-openbsd-amd64.zip
    OpenBSDx86 https://coredns.minidump.info/dl/coredns-openbsd-386.zip
    DragonflyBSDx86_64 https://coredns.minidump.info/dl/coredns-dragonfly-amd64.zip
    Solarisx86_64 https://coredns.minidump.info/dl/coredns-solaris-amd64.zip
    Androidx86_64 https://coredns.minidump.info/dl/coredns-android-amd64.zip
    Androidx86 https://coredns.minidump.info/dl/coredns-android-386.zip
    Androidarm https://coredns.minidump.info/dl/coredns-android-arm.zip
    Androidarm64 https://coredns.minidump.info/dl/coredns-android-aarch64.zip

    在容器中使用

    官方GitHub文档上提供了Docker的部署方法,我也就照抄一下官方的部署方法吧

    docker run --rm -i -t -v $PWD:/v -w /v golang:1.14 make

    使用

    这部分最重要的就是配置好Corefile文件了,我根据类库大魔王大佬的一键生成脚本修改了下,以符合自己使用的实际情况。

    #!/bin/bash
    china=`curl -sSL https://github.com/felixonmars/dnsmasq-china-list/raw/master/accelerated-domains.china.conf | while read line; do awk -F '/' '{print $2}' | grep -v '#' ; done |  paste -sd " " -`
    apple=`curl -sSL https://github.com/felixonmars/dnsmasq-china-list/raw/master/apple.china.conf | while read line; do awk -F '/' '{print $2}' | grep -v '#' ; done |  paste -sd " " -`
    google=`curl -sSL https://github.com/felixonmars/dnsmasq-china-list/raw/master/google.china.conf | while read line; do awk -F '/' '{print $2}' | grep -v '#' ; done |  paste -sd " " -`
    
    cat>Corefile<<EOF
    .:533 {
        hosts {
            fallthrough
        }
        forward . 208.67.222.222:443 208.67.222.222:5353 208.67.220.220:443 208.67.220.220:5353 127.0.0.1:5301 {
        except $china $apple $google cdn.jsdelivr.net
        }
        proxy . 127.0.0.1
        log
        cache
        health
        reload
    }
    .:5301 {
        bind 127.0.0.1
        forward . tls://115.159.131.23 {
            tls_servername dns.rubyfish.cn
        }
        cache
    }
    EOF

    因为我在路由器中使用OpenClash配置了去广告规则,所以我把原脚本的ads规则给去掉了,并且把上游无污染DNS换成了红鱼DNS来提升响应速度。

    注意:对于这种非53端口的DNS要用在路由器上,我们需要在OpenWRT上配合一些如smartdnsOpenclash等插件来使用。

    另外,我们也可以用SystemdSupervisor来管理Coredns

    创建Systemd的配置文件(参考自Rat大佬的写法,请根据实际目录自行修改):

    #直接复制到终端中去
    cat > /etc/systemd/system/coredns.service <<EOF
    [Unit]
    Description=coredns
    After=network.target
    Wants=network.target
    
    [Service]
    Type=simple
    PIDFile=/var/run/flowerss.pid
    WorkingDirectory=/root/coredns
    ExecStart=/root/coredns/coredns
    RestartPreventExitStatus=23
    Restart=always
    
    [Install]
    WantedBy=multi-user.target
    EOF

    然后执行

    systemctl start coredns
    systemctl enable coredns

    如果没有Systemd,我们也可以使用Supervisor来管理

    # 安装 Supervisor
    apt -y install supervisor
    # 直接复制到终端中去
    cat > /etc/supervisor/conf.d/coredns.conf <<EOF
    [program:coredns]
    priority=1
    directory=/root/coredns
    command=/root/coredns/coredns -conf /root/coredns/Corefile
    autostart=true
    autorestart=true
    redirect_stderr=true
    stdout_logfile=/var/log/supervisor/overture.log
    EOF

    然后执行

    supervisorctl update
    supervisorctl status coredns

    如果表示RUNNING就表示运行成功了。

    测试效果

    dig图我就不放了,因为抗污染效果那是妥妥的。这里我用dnsperfcorednsoverture对比着做了下负载测试。测试的域名如下:

    iidns.com A
    dnspod.com A
    dnspod.net A
    hichina.com A
    xincache.com A
    dnsv2.com A
    dnsv3.com A
    dnsv4.com A
    dnsv5.com A
    myhostadmin.net A
    cnolnic.com A
    cnolnic.net A
    dns.com.cn A
    cnmsn.net A
    biz.cn.com A
    alidns.com A
    aliyun.com A
    bddns.cn A
    360wzb.com A
    dnsdun.com A
    dnsdun.net A
    china.net A
    ffdns.net A
    xundns.com A
    jiasule.net A
    nsyunjiasu.com A
    cdncenter.com A
    anquanbao.com A
    sina.com.cn A
    72dns.com A
    idc1.cn A
    ezdnscenter.com A
    01isp.com A
    01isp.net A
    800hr.net.cn A
    dns.net.cn A
    okidc.com A
    cdnhost.cn A
    eznowdns.net A
    ndns.cn A
    dnsng.net A
    wanmeilink.com A
    22.cn A
    zjdomain.com A
    zol.com A
    ce.net.cn A
    4everdns.com A
    east.net.cn A
    zdnscloud.net.cn A
    51.net A
    cloudcdns.com A
    pubyun.com A
    qq.com A
    cdeledu.com A
    myhexin.com A
    bidns.net A
    inc365.com A
    zdnscloud.com A
    china.net A
    gzidc.com A
    ns365.net A
    51dns.com A
    nease.net A
    xr.net.cn A
    cnkuai.cn A
    cnkuai.com A
    taobao.com A
    aoyou365.com A
    dnspai.com A
    360safe.com A
    sino.net.cn A
    sfn.cn A
    yovole.com A
    duowanns.com A
    ucweb.com A
    jcloud.com A
    eedns.com A
    maff.com A
    szhot.com A
    bigwww.com A
    ns1oray.net A
    ns2oray.net A
    cdnudns.com A
    zhujiwu.com A
    jjworld.net.cn A
    dns-diy.com A
    iidns.com A
    dns.com A
    youku.com A
    zj01.com A
    cdns.cn A
    bdydns.cn A
    baidu.com A
    139135.com A
    hwclouds.net A
    hwclouds.com A
    hwclouds.cn A
    alibabadns.com A
    iqiyi.com A
    jdcloud.com A
    jdcache.com A
    jd.com A
    sohu.com A
    dns234.net A

    测试结果如下:

    可以看到,这两个在首次测试中差距明显,但经过缓存之后,能做到基本感受不到差别。

    参考

    类库大魔王的挖井日记:CoreDNS搭建无污染DNS

    xigang's home:CoreDNS源码分析

    GitHub:missdeer/coredns_custom_build

    GitHub:coredns/coredns

    本文作者:NiNya
    本文链接:https://lilynas.com/archives/648/
    最后修改时间:2020-04-30 12:53:21
    本站未注明转载的文章均为原创,并采用 CC BY-NC-SA 4.0 授权协议,转载请注明来源,谢谢!
    评论
    与本文无关评论请发留言板。请不要水评论,谢谢。
    textsms
    支持 Markdown 语法
    email
    link
    评论列表
    暂无评论