CoreDNS替代dnsmasq

CoreDNS是k8s的御用DNS解析软件

支持很多插件,各种DoH、DoT、gRPC ,各种特性,安装配置也十分简单

替代dnsmasq后,基本dnsmasq的功能都支持,修改劫持域名后也不用重启,会自动刷文件更新

下面说一下装法:

安装:

wget https://github.com/coredns/coredns/releases/download/v1.7.0/coredns_1.7.0_linux_amd64.tgz

解压后就一个文件,直接放到/usr/local/bin

做个systemd启动文件

 1cat /etc/systemd/system/coredns.service 
 2[Unit]
 3Description=CoreDNS DNS server
 4After=network.target
 5
 6[Service]
 7PermissionsStartOnly=true
 8LimitNOFILE=1048576
 9LimitNPROC=512
10CapabilityBoundingSet=CAP_NET_BIND_SERVICE
11AmbientCapabilities=CAP_NET_BIND_SERVICE
12NoNewPrivileges=true
13ExecStart=/usr/local/bin/coredns -conf=/usr/local/bin/coredns.conf
14ExecReload=/bin/kill -SIGUSR1 $MAINPID
15Restart=on-failure
16
17[Install]
18WantedBy=multi-user.target

东西全都在/usr/local/bin/coredns.conf配置文件里:

 1.:5353 https://.:443 {
 2  any
 3  log
 4  debug
 5  bind 172.18.30.1
 6  tls /usr/local/bin/full.pem /usr/local/bin/key.pem
 7  hosts /etc/hosts {
 8    ttl 60
 9    reload 1m
10    no_reverse
11    fallthrough
12  }
13  cache 120
14  reload 6s
15  loadbalance
16  forward . 114.114.114.114:53 223.5.5.5:53 223.6.6.6:53 {
17      policy sequential
18  }
19  prometheus 172.18.30.1:9253
20
21}

解释一下:

 1. 表示所有域名,.:5353 和 https://.:443 表示开了5353和443端口来服务所有域名的查询
 2bind 172.18.30.1 绑定指定ip
 3tls full.pem和key.pem是lego生成的*.rendoumi.com的证书链和私钥
 4hosts 表示从文件解析,reload 1m会自动扫描文件变动并加载
 5    最有用的是fallthrough ,如果在/etc/hosts 找不到记录,那就继续,去下面的配置里找
 6loadbalance 表示如果查到的记录有多条,那就按round-robin轮询返回结果
 7forward 这里指定上游服务器,最多可以有15个上游
 8    policy是严格按顺序来,首先114,114坏了5.5.5,5.5.5坏了6.6.6,如果不指定会从upstream里随机
 9	挑一个
10prometheus 露出端口,供prometheus刮数据用

然后启动,就可以了,这里为了避免跟dnsmasq冲突,用了5353,实际应该是53端口

systemctl start coredns

测一下标准的dns查询

dig -t a m.ddky.com @172.18.30.1 -p5353

下面来解释DoH,DNS-Over-HTTPS,这个特性非常鬼畜 注意,准确的说https提交的是dns-message

先测一下CF

curl -H 'accept: application/dns-json' 'https://cloudflare-dns.com/dns-query?name=m.ddky.com&type=A' | jq .

json的结果很华丽,但是请注意,上面实际发的是dns-json,coredns不支持,鬼畜吧!

DoH实际提交的是dns-message:

curl -H 'accept: application/dns-message' -v 'https://dns.ddky.com/dns-query?dns=q80BAAABAAAAAAAAA3d3dwdleGFtcGxlA2NvbQAAAQAB' | hexdump
curl -H 'accept: application/dns-message' -v 'https://cloudflare-dns.com/dns-query?dns=q80BAAABAAAAAAAAA3d3dwdleGFtcGxlA2NvbQAAAQAB' | hexdump

注意那串dns=的字符串,那是个实际的查询,被Base64加码了,但绝不是对 name=www.example.com&type=A 这样简单的base64,这个东西完全无法造出来,有二进制的东西在里面。

所以我们必须用程序来了,必须下载一个土造的DoH的客户端

wget https://github.com/ameshkov/dnslookup/releases/download/v1.3.0/dnslookup-linux-amd64-v1.3.0.tar.gz

解压出来一个dnslookup,用这个来查才行

./dnslookup www.ddky.com https://dns.ddky.com/dns-query
./dnslookup www.ddky.com https://dns.alidns.com/dns-query

这样就ok了,最后补充一下,如果你非要用curl做DoH,也行,得下载最新版本的curl

curl -v --doh-url https://cloudflare-dns.com/dns-query https://m.ddky.com

看过程,是先去CF查了DNS,然后又发了个请求到m.ddky.com


Sed中的正则表达式用法
Oracle使用rman定时清除7天前的日志
comments powered by Disqus