建立自有递归 DNS 服务器 - 让 DNS 解析无限速

145 天前
 Songxwn

简介

由于最近国内的阿里的公共 DNS 服务器也进行了限速,之前腾讯的 DNS 也限速了。

所以本教程教大家自建一个递归 DNS 服务器,让所有 DNS 查询请求向权威服务器进行查询。

DNS 服务器软件使用 Unbound

系统使用 Rocky Linux 8/9

关闭防火墙和 SElinux

!注意:国内递归 DNS 服务器若对公网开放,需要进行备案。

递归 DNS 服务器与权威 DNS 服务器

1.权威 DNS:

权威 DNS 是经过上一级授权对域名进行解析的服务器,同时它可以把解析授权转授给其他人,如 COM 顶级服务器可以授权 dns.com 这个域名的的权威服务器为 NS.ABC.COM ,同时 NS.ABC.COM 还可以把授权转授给 NS.DDD.COM ,这样 NS.DDD.COM 就成了 ABC.COM 实际上的权威服务器了。平时我们解析域名的结果都源自权威 DNS 。比如 dns.com 的权威 DNS 服务器就是 ns1.dns.comns2.dns.com 。然后通过 ns1.dns.com 即可查询域名的具体 IP 地址或其他记录。

2.递归 DNS:

负责接受用户对任意域名查询,并返回结果给用户。递归 DNS 可以缓存结果以避免重复向上查询。我们平时使用最多的就是这类 DNS ,他对公众开放服务,一般由网络运营商提供,大家都自己可以架递归 DNS 提供服务。递归 DNS 一定要有可靠的互联网连接方可使用。比如谷歌的 8.8.8.8 和 8.8.4.4 以及 114 的 114.114.114.114 和 114.114.115.115 都属于这一类 DNS 。你本地电脑上设置的 DNS 就是这类 DNS 。

3.转发 DNS:

负责接受用户查询,并返回结果给用户。但这个结果不是按标准的域名解析过程得到的,而是直接把递归 DNS 的结果转发给用户。它也具备缓存功能。他主要使用在没有直接的互联网连接,但可以连接到一个递归 DNS 那里,这时使用转发 DNS 就比较合适。其缺陷是:直接受递归 DNS 的影响,服务品质较差。比如我们用的路由器里面的 DNS 就是这一类,用路由器的朋友可以看下本地电脑的 DNS 一般都是 192.168.1.1 。

查看 DNS 递归服务器解析过程跟踪

安装工具、关闭防火墙、关闭 SELinux


systemctl disable --now firewalld

sed -i 's/^SELINUX=enforcing$/SELINUX=disabled/' /etc/selinux/config && setenforce 0

dnf install tree vim bash-completion tar bind-utils -y


dig 查看

dig +trace baidu.com


; <<>> DiG 9.11.36-RedHat-9.11.36-5.el8_7.2 <<>> +trace baidu.com
;; global options: +cmd
.			9981	IN	NS	g.root-servers.net.
.			9981	IN	NS	j.root-servers.net.
.			9981	IN	NS	c.root-servers.net.
.			9981	IN	NS	m.root-servers.net.
.			9981	IN	NS	i.root-servers.net.
.			9981	IN	NS	k.root-servers.net.
.			9981	IN	NS	b.root-servers.net.
.			9981	IN	NS	f.root-servers.net.
.			9981	IN	NS	d.root-servers.net.
.			9981	IN	NS	l.root-servers.net.
.			9981	IN	NS	e.root-servers.net.
.			9981	IN	NS	h.root-servers.net.
.			9981	IN	NS	a.root-servers.net.

# 通过 114 获取到 root C 的 IP 地址

;; Received 824 bytes from 114.114.114.114#53(114.114.114.114) in 0 ms

com.			172800	IN	NS	a.gtld-servers.net.
com.			172800	IN	NS	d.gtld-servers.net.
com.			172800	IN	NS	l.gtld-servers.net.
com.			172800	IN	NS	c.gtld-servers.net.
com.			172800	IN	NS	m.gtld-servers.net.
com.			172800	IN	NS	h.gtld-servers.net.
com.			172800	IN	NS	e.gtld-servers.net.
com.			172800	IN	NS	j.gtld-servers.net.
com.			172800	IN	NS	b.gtld-servers.net.
com.			172800	IN	NS	i.gtld-servers.net.
com.			172800	IN	NS	g.gtld-servers.net.
com.			172800	IN	NS	f.gtld-servers.net.
com.			172800	IN	NS	k.gtld-servers.net.

# 通过 root C 服务器,获取到所有.com 权威服务器

;; Received 1197 bytes from 192.33.4.12#53(c.root-servers.net) in 197 ms

baidu.com.		172800	IN	NS	ns2.baidu.com.
baidu.com.		172800	IN	NS	ns3.baidu.com.
baidu.com.		172800	IN	NS	ns4.baidu.com.
baidu.com.		172800	IN	NS	ns1.baidu.com.
baidu.com.		172800	IN	NS	ns7.baidu.com.

# 通过.com 权威服务器,获取到 baidu.com 的权威服务器。

;; Received 845 bytes from 192.43.172.30#53(i.gtld-servers.net) in 237 ms

baidu.com.		600	IN	A	39.156.66.10
baidu.com.		600	IN	A	110.242.68.66
baidu.com.		86400	IN	NS	dns.baidu.com.
baidu.com.		86400	IN	NS	ns7.baidu.com.
baidu.com.		86400	IN	NS	ns4.baidu.com.
baidu.com.		86400	IN	NS	ns2.baidu.com.
baidu.com.		86400	IN	NS	ns3.baidu.com.

# 通过 ns3.baidu.com 权威服务器,获取到 baidu.com 的 ip 解析为 112.80.248.64

;; Received 356 bytes from 112.80.248.64#53(ns3.baidu.com) in 26 ms

安装

dnf install unbound -y

配置

vim /etc/unbound/unbound.conf

server:
    interface: 0.0.0.0
    interface: ::0
    
    access-control: 0.0.0.0/0 allow
    access-control: ::/0 allow
    
    
# 在 server 下,修改如上配置,监听所有 IPv4 和 IPv6 地址,和允许所有 IPv4 地址和 IPv6 访问使用 DNS 服务器。    

启动和验证

systemctl enable --now unbound

# 启动服务并设置开机启动

systemctl status unbound

# 查看服务状态

dnf install bind-utils -y

dig @localhost www.qq.com

# 安装 dig ,指定本地 dns 服务器,查询域名测试可用性。

dig +short TXT whoami.ds.akahelp.net  @127.0.0.1

# 查询 dns 服务器访问权威服务器使用的公网 IP 。

抓包验证

tcpdump -i eth0  port domain -w ./dns.pcap 

# 可在服务器指定接口抓包 dns 报文进行分析,使用 Wireshark 打开。

博客

https://songxwn.com/

技术交流群

发送邮件到 ➡️ me@songxwn.com

或者关注 WX 公众号:网工格物

4088 次点击
所在节点    程序员
32 条回复
hefish
145 天前
直接用 bind 也可以吧。
brader
145 天前
那么问题来了,备案这关怎么过
silverwolf
145 天前
用 AdGuard Home
xiaoz
145 天前
直接用 adguardhome ,docker 就搞定了,还可以开启广告屏蔽。
xiaoz
145 天前
@xiaoz 同时还自带 WEB 管理界面。
DAPTX4869
145 天前
@xiaoz #4 adg 要是能用自签证书就完美了
zliea
145 天前
@xiaoz adguardhome 不支持指定域名使用指定域名解析服务器。。。。。
xiaoz
145 天前
@DAPTX4869 #6 ,这个和自签名证书啥关系?
xiaoz
145 天前
@zliea #7 ,可以的呀,过滤器里面 >> DNS 重写,你再看看呢。
Songxwn
145 天前
@brader 内网用呗
snachx
145 天前
@zliea DNS 设置里面可以自己写配置啊
[/example.local/]94.140.14.140: 指定为特定域名的上游服务器;
Goooooos
145 天前
限速主要影响到哪些方面?
Songxwn
145 天前
@Goooooos 超过限速的频率就会丢弃你的 dns 解析请求
sleepm
145 天前
DAPTX4869
145 天前
@xiaoz #8 doh, dot
poorcai
145 天前
@xiaoz 请问这个一般是安装在路由器上面的吗?
march1993
145 天前
https://github.com/semihalev/sdns golang 的方案更方便。。。
xiaoz
145 天前
@poorcai #16 ,可以安装到路由器或者 NAS 上,支持 docker 就能安装。
daimaosix
145 天前
@silverwolf
@xiaoz
AdGuard Home 在这个帖子下似乎并无意义? AdGuard Home 需要配置上游啊,OP 说的是自建上游.....
cubecube
145 天前
@daimaosix 自建的上游不也得有 ta 的上游,其实是一样的

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1060224

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX