背景

CoreDNS 是 Golang 编写的一个插件式 DNS 服务器,Kubernetes 1.13 后内置的默认 DNS 服务器。特点如下:

  • 插件化:基于 Caddy 框架,实现了一个插件链的架构,将不同应用端功能抽象成插件形式,官网展示 插件列表
  • 配置简单化:使用 Corefile DSL 语法形式的配置文件,学习成本低。
  • 一体化的解决方案:单独二进制可执行程序,内置插件已满足大多需求。

环境说明

  • 操心系统: ARMBIAN 5.77
  • 主机IP:192.168.8.113

安装部署

  • 下载安装 CoreDNS

    1
    2
    3
    4
    5
    
    wget  https://github.com/coredns/coredns/releases/download/v1.8.5/coredns_1.8.5_linux_arm64.tgz
    
    tar xf coredns_1.8.5_linux_arm64.tgz
    
    mv coredns /usr/local/bin/
    
  • 创建启动用户

    1
    
    useradd coredns -s /sbin/nologin
    
  • 创建 Corefile 服务配置文件

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    
    mkdir -p /data/coredns
    
    cat > /etc/coredns/Corefile << EOF
    .:53 {
      bind 0.0.0.0
      hosts {
        #hangup
        ttl 60
        reload 1m
        fallthrough
      }
      forward . /etc/resolv.conf
      cache {
        success 65536 3600 300
        denial 8192 600 60
        prefetch 1 60m 10%
      }
      reload 6s
      log
      errors
    }
    EOF
    
    chown coredns:coredns -R /etc/coredns
    

    配置详解

    • ttl 记录保存时间以 为单位
    • fallthrough 如果 hosts 中找不到,则进入下一个阶段继续查找,如上述配置文件中,将转发给 系统默认 DNS 进行解析
    • reload 自动重载配置文件
    • forward 将解析转发到系统配置的上游 DNS 服务器进行解析
    • cache DNS 记录缓
    • reload 自动加载配置文件的间隔时间
    • log 打印日志
    • errors 打印错误日志
  • 创建 systemd 配置文件

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    
    cat > /lib/systemd/system/coredns.service << EOF
    [Unit]
    Description=CoreDNS DNS server
    Documentation=https://coredns.io
    After=network.target
    
    [Service]
    PermissionsStartOnly=true
    LimitNOFILE=1048576
    LimitNPROC=512
    CapabilityBoundingSet=CAP_NET_BIND_SERVICE
    AmbientCapabilities=CAP_NET_BIND_SERVICE
    NoNewPrivileges=true
    User=coredns
    WorkingDirectory=/etc/coredns/
    ExecStart=/usr/local/bin/coredns -conf=/etc/coredns/Corefile
    ExecReload=/bin/kill -SIGUSR1 \$MAINPID
    Restart=on-failure
    
    [Install]
    WantedBy=multi-user.target
    EOF
    
  • 添加 主机记录

    1
    
    sed -i "/hangup/a 192.168.8.1 treesir.io" /etc/coredns/Corefile
    
  • 删除主机记录

    1
    
    sed -i "/treesir.io/d" /etc/coredns/Corefile
    
  • 启动服务

    1
    2
    3
    
    systemctl daemon-reload \
    && systemctl enable coredns.service --now \
    && systemctl status coredns.service 
    

测试使用

测试添加 A 记录 www.treesir.io192.168.8.1

1
2
3
4
5
6
sed -i "/hangup/a 192.168.8.1 www.treesir.io" /etc/coredns/Corefile


dig www.treesir.io @192.168.8.113

dig www.baidu.com @192.168.8.113

image-20210925171254777

image-20210925171515073

测试解析百度,同样正常得到解析。

TODO

参考文档

https://coredns.io/plugins/