OpenWrt开发:39---DNS域名解析系统(/etc/resolv.conf)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/qq_41453285/article/details/102713115

一、DNS介绍

  • 前一篇文章介绍的主机系统适合小型网络等一些特殊的场景。在因特网中,主机地址非常庞大,并且主 机的IP地址经常改变,因此使用域名系统 DNS 代替主机系统
  • DNS 可以被视为一种用于 TCP/IP 应用程序的分布式数据库,它提供主机名字和 IP 地址间的相互转换。这里提到的分布式是指在因特网上的单个站点不能拥有所有的信息。每 个站点(如大学中的系、校园、公司或公司的部门)保留它自己的信息数据库,并运行一 个服务器程序供因特网上的其他系统查询

二、域名结构

  • 其最顶端有一个未命名的根节点,然后其下分为好几个基本类别名称(称 为顶层域名),例如 com、org、net 和 gov 等 3 字符域名,还有 cn、sg、jp 和 us 等两个字 符国家地区域名
  • 每个节点有一个至多 63 个字符长的标识,域名总长度则不能超过 253 个字符。命名标识中不区分大写和小写
  • 命名树上任何一个节点的域名就是将从该节点到 最高层的域名串连起来,中间使用一个点“.”分隔这些节点。例如,一个完整的域名为 www.bjbook.net
  • 域名树中的每个节点必须有一个唯一的名称,但域名树中的不同层级节 点可使用相同的标识,只要在不同的父节点下即可

三、DNS报文格式

  • DNS采用客户机/服务器模型。DNS默认使用TCP和UDP端口 53。DNS的请求和应答封装在UDP报文中

会话标识

  • 报文头部的会话标识字段由客户端生成随机值填充并由服务器原样 返回。客户端通过该字段来匹配请求和响应

flags

  • flags部分非常复杂,如果是请求一般为0x0100。如果为响应,通常有两种情况:0x8182表示服务器失败;0x8180表示服务器 成功响应

问题数目、回答资源记录数、授权资源记录数目、额外资源记录数目

  • 对于查询报文,问题数目通常是1,而其他3项则均为0。对于应答报文,问题数目还是1,回答数至少是1

问题

  • 问题部分中每个问题的格式由 3 部分顺序组成:查询内容、类型(Type)和类(Class)。 类型和类均为固定的两个字节长度
  • 查询内容长度不定,它是一个或多个标识符的序列。每个标识符以首字节的计数值来 说明随后字符串的字节长度,每个名字的最后字节为 0 表示结束。计数字节的值必须是 0~ 63 的数字,因为标识符的最大长度为 63。高位字节为二进制 11 时,用于压缩格式,指向 报文的查询字符串位置,字符串位置是从 DNS 报文头部开始计算的

回答资源记录、授权资源记录、附加信息资源记录

  • DNS 报文中最后 3 个字段分别为回答字段、授权字段和附加信息字段,均采用资源记 录(Resource Record,RR)格式。资源记录格式内容顺序包含域名、类型、类、生存时间、 数据长度和数据6部分
  • 如下图所示:域名是记录中资源数据对应的名字。它的格式和前面介绍的查询名字段格式相同。类 型和类与问题域内容格式相同。生存时间字段占4个字节,是客户程序保留该资源记录的 秒数,这里已转换为 15 分钟。资源数据长度占两个字节长度。数据部分的格式依赖于类型字段的值,这里的资源数据是4字节的IP地址

四、域名解析器原理

  • 用户程序通过解析器与名字服务器交互;用户查询和响应是 C 语言编程接口的入参和 返回值,用户查询一般是调用 getaddrinfo 函数获取 IP 地址,Linux 操作系统通常不缓存查 询结果,每次均调用接口函数进行查询。现在域名解析器动态库已经成为 Linux 主机操作 系统的一部分,供给每一个进程使用
  • 注意,如果未配置名字服务器,解析器将默认向 127.0.0.1 发起查询

下图所示为 Linux 系统的 DNS 解析实现原理。解析器通常对几个不同的名字服务 器进行多个查询,才能回答特定用户的查询,因此用户域名查询可能涉及对几个网络的访问和很长的时间

  • ①解析库首先查询主机执行流程,查询hosts文件是否有对应域名配置
  • ②如果host文件没有该域名,则在resolv.conf文件中取出第一个域名服务器地址
  • ③然后向域名服务器地址发起域名查询请求
  • ④等待查询响应。如果超时,则向下一个域名服务器发起查询

/etc/resolv.conf配置文件

  • 域名解析器提供因特网域名系统(DNS)的解析C函数库。解析器配置文件名默认为resolv.conf,包含C函数库所需的信息,域名解析时首先读取这个文件
  • 这个文件的可读 性非常好,包含一系列的关键词,提供各种类型的解析器信息
  • 常见的配置如下:
    • nameserver:用于配置名字服务器,最多可以设置 3 个名字服务器,每一行一个。 如果有多个名字服务器地址,解析库将按照列表顺序查询。若第一个名字服务器查询超 时,再顺序查询下面的名字服务器,直到所有的名字服务器都尝试一遍。如果没有名 字服务器地址或者这个配置文件不存在,则默认使用本机(127.0.0.1)作为名字服务器 地址
    • domain:可以使用相对于本地域名的短名来查询。如果域名没有配置,则返回主机名
    • search:search 定义域名的搜索列表,当要查询没有域名的主机时,将在由 search 声明的域中分别顺序进行查找,是只有使用短名时所要附加的域名后缀。domain 和 search 不能共存,如果同时存在,后面出现的将覆盖前面的定义

五、域名解析实例

①没有/etc/resolv.conf 配置文件

  • 解析库默认向本机(127.0.0.1)发起域名查询,因 OpenWrt 本身带有 dnsmasq 提供服 务,因此可以返回响应
  • 下图为访问域名时的请求和响应报文

②配置多个域名服务器地址

  • resolv.conf 配置如下:

  • ping 163.com:首先向第一个服务器 59.108.61.61 发起查询 163.com 的 IP 地址,如果 查不到将使用下一个域名服务器来进行查询

③配置有domain

  • resolv.conf配置如下图所示,这种情况下如果访问完全合格域名,则直接向域名 服务器发起查询;如果不是完全合格域名,则首先在 hosts 文件中进行查找,如果在 hosts 文件中找不到主机名的 IP 地址,则再向名字服务器发起查询请求。如果是不带点的字符 串,则加上域名后缀向名字服务器发起查询请求,如果中间带有点,则认为是一个域名, 将不用加上域名后缀,直接使用该字符串向名字服务器发起请求

  • ①执行“ping 163.com”命令,首先在 hosts 文件中查询主机 163.com 的 IP 地址, 如果查不到将直接向名字服务器查询 163.com 的 IP 地址,找到后向目的 IP 发起 ICMP 请求
  • ②执行“ping openwrt”命令,首先在 hosts 文件中查询主机 openwrt 的 IP 地址,如 果查不到将拼接域名后缀“bjbook.net”,然后向名字服务器查询 openwrt.bjbook.net 的 IP 地址,找到后向目的 IP 发起 ICMP请求

猜你喜欢

转载自blog.csdn.net/qq_41453285/article/details/102713115