如何配置一个DNS服务?

今天在工作中遇到一个需要配置DNS Server的问题,记录一下。

引言

在配置DNS Server之前,我们要先了解,什么是DNS?我第一次接触DNS是在我家跨上了“信息高速路”之后的一天,那时候我还是一个小学生,一个周末我快乐地打开电脑准备进入4399小游戏来一把的时候,却发现无法连上互联网。我感到非常的意外,因为就在那时我还可以使用QQ和朋友们愉快地聊天。但是当时的我并不知道这个问题是什么原因,也并不会修复,后来还是给运营商的维修师傅打电话才把这个问题修复好了。直到后来我才知道是因为DNS出了问题,而QQ是直接使用IP地址来连接服务器,所以即使DNS失效,QQ也可以正常使用。

如果根据DNS的作用来说,DNS就是一个电话簿,在这个电话簿上记录了访问的网址对应的IP地址。对于DNS的产生和历史,此处不再赘述,我们只需要知道DNS协议运行在UDP协议上,使用端口号53。

DNS是怎么工作的?

DNS系统采用的是分布式的解析方案,整个DNS架构是一种层次树状结构,这个树状结构称为DNS域名空间,如下图所示:

Root Server Technical Operations Association (root-servers.org)如果有兴趣的话,在这个网站上可以查看所有根域服务器。

主机名和域名结合构成了FQDNFully qualified domain name - Wikipedia,比如www.bing.com.就是一个FQDN。

注1:FQDN只能包含26个英文字母、“0-9”十个数字和“-”英文中的连接号,且开头和结尾不能含有这个连接号。中文域名包含两到十五个汉字之间的字词或词组。域名中不能包含空格及符号如?/;:@#$%^~_=+&。等。

注2: 每个域名的最后面有一个点号“.”表示根域名,实际使用的时候为了方便省略掉。

DNS域名解析过程

整个DNS的域名解析过程是什么样的呢?

1.本地缓存

当我们在浏览器中输入一个域名的时候,首先会去浏览器的 dns 缓存中去查询是否有对应记录。如果查询到记录就可以直接返回 ip 地址,完成解析。同上,如果浏览器没有对应的缓存,就去查询操作系统的缓存。

2.hosts

当缓存中没有记录的时候,去检查本地的hosts(C:\Windows\System32\drivers\etc\hosts)文件是否有这个网址的映射关系.

3.本地DNS服务器

一般来说,本地DNS一般本地的互联网运营商提供,由DHCP自动分配,当然也可以由使用者手动配置。

当hosts没有对应映射时,查找本地DNS服务器缓存。如果该服务器已缓存了此网址映射关系,则调用这个IP地址映射,完成域名解析,此解析不具有权威性。如果要查询的域名,包含在本地配置区域资源中,则返回解析结果给客户机,完成域名解析,此解析具有权威性。

4.根域名/上级服务器

这里根据本地DNS服务器是否设置了转发器,有两种情况。

未启用转发模式: 本地DNS把请求发至13台根DNS,根DNS服务器收到请求后会判断这个域名(.com)是谁来授权管理,并会返回一个负责该顶级域名服务器的一个IP。本地DNS服务器收到IP信息后,将会联系负责.com域的这台服务器。这台负责.com域的服务器收到请求后,如果自己无法解析,它就会找一个管理.com域的下一级DNS服务器地址(baidu.com)给本地DNS服务器,直到找到主机。

启用转发模式: 此DNS服务器就会把请求转发至上一级DNS服务器,由上一级服务器进行解析,上一级服务器如果不能解析,或找根DNS或把转请求转至上上级,以此循环。不管是本地DNS服务器用是是转发,还是根提示,最后都是把结果返回给本地DNS服务器,由此DNS服务器再返回给客户机。

这就是DNS系统的作用:

    正向解析:根据主机名称(域名)查找对应的IP地址

    反向解析:根据IP地址查找对应的主机域名

如果想要更深入地理解DNS的工作原理,我们可以用Wireshark抓一个DNS请求包,并对它的内容进行分析。

以对www.biying.com的访问作为例子:

可以看到,访问www.biying.com总共产生了四条数据,两次DNS请求,第一次查询www.biying.com域名对应的IPv4地址,第二次查询www.biying.com域名对应的IPv6地址。

报文分析

可以看到,网络传输层使用 UDP 协议,端口号为 53

DNS报文基础结构部分

每个字段含义如下。

  • 事务 ID(Transaction ID):DNS 报文的 ID 标识。对于请求报文和其对应的应答报文,该字段的值是相同的。通过它可以区分 DNS 应答报文是对哪个请求进行响应的。
  • 标志(Flags):DNS 报文中的标志字段。
  • 问题计数(Questions):DNS 查询请求的数目。
  • 回答资源记录数(Answers RRs):DNS 响应的数目。
  • 权威名称服务器计数(Authority RRs):权威名称服务器的数目。
  • 附加资源记录数(Additional RRs):额外的记录数目(权威名称服务器对应 IP 地址的数目)。

   其中Flags字段中每个字段的含义如下:

  • QR(Response):查询请求/响应的标志信息。查询请求时,值为 0;响应时,值为 1。
  • Opcode:操作码。其中,0 表示标准查询;1 表示反向查询;2 表示服务器状态请求。
  • AA(Authoritative):授权应答,该字段在响应报文中有效。值为 1 时,表示名称服务器是权威服务器;值为 0 时,表示不是权威服务器。
  • TC(Truncated):表示是否被截断。值为 1 时,表示响应已超过 512 字节并已被截断,只返回前 512 个字节。
  • RD(Recursion Desired):期望递归。该字段能在一个查询中设置,并在响应中返回。该标志告诉名称服务器必须处理这个查询,这种方式被称为一个递归查询。如果该位为 0,且被请求的名称服务器没有一个授权回答,它将返回一个能解答该查询的其他名称服务器列表。这种方式被称为迭代查询。
  • RA(Recursion Available):可用递归。该字段只出现在响应报文中。当值为 1 时,表示服务器支持递归查询。
  • Z:保留字段,在所有的请求和应答报文中,它的值必须为 0。
  • rcode(Reply code):返回码字段,表示响应的差错状态。
    • 当值为 0 时,表示没有错误;
    • 当值为 1 时,表示报文格式错误(Format error),服务器不能理解请求的报文;
    • 当值为 2 时,表示域名服务器失败(Server failure),因为服务器的原因导致没办法处理这个请求;
    • 当值为 3 时,表示名字错误(Name Error),只有对授权域名解析服务器有意义,指出解析的域名不存在;
    • 当值为 4 时,表示查询类型不支持(Not Implemented),即域名服务器不支持查询类型;
    • 当值为 5 时,表示拒绝(Refused),一般是服务器由于设置的策略拒绝给出应答,如服务器不希望对某些请求者给出应答,,或者服务器不希望进行某些操作(比如区域传送zone transfer);
    • 6-15 保留值,暂时未使用。

DNS报文问题查询部分
每个字段含义如下:

  • 查询名(Name):一般为要查询的域名胡总和邮件服务器,有时也会是 IP 地址,用于反向查询。
  • 查询类型(Type):DNS 查询请求的资源类型。通常查询类型为 A (Address的缩写)类型,表示由域名获取对应的 IP4 地址。(更多类型如 AAAA,CANME,SOA,PTR,NS 等)
  • 查询类(Class):地址类型,在设计DNS方案的时候,DNS在除了互联网之外的其他网络中的情况也被考虑到了,所以Class用来识别网络类型,不过,如今除了互联网没有其他的网络了,所以该值为IN。
    那么,对于上面报文内容,翻译过后的意思就是,“该报文为标准查询(Opcode=0)请求(QR=1)报文,向本地域名服务器请求查询,发起请求内容为’获取www.biying.com'所对应的IPv4地址,期待本地域名服务器递归查询(RD=1)请求。

TODO 配置DNS服务的实例


如何配置一个DNS服务?
https://douyushinyruo.github.io/shinyruotechtips/2025/12/a1e1acafc8b1/
作者
DouyuShinyruo
发布于
2025年12月20日
许可协议