LINUX域名解析简述
一、什么是DNS?
众所周知,网络通讯大部分是基于TCP/IP的,而TCP/IP是基于IP地址的,所以计算机在网络上进行通讯时只能识别如“202.96.134.133”之类的IP地址,而不能认识域名。我们无法记住10个以上IP地址的网站,所以我们访问网站时,更多的是在浏览器地址栏中输入域名,就能看到所需要的页面,这是因为有一个叫“DNS服务器”的计算机自动把我们的域名“翻译”成了相应的IP地址,然后调出IP地址所对应的网页。
DNS( Domain Name System)是“域名系统”的英文缩写,是一种组织成域层次结构的计算机和网络服务命名系统,它用于TCP/IP网络,它所提供的服务是用来将主机名和域名转换为IP地址的工作。
二、linux系统中与DNS相关的配置文件
在linux系统中,几乎所有的域名解析工作都是通过resolver类库来实现的,resolver类库是glibc的一部分,也就是libresolv.so。其中包含有很多网络应用程序需要的函数,使用最多的就是gethostbyname(2)和gethostbyaddr(2)函数,它们提供IP地址和域名之间的映射功能。
那么现在的问题是这些函数是怎样去做域名解析的工作的呢?
这里就牵扯到跟域名解析相关的几个配置文件了,分别为/etc/hosts,/etc/host.conf,/etc/nsswitch.conf和/etc/resolv.conf。
(1)/etc/hosts
/etc/hosts文件包含了IP地址和主机名之间的映射,还包括主机名的别名,以达到快速解析的目的。在没有域名服务器的情况下,系统上的所有网络程序都通过查询该文件来解析对应于某个主机名的IP地址,否则就需要使用DNS服务程序来解决。通常可以将常用的域名和IP地址映射加入到hosts文件中,实现快速方便的访问。通常情况下这个文件首先记录了本机的ip和主机名。
这里稍微解释一下主机名(hostname)和域名(Domain)的区别:主机名通常在局域网内使用,通过hosts文件,主机名就被解析到对应ip;域名通常在internet上使用,但如果本机不想使用internet上的域名解析,这时就可以更改hosts文件,加入自己的域名解析。
比如局域网中我们有三台主机,每台做不同的事,一台做MAIL服务器,一台做FTP服务器,一台做SMB服务器,那么我们就可以这样来设计hosts文件内容:
127.0.0.1 localhost.localdomain localhost
192.168.1.2 ftp.localdomain ftp
192.168.1.3 mail.localdomain mail
192.168.1.4 smb.localdomin smb
把这上面这个配置文件的内容分别写入每台机器的/etc/hosts内容中,这样这三台局域网的机器就可以通过主机名来访问了。
(2)/etc/host.conf
/etc/host.conf是老版本glibc使用的,自从glibc 2.x之后就不再使用了,这里还是做个简单的介绍。
/etc/host.conf主要告诉老版本glibc的resolver类库按照什么样的顺序来解析域名。
# The "order" line is only used by old versions of the C library.
order hosts,bind
multi on
这是我的host.conf配置文件的内容,我们这里只关系order这行,”hosts,bind“的意思是先查询/etc/hosts文件,如果解析不成功,再通过/etc/resolv.conf配置的DNS服务器去解析域名。
(3)/etc/nsswitch.conf
自glibc 2.x版本之后,关于域名解析的相关配置就被/etc/nsswitch.conf替代了。
相对与/etc/host.conf来说,/etc/nsswitch.conf的功能更多,可控性和灵活性更强。
/etc/nsswitch.conf允许我们做很多配资,域名解析只是其中的一个。
# /etc/nsswitch.conf
#
# Example configuration of GNU Name Service Switch functionality.
# If you have the `glibc-doc-reference' and `info' packages installed, try:
# `info libc "Name Service Switch"' for information about this file.
passwd: compat
group: compat
shadow: compat
hosts: files mdns4_minimal [NOTFOUND=return] dns mdns4
networks: files
protocols: db files
services: db files
ethers: db files
rpc: db files
netgroup: nis
其中的hosts表明这一行是用于域名解析的配置,后续的各项指定查询(lookup)的顺序 - 从左往右,知道解析成功停止。
files表明查询本地的/etc/hosts文件。
dns表明表明使用/etc/resolv.conf文件中配置的DNS服务器。
/etc/nsswitch.conf还允许我们控制查找过程中的某些行为,通俗点说就是根据前面的查找结果做出相应的处理动作。语法如下:
[ [!] status = action ... ]
其中,status可以有success | notfound | unavil | tryagain
action可以有return | continue。
举个例子:
hosts: dns [!UNAVAIL=return] files
首先前面的hosts:告诉resolver类库该行是配置的域名解析行为的,接着dns告诉它先通过/etc/resolv.conf中配置的DNS服务器来域名解析。[!UNAVAIL=return]的意思是当结果是SUCESS、NOTFOUND和TRYAGAIN时返回,否则继续通过文件/etc/hosts文件解析 -- 意思就是说只有在DNS服务器在不可用的情况下才通过/etc/hosts来域名解析。
(4)/etc/resolv.conf
参考链接:
《Ubuntu DNS 修改 /etc/resolv.conf 被清空 或重启不生效解决》
更多推荐
所有评论(0)