OpenWrt之DNS域名解析系统(/etc/resolv.conf)

本文围绕OpenWrt的DNS域名解析系统展开。介绍了DNS基础,包括其作为分布式数据库的作用;阐述了域名结构、报文格式等。讲解了域名解析原理,涉及解析器与名字服务器交互,以及/etc/resolv.conf配置文件的作用。最后通过实例模拟不同配置下的域名解析情况。

OpenWrt之DNS域名解析系统(/etc/resolv.conf)

DNS基础介绍

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

域名结构

DNS 是一个分层级的分布式名称对应系统,采用类似Linux目录树的层级结构。

在这里插入图片描述

  • 其顶端是一个未命名的根节点,然后其下分为好几个基本类别名称(称为顶层域名)。例如com

、org、net和gov等三字域名, 还有 cn、sg、jp 和 us 等两个字符国家地区域名。

  • 每个节点有一个至多 63 个字符长的标识,域名总长度则不能超过 253 个字符。命名标识中不区分大写和小写
  • 命名树上任何一个节点的域名就是将从该节点到 最高层的域名串连起来,中间使用一个点“.”分隔这些节点。例如,一个完整的域名为 www.baidu.com.
  • 域名树中的每个节点必须有一个唯一的名称,但域名树中的不同层级节 点可使用相同的标识,只要在不同的父节点下即可

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 不能共存,如果同时存在,后面出现的将覆盖前面的定义
# cat /etc/resolv.conf 
search lan
nameserver 127.0.0.1
nameserver 127.0.0.1#1053

域名解析实例

模拟各种情况来学习 DNS 解析器原理,包括没有配置文件、配置多个域名服务器和配置 domain 的情况。

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

    • 解析库默认向本机(127.0.0.1)发起域名查询,因 OpenWrt 本身带有 dnsmasq 提供服 务,因此可以返回响应
  • 配置多个域名服务器

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

  • 配有domain

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

      domain bjbook.net
      nameserver 8.8.8.8
      
      • 执行“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请求
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值