type
status
slug
summary
tags
category
icon
password
new update day
Property
Oct 22, 2023 01:31 PM
created days
Last edited time
Oct 22, 2023 01:31 PM
家里面的宽带是移动的宽带、最近发现DNS污染日异严重,甚至刷抖音、家里孩子上网课都受到了影响。在更换为阿里 DNS 之后,仍然没见改善,于是就准备在内网自建 DNS 从而对抗运营商的 DNS 污染。
CoreDNS
CoreDNS 是一个 DNS 服务器。它是用 Go 编写的。由于其灵活性,它可以在多种环境中使用。 CoreDNS 在 Apache License Version 2 下获得许可,并且完全开源。
同时大名鼎鼎的k8s使用CoreDNS进行服务发现。稳定性以及其功能的强大毋庸置疑。CoreDNS基本沿用了Caddy的插件架构,所以CoreDNS的配置文件的语法跟Caddy的配置文件语法相同。
CoreDNS 配置文件
一个最简单的配置文件可以是这样:
将配置保存为文件
Corefile
,运行命令sudo coredns -conf Corefile
,即可在本地同时监听TCP和UDP 53端口,将所有UDP查询请求转发到8.8.8.8
再返回,可以通过dig @::1 -p 53 twitter.com
进行测试。但是这个配置文件在国内几乎是没啥用的,原因自然是
8.8.8.8
乃国内重点关注对象,直接访问得到的结果都是二手信息。一个好一点的方案是使用非标准端口,比如:forward
插件支持多个上游服务器以实现简单的负载均衡:大陆的网络环境非常复杂,UDP非标准端口也只在某些地区某些运营商有用,现在比较好的一个选择是DoT,即DNS over TLS,知名的支持DoT的公共DNS服务有Quad9的
9.9.9.9
,Google的8.8.8.8
以及Cloudflare的1.1.1.1
,可以这么使用:这样除了国内把连接reset,基本可以得到正确的DNS解析结果。
另一个问题是国内CDN友好,常用做法是使用 FelixOnMars的大陆区域名列表过滤。这个列表是给dnsmasq 用的,经过转换可以给CoreDNS用,为了实现分流解析,可以将所有请求都通过forward转发到无污染上游解析,将大陆区域名列表加到异常列表,再把剩下的所有请求(其实就是异常列表中的域名)通过下一条链的 forward 转发到国内(最好是当前ISP的)DNS server,比如:
这里
except www.taobao.com
表示www.taobao.com
这个域名不要通过forward
解析,后面可以跟多个域名,于是这些域名会掉到下面的forward
插件进行解析,而116.228.111.118
和180.168.255.18
则是我的ISP提供的DNS服务器,可以得到最好的CDN友好的结果。这时就可以用上FelixOnMars的大陆区域名列表了,用以下命令可以得到所有域名连接而成的长字符串,放在
except
标识符后面:FelixOnMars同时还提供了Google和Apple的域名列表,这在某些地区某些ISP可以得到国内镜像的IP,所以最后可以写一个这样的shell脚本用于生成Corefile:
CoreDNS systemd 文件
参考资料
注意:此文章里面提供的 proxy 与 block 插件、官方已经弃用、无法正常完成编译。
- Author:tangcuyu
- URL:https://expoli.tech/articles/2022/12/26/use-coredns-defense-against-DNS-pollution
- Copyright:All articles in this blog, except for special statements, adopt BY-NC-SA agreement. Please indicate the source!
Relate Posts