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