DNS
什么是 DNS
域名系统(英语:Domain Name System,缩写:DNS)是互联网的一项服务。它作为将域名和 IP 地址相互映射的一个分布式数据库,能够使人更方便地访问互联网。
简单来说就是用域名请求服务器换回来 ip 地址
https://www.nslookup.io/
这个网站可以看 dns 请求的结果、同理还有 linux 或者 windows 的 nslookup 命令
DNS records for dn11.top
A records
IPv4 address
|
Revalidate in
|
104.21.27.178
|
5m
|
172.67.143.107
|
5m
|
DNS 服务器使人们无需存储复杂记不住的 ip 地址,而是记住有规律的域名来方便的访问互联网
DNS 记录
DNS 记录是位于权威 DNS 服务器中的指令,提供一个域的相关信息,包括哪些 IP 地址与该域关联,以及如何处理对该域的请求。
常见的 DNS 记录
SOA 记录 - 存储域的管理信息。
NS 记录 - 存储 DNS 条目的名称服务器。
A 记录 - 保存域的 IPv4 地址的记录。
AAAA 记录 - 包含域的 IPv6 地址的记录(与 A 记录相反,A 记录列出的是 IPv4 地址)。
CNAME 记录 - 将一个域或子域转发到另一个域,不提供 IP 地址。
MX 记录 - 将邮件定向到电子邮件服务器。
TXT 记录 - 可让管理员在记录中存储文本注释。这些记录通常用于电子邮件安全。
有几种 DNS 服务器?有几种工作方式?
有两种 DNS 服务器:DNS 递归服务器和 DNS 权威服务器
有两种工作方式:递归和迭代
DNS 客户端设置使用的 DNS 服务器一般都是 DNS 递归服务器,它负责全权处理客户端的 DNS 查询请求,直到返回最终结果。而 DNS 服务器之间一般采用迭代查询方式。
如何工作的
DNS 查询 涉及 4 个 DNS 服务器:
-
DNS 递归解析器
DNS 解析器是一种服务器,旨在通过 Web 浏览器等应用程序接收客户端计算机的查询。然后,解析器一
般负责发出其他请求
,以便满足客户端的 DNS 查询。
常见的 dns 递归解析器有
谷歌 8.8.8.8 8.8.4.4
阿里 223.5.5.5 223.6.6.6
百度 180.76.76.76
腾讯 DNSPod 119.29.29.29
CloudFlare 1.1.1.1
更多
https://en.wikipedia.org/wiki/Public_recursive_name_server
-
根域名服务器
根域名服务器是将主机名转换(解析)为 IP 地址的第一步。
根域名服务器(英语:root name server,简称 “根域名服务器”)是互联网域名解析系统(DNS)中最高级别的域名服务器,负责返回顶级域的权威域名服务器地址。
任意正常 linux 发行版可以运行如下命令来看到这 13 台根域名服务器
全球 13
组
根域名服务器以英文字母 A 到 M 依序命名,域名格式为 “字母.root-servers.net”。利用任播(anycast)技术在全球多个地点设立镜像站。
截至 2023 年 6 月,全球共有 1719 台根域名服务器在运行。
Q:为什么是 13 组?1700 组不行吗?
A:由于 DNS 和某些协议(未分片的用户数据报协议(UDP)数据包在 IPv4 内的最大有效大小为 512 字节)的共同限制,根域名服务器地址的数量被限制为 13 个。一次返回的数据放不下啦~
Q:anycast 是什么?
A:我们假设有三台服务器 α、β、γ 和一台客户机,这三台服务器都宣告了同样的一个地址比如说 172.16.255.53,客户机访问 172.16.255.53 时,会因为路由协议的原因,选择客户机距离服务器最近的一条路径。假设 α 距离客户机近,访问 172.16.255.53 获得的数据就是 α 服务器给客户机的。
Q:anycast 的好处?
A:防止服务挂掉、流量会自动寻找最佳路径、假设一台服务器挂掉了,整个服务会被另一台服务器承担。
Q:有。这个服务器吗
A:存放这 13 个根域的是一个文件,它被内置在递归服务器内,没有权威服务器会返回。这个域的解析给你。 在这里可以下载到这个文件
https://www.iana.org/domains/root/files
运营商通常需要配置一个 “Root Hints 文件” 来管理 DNS 递归解析器。该文件包含了根区域的权威名称服务器的名称和 IP 地址,以便软件可以引导 DNS 解析过程。对于许多软件来说,这个列表已经内置在软件中。
https://www.internic.net/domain/named.root
-
TLD 名称服务器
顶级域名(英语:Top-level Domain, TLD)是互联网域名系统的等级中,位于根域空间的最高级域名。
顶级域名服务器这个服务器是搜索特定 IP 地址的下一步,其上托管了主机名的最后一部分(例如,在 dn11.top 中,TLD 服务器为 “top”)。
https://www.iana.org/domains/root/db
这里是世界上完整的顶级域列表。
-
权威性域名服务器
权威性域名服务器是域名服务器查询中的最后一站。
权威名称服务器包含特定于其服务域名的信息(例如,dn11.top)权威性域名服务器包含特定于其所服务的域名的信息(例如 dn11.top),并且它可为递归解析器提供在 DNS A 记录中找到的服务器的 IP 地址(例如找到了上文的 ipv4 地址 104.21.27.178)
图解工作流程
递归工作流程
我这里画了一张图:其中红色服务器为 DNS 递归服务器,PC 上的 DNS 客户端只与 DNS 递归服务器通讯,由递归服务器完成后续查询内容。蓝色云为想要访问的网站的 ip 地址所在的服务器。
我会逐一讲解每个过程(箭头)都做了什么。
本图的前提是 dns 递归服务器中不含任何缓存。
①:PC 通过浏览器输入了 dn11.top 这个域名、dns 客户端收到了请求 dn11.top 这个域名的 ip 的任务、dns 客户端去请求 DNS 递归服务器
②:DNS 递归服务器使用内置的 Root Hint 文件(内有根服务器的 NS 解析和根服务器的 IP 地址)去请求根权威服务器、得到了 TLD 服务器的 NS 解析并得到了 TLD 服务器的 ip 地址
③:TLD 服务器的 ip 地址被返回给 DNS 递归服务器
④:DNS 递归服务器去请求 TLD 服务器、得到了域名权威服务器的 NS 解析并得到了域名权威服务器的 NS 记录和 IP 地址
⑤:域名权威服务器的 ip 地址被返回给 DNS 递归服务器
⑥:DNS 递归服务器去请求域名权威服务器、得到了请求域名最终的 ip
⑦:请求域名最终的 ip 被返回给 DNS 递归服务器
⑧:请求域名最终的 ip 被返回给 PC 上的 DNS 客户端
⑨:PC 上的浏览器用请求域名最终的 ip 访问域名所在的云服务器
⑩:云服务器返回网页数据给 PC 浏览器、实现页面的访问
迭代工作流程
我这里画了一张图:其中红色服务器为 DNS 递归服务器,PC 上的 DNS 客户端只与 DNS 递归服务器通讯,由递归服务器和权威服务器的迭代查询完成后续查询内容。蓝色云为想要访问的网站的 ip 地址所在的服务器。
我会逐一讲解每个过程(箭头)都做了什么。
本图的前提是 dns 递归服务器中不含任何缓存。
①:PC 通过浏览器输入了 dn11.top 这个域名、dns 客户端收到了请求 dn11.top 这个域名的 ip 的任务、dns 客户端去请求 DNS 递归服务器
②:DNS 递归服务器使用内置的 Root Hint 文件(内有根服务器的 NS 解析和根服务器的 IP 地址)去请求根权威服务器、根权威服务器收到了请求、找到了 TLD 权威服务器的 NS 记录和 ip 地址
③:根权威服务器请求 TLD 服务器、TLD 服务器收到了请求、找到了域名权威服务器的 NS 记录和 ip 地址
④:TLD 服务器请求域名权威服务器、权威服务器找到了域名的 ip 地址
⑤:域名的 ip 地址从域名权威服务器返回给 TLD 权威服务器
⑥:域名的 ip 地址从 TLD 权威服务器返回给根权威服务器
⑦:域名的 ip 地址从根权威返回给 DNS 递归服务器
⑧:请求域名最终的 ip 被返回给 PC 上的 DNS 客户端
⑨:PC 上的浏览器用请求域名最终的 ip 访问域名所在的云服务器
⑩:云服务器返回网页数据给 PC 浏览器、实现页面的访问
配置 pdns
1.openwrt 直接启动
装包
初始化数据库
创建文件
然后在 schema.sqlite3.sql 里写入
初始化 sqlite3
配置 pdns
写入
解释:由于我们正在配置 pdns 权威服务器,地址可以选一个你自己子网你喜欢的、比如说我在
172.16.3.53
当然监听这种地址需要在网卡上创建一个新 ip
对于 op 来说 可以在 web 管理界面 选择网络 新建一个接口 区域 lan 设备 br-lan 地址为
172.16.3.53
对于监听 53 端口、你的本地 dnsmasq 可能会劫持这个端口
在此我给出的解决方案是关闭 dnsmasq
然后由于我的 dnsmasq 会不知道怎么着复活 我写了一个脚本来按死他
这个的意思是一个定时脚本 每分钟检测一下 如果他开着 就给他关掉
启动 pdns
配置自己的子域
其中 ts 换成你想用的域名
edit-zone 会唤醒叫 editor 的编辑器,如果你没有这个叫 editor 的编辑器 可以写一下环境变量
添加一行
(op 的 nano 默认安装位置在这里、其他你想配的自由发挥)
打开 edit-zone 后 写入
解释:SOA 记录里第一个值是你域名权威服务器所在的 NS、第二个为邮箱、第三个为流水号(格式 YYYYMMDD+2 位顺序号)(如果你不改的话 pdns 会自动帮你顺延流水号)、第四个为刷新间隔、第五个为重试间隔、第六个为过期时间长、第七个为 TTL(生存时间值、意为缓存过期时间、设置为 60s)
最后一行就是给你的域名加一个 A 解析
验证
如果返回类似如下内容则成功
配置 TLD 域、拉取同步
内网用户需要访问
http://172.16.7.102:8083/login
(账号密码 dn11)来配置自己的域名权威的 ns 指向
点击 dn11 域、点击 add record 、添加两条记录
之后点击 save 然后点击 apply changes
解释:ns1 是你本地自己启的域名权威服务器的地址
然后回到本地 输入
创建 dn11 域
修改里面的 soa 值为
解释:流水号填小 便于拉取上游的同步
然后写数据库启用主从同步
进入 sqlite 命令行
先启用看头
里面大概也许是这样、然后写数据库同步上游
写完按 ctrl + D 退出 sqlite 命令行
然后使用
强制拉取一下 dn11 的记录
最后看下自己的记录有没有被同步
检查一下
配置 pdns_recursor
写入
解释:
本地监听的 ip 地址这里使用 anycast、同样的你需要在你的网卡里加一个 ip 为 172.16.255.53(监听 5300 的原因是、如果路由路径上有人开了 dnsmasq、那么这个 53 请求会被劫持)
并且宣告
dont-query = 的意思是允许内网地址进行查询(默认是禁止的、所以这里填空)
forward-zones-recurse=dn11=172.16.3.53,.=223.5.5.5
这个递归配置项的意思是:如果请求到了 dn11 这个 TLD 就去请求你自己搭的 ns、如果不是这个域就当公网处理转发给公网 dns 223.5.5.5
然后重启
最后测试一下、请求一下网里存在的域名
2.docker 拉镜像 装 pdns-admin web 界面管理
这个 key 是我随便写的、你可以自己生成一个
PDNS_api_key=0F34664B2C9CA2E1B84C5A6B4605C968
在 powerdns admin settings pdns 中填写这个 key 填好后 在上层的 PowerDNS server configuration & statistics 里能看到一系列 pdns 的字段
配置 dns 分流 MosDNS
装包
注意不要装 luci-app-mosdns 我感觉不好用
改配置