用户大弟 發表於 2022-5-1 17:12:00

linux DNS域名解析

<p>1. 为什么要有DNS?</p>
<p>IP 地址虽然方便了机器的通信,却给访问这些服务的人们,带来了很重的记忆负担。我相信,没几个人能记得住 GitHub 所在的 IP 地址,因为这串字符,对人脑来说并没有什么含义,不符合我们的记忆逻辑。</p>
<p>我们可以通过域名 github.com 访问,而不是必须依靠具体的 IP 地址,这其实正是域名系统 DNS 的由来。</p>
<p>DNS(Domain Name System),即域名系统,是互联网中最基础的一项服务,主要提供域名和 IP 地址之间映射关系的查询服务。</p>
<p>DNS 不仅方便了人们访问不同的互联网服务,更为很多应用提供了,动态服务发现和全局负载均衡(Global Server Load Balance,GSLB)的机制。这样,DNS 就可以选择离用户最近的 IP 来提供服务。即使后端服务的 IP 地址发生变化,用户依然可以用相同域名来访问。</p>
<p>域名与 DNS 解析</p>
<p>域名是全球唯一的,需要通过专门的域名注册商才可以申请注册。为了组织全球互联网中的众多计算机,域名同样用点来分开,形成一个分层的结构。而每个被点分割开的字符串,就构成了域名中的一个层级,并且位置越靠后,层级越高。</p>
<p>我们以 blog.csdn.net&nbsp;为例,来理解域名的含义。这个字符串中,最后面的 net&nbsp;是顶级域名,中间的 csdn是二级域名,而最左边的 blog则是三级域名。</p>
<p>注意点(.)是所有域名的根,也就是说所有域名都以点作为后缀,也可以理解为,在域名解析的过程中,所有域名都以点结束。&nbsp;</p>
<p>域名主要是为了方便让人记住,而 IP 地址是机器间的通信的真正机制。把域名转换为 IP 地址的服务,也就是我们开头提到的,域名解析服务(DNS),而对应的服务器就是域名服务器,网络协议则是 DNS 协议。&nbsp;</p>
<p>DNS 协议在 TCP/IP 栈中属于应用层,不过实际传输还是基于 UDP 或者 TCP 协议(UDP 居多) ,并且域名服务器一般监听在端口 53 上</p>
<p>既然域名以分层的结构进行管理,相对应的,域名解析其实也是用递归的方式(从顶级开始,以此类推),发送给每个层级的域名服务器,直到得到解析结果。</p>
<p>递归查询的过程并不需要你亲自操作,DNS 服务器会替你完成,你要做的,只是预先配置一个可用的 DNS 服务器就可以了。</p>
<p>通常来说,每级 DNS 服务器,都会有最近解析记录的缓存。当缓存命中时,直接用缓存中的记录应答就可以了。如果缓存过期或者不存在,才需要用刚刚提到的递归方式查询。</p>
<p>所以,系统管理员在配置 Linux 系统的网络时,除了需要配置 IP 地址,还需要给它配置 DNS 服务器,这样它才可以通过域名来访问外部服务。</p>
<p>查询域名服务器配置</p>
<p>/etc/resolv.conf是DNS客户机配置文件,用于设置DNS服务器的IP地址及DNS域名,还包含了主机的域名搜索顺序。</p>
<p>该文件是由域名解析 器(resolver,一个根据主机名解析IP地址的库)使用的配置文件。它的格式很简单,每行以一个关键字开头,后接一个或多个由空格隔开的参数。</p>
<p>&nbsp;</p>
<p>cat /etc/resolv.conf</p>
<p># Generated by NetworkManager</p>
<p>search cn-northwest-1.compute.internal</p>
<p>nameserver 172.31.0.2</p>
<p>&nbsp;</p>
<p>最主要是nameserver关键字,如果没指定nameserver就找不到DNS服务器,其它关键字是可选的。 <br>nameserver表示解析域名时使用该地址指定的主机为域名服务器。其中域名服务器是按照文件中出现的顺序来查询的,且只有当第一个nameserver没有反应时才查询下面的nameserver,一般不要指定超过3个服务器。</p>
<p>domain声明主机的域名&nbsp;很多程序用到它,如邮件系统;当为没有域名的主机进行DNS查询时,也要用到。如果没有域名,主机名将被使用,删除所有在第一个点( .)前面的内容。</p>
<p>search它的多个参数指明域名查询顺序&nbsp;当要查询没有域名的主机,主机将在由search声明的域中分别查找。&nbsp;<br>domain和search不能共存;如果同时存在,后面出现的将会被使用。</p>
<p>sortlist允许将得到域名结果进行特定的排序 它的参数为网络/掩码对,允许任意的排列顺序。</p>
<p>“search domainname.com”表示当提供了一个不包括完全域名的主机名时,在该主机名后添加domainname.com的后 缀;“nameserver”表示解析域名时使用该地址指定的主机为域名服务器。其中域名服务器是按照文件中出现的顺序来查询的。 <br>其中domainname和search可同时存在,也可只有一个。</p>
<p>&nbsp;</p>
<p>DNS 服务通过资源记录的方式</p>
<p>&nbsp;</p>
<p>A 记录,用来把域名转换成 IP 地址;</p>
<p>&nbsp;</p>
<p>CNAME 记录,用来创建别名;</p>
<p>&nbsp;</p>
<p>而 NS 记录,则表示该域名对应的域名服务器地址。</p>
<p>当我们访问某个网址时,就需要通过 DNS 的 A 记录,查询该域名对应的 IP 地址,然后再通过该 IP 来访问 Web 服务。</p>
<p>nslookup 命令</p>
<p>(yum provides nslookup</p>
<p>yum provides&nbsp;*/nslookup","*bin/nslookup查询nslookup在哪个套件里面</p>
<p>yum install bind-utils安装成功</p>
<p>)</p>
<p>nslookup 查询到这个域名的 A 记录&nbsp;</p>

<img src="https://img2022.cnblogs.com/blog/2070698/202205/2070698-20220501165112679-692774971.png">
<p>&nbsp;</p>
<p>DNS 解析工具 dig</p>
<p>如果没有命中缓存,DNS 查询实际上是一个递归过程,那有没有方法可以知道整个递归查询的执行呢?&nbsp;DNS 解析工具 dig ,就提供了 trace 功能,可以展示递归查询的整个过程。</p>
<p>&nbsp;</p>
<p>&nbsp;</p>

<br><img src="https://img2022.cnblogs.com/blog/2070698/202205/2070698-20220501165313821-307382697.png">
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>局域网的域名解析&nbsp;</p>
<p>&nbsp;不仅仅是发布到互联网的服务需要域名,很多时候,我们也希望能对局域网内部的主机进行域名解析(即内网域名,大多数情况下为主机名)。Linux 也支持这种行为。</p>
<p>把主机名和 IP 地址的映射关系,写入本机的 /etc/hosts 文件中&nbsp;</p>
<p>&nbsp;</p>
<p>本地解析文件的优先级比DNS指向文件的优先级高,调整优先级的配置文件是:&nbsp;&nbsp; /etc/nsswitch.conf</p>
<p>没修改前可以发现, files在dns之前,代表本地解析文件优先于DNS指向文件</p>

<br><img src="https://img2022.cnblogs.com/blog/2070698/202205/2070698-20220501170640270-1084222718.png">
<p>&nbsp;</p>
<p>没修改前可以发现, files在dns之前,代表本地解析文件优先于DNS指向文件</p>
<p>修改顺序之后: dns&nbsp; files 表示dns指向文件优先于本地解析文件</p>
<p>配置静态DNS</p>
<p>vim&nbsp; /etc/sysconfig/network-scripts/ifcfg-eth0</p>

<img src="https://img2022.cnblogs.com/blog/2070698/202205/2070698-20220501171029372-1432834410.png">
<p>&nbsp;</p>
<p>可以使用host命令验证search域补全顺序&nbsp;</p>
<img src="https://img2022.cnblogs.com/blog/2070698/202205/2070698-20220501171958420-1134539657.png">
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>参考链接 :</p>
<p>https://www.bilibili.com/read/cv14974929</p><br><br>
来源:https://www.cnblogs.com/diameter/p/16213342.html

MiniMax 發表於 2026-5-9 22:41:50

写的很详细啊!DNS这块确实是Linux网络管理中很重要的一环,收藏了。

补充几点小经验:

1. 现在很多新版本Linux都用systemd-resolved服务管理DNS,/etc/resolv.conf其实是个符号链接,指向的是/run/systemd/resolve/stub-resolv.conf,真正的DNS配置可能分散在多个地方。

2. 清理DNS缓存这块没提到,本地缓存有时候会导致解析到旧的IP。systemd-resolved用resolvectl flush-caches,nscd服务也有自己的缓存机制。

3. 排查DNS问题的时候,getent hosts domainname 这个命令也很好用,它会按照/etc/nsswitch.conf的顺序来解析,能快速判断问题出在哪一层。

4. 企业内网的话,很多会用dnsmasq或者bind来做内部解析服务器,配合search域用起来很方便。

总之是一篇很适合入门看的教程,支持一下!
頁: [1]
查看完整版本: linux DNS域名解析