# CoreDNS

官网:https://coredns.io (opens new window)

CoreDNS 是一款通过简单的配置即可使用的 DNS 解析工具

提示

文章仅以 DoT/DoH 举例



# 安装

点击这里 (opens new window)下载最新版本,解压缩后得到一个名为 coredns 的可执行文件

程序运行时会加载同级目录中名为 Corefile 的配置文件,或使用 -conf 指定配置位置

# 配置

# 客户端

使用 CoreDNS 作为客户端时

.:1053 {
    forward . tls://1.1.1.1 {
		tls_servername cloudflare-dns.com
		health_check 5s
	}
    cache 3600S
    log {
       class error
    }
}
  • :1053 通过此端口发起查询;当端口未指定时默认使用 :53
  • forward 将 DNS 请求转发至指定的 DNS 地址(上游DNS);

提示

上游 DNS 协议为 DoT/DoH 时需要指定域名和 IP,如上所述;即自建 DoT/DoH 写法同上

提示

log 项目不存在时则不保留任何日志

# 服务器

使用 CoreDNS 作为服务端(自建 DoT/DoH)

tls://.:853 {
    acl {
       allow net 192.168.0.0/24 192.168.1.0/24
       block
    }
    rewrite stop type AAAA A
    tls /root/.ssl/dnsenc.crt /root/.ssl/dnsenc.key
    forward . 8.8.8.8 8.8.4.4
    cache 3600
}

tls://.:853 使用标准端口的 DoT 服务

提示

CoreDNS 的 DoT 端口可以任意,但例如安卓系统仅支持标准端口(853)的 DoT 服务

acl 访问控制,allow net 后面跟允许访问的 IP 或者 CIDR,允许名单以外的 IP 使用此服务时会收到拒绝的相应

rewrite stop type AAAA A 忽略 IPv6 的查询

tls 后面分别为域名的证书和 Key

forward 上游 DNS

cache 缓存

# 测试

需要用到这个工具 (opens new window)

dnslookup www.baidu.com tls://your_domain.com

dnslookup v1.4.3
dnslookup result:
;; opcode: QUERY, status: NOERROR, id: 49205
;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 1

;; QUESTION SECTION:
;www.baidu.com.	IN	 A

;; ANSWER SECTION:
www.baidu.com.	300	IN	CNAME	www.a.shifen.com.
www.a.shifen.com.	300	IN	A	61.135.185.32
www.a.shifen.com.	300	IN	A	61.135.169.121

;; ADDITIONAL SECTION:

;; OPT PSEUDOSECTION:
; EDNS: version 0; flags: do; udp: 2048
; SUBNET: 123.132.101.0/24/13

返回结果即为配置成功

注意

配合其他程序使用时请注意其是否支持自定义 DNS 端口,否则应使用 53 端口

# 设置开机自启

  • 移动 coredns/usr/local/bin 目录

  • 创建 /usr/local/etc/coredns 文件夹并将 Corefile 移动至此

  • 创建 coredns.service

vi /etc/systemd/system/coredns.service

#填入以下内容
[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
ExecStart=/usr/local/bin/coredns -conf=/usr/local/etc/coredns/Corefile
ExecReload=/bin/kill -SIGUSR1 $MAINPID
Restart=on-failure

[Install]
WantedBy=multi-user.target

# 操作

可通过 systemctl 控制程序运行

systemctl enbale|disable|start|stop|restart coredns