从配置文件来看,我们定义了两个 server(尽管有 4 个区块),分别监听在 5300 和 53 端口。其逻辑图可如下所示:

每个进入到某个 server 的请求将按照 plugin.cfg 定义顺序执行其已经加载的插件。
从上图,我们需要注意以下几点:
尽管在 .:53 配置了 health 插件,但是它并为在上面的逻辑图中出现,原因是:该插件并未参与请求相关的逻辑(即并没有在插件链上),只是修改了 server 配置。更一般地,我们可以将插件分为两种:
Normal 插件:参与请求相关的逻辑,且插入到插件链中;
其他插件:不参与请求相关的逻辑,也不出现在插件链中,只是用于修改 server 的配置,如 health,tls 等插件;
4. 在 MacOS 上部署 CoreDNS
既然 CoreDNS 如此优秀,我用它来抵御伟大的防火长城岂不美哉?研究了一圈,发现技术上还是可行的,唯一的一个缺点是不支持使用代理,不过你可以通过 proxychians-ng 或 proxifier 来强制使用代理。下面开始折腾。
安装
CoreDNS 是 golang 写的,所以只需要下载对应操作系统的二进制文件,到处拷贝,就可以运行了。
下面统统以 MacOS 为例作讲解。
- $ cd ~/Downloads
- $ wget https://github.com/coredns/coredns/releases/download/v1.4.0/coredns_1.4.0_darwin_amd64.tgz
- $ tar zxf coredns_1.4.0_darwin_amd64.tgz
- $ mv ./coredns /usr/local/bin/
这里补充一句,CoreDNS 的二进制版本已经安装了所有的插件(plugins),不需要你自己编译。推荐下载二进制版本。
配置
要深入了解 CoreDNS,请查看其文档,及 plugins 的介绍。下面是我的配置文件:
- $ cat <<EOF > /usr/local/etc/Corefile
- . {
- hosts {
- fallthrough
- }
-
- forward . tls://8.8.8.8 tls://8.8.4.4 {
- tls_servername dns.google
- force_tcp
- max_fails 3
- expire 10s
- health_check 5s
- policy sequential
- except www.baidu.com
- }
-
- proxy . 117.50.11.11 117.50.22.22 {
- policy round_robin
- }
-
- cache 120
- reload 6s
- log . "{local}:{port} - {>id} '{type} {class} {name} {proto} {size} {>do} {>bufsize}' {rcode} {>rflags} {rsize} {duration}"
- errors
- }
- EOF
- hosts : hosts 是 CoreDNS 的一个 plugin,这一节的意思是加载 /etc/hosts 文件里面的解析信息。hosts 在最前面,则如果一个域名在 hosts 文件中存在,则优先使用这个信息返回;
- fallthrough : 如果 hosts 中找不到,则进入下一个 plugin 继续。缺少这一个指令,后面的 plugins 配置就无意义了;
- forward :这是另外一个 plugin。. 代表所有域名,后面的 IP 代表上游 DNS 服务器的列表。按照什么顺序溯源,由下面的 policy 指令决定;
- tls://8.8.8.8 : 这里表示使用 DNS-over-TLS 协议访问 8.8.8.8。同时还需要通过 tls_servername 指定 DNS 名称。
- force_tcp : 强制使用 TCP 协议溯源。这要求上游 DNS 必须支持 TCP 协议;
- expect :指定哪些域名不按照本 plugin 配置溯源。这里主要用来排除国内的域名,然后通过下面的 proxy 转到国内的 DNS 进行解析。这里被排除的域名只填了一个 www.baidu.com,后面我们再通过脚本填上所有的国内域名;
- proxy : 解析 forward 中被排除的域名。. 代表所有域名,后面的 IP 代表上游 DNS 服务器的列表,这里我选择的是 onedns。按照什么顺序溯源,由下面的 policy 指令决定;
- cache : 溯源得到的结果,缓存指定时间。类似 TTL 的概念;
- reload : 多久扫描配置文件一次。如有变更,自动加载;
- log : 打印/存储访问日志。日志格式参考:https://coredns.io/plugins/log/;
- errors : 打印/存储错误日志;
(编辑:晋中站长网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|