Linux域名解析服务的配置由三个基本的配置文件决定: /etc/hosts, /etc/resolv.conf与/etc/nsswitch.conf。本文结合这三个文件各自的作用与联系介绍Linux的域名解析服务。

/etc/hosts

/etc/hosts文件包含了IP地址和主机名之间的映射,可能还包括主机名的别名,合法条目格式如下:

IP_address canonical_hostname [aliases...]

系统上的所有网络程序首先通过查询该文件来解析对应于某个主机名的IP地址,如果没有解析成功再使用DNS服务程序解析。
通常可以将常用的域名和IP地址映射加入到hosts文件中,实现快速方便的访问。通常情况下这个文件首先记录了本机的ip和主机名。

/etc/resolv.conf

/etc/resolv.conf配置了DNS客户,它包含了主机的域名搜索顺序和DNS服务器的地址,合法条目格式如下:

nameserver Name server IP address
domain Local domain name
search Search list for host-name lookup
sortlist

其中:
nameserver 声明DNS服务器的IP地址。可以有很多行的nameserver,每一个带一个IP地址。在查询时就按nameserver在本文件中的顺序进行,且只有当第一个nameserver没有反应时才查询下面的nameserver。
domain 声明本地域名。在本地域名下的请求可以直接使用短名(Short Name),例如设置了domain example.com,要访问email.example.com主机1,可以直接用email这个短名来访问,就可以访问到email.example.com主机。
search 声明域名搜索列表。其默认值为domain设置的值,当search设置值以后,domain值就失效了。当要查询没有域名的主机(如email),解析器将轮流使用search声明的域名(如search google.com baidu.com)进行组合来查找主机(将查找到email.google.com,然后就停止解析了,不会再对baidu.com域进行检索)。
sortlist 允许将得到域名结果进行特定的排序。它的参数为网络/掩码对,允许任意的排列顺序。

/etc/nsswitch.conf

自glibc 2.x版本之后,Linux的域名解析服务就由Name Service Switch (NSS) 接管了,其配置文件为/etc/nsswitch.conf。
NSS并不是只管域名解析的,管域名解析的是它配置文件的hosts字段:

hosts: files dns

其中,files指定了搜索/etc/hosts文件,且其优先级最高;dns字段则指定了前面用/etc/resolv.conf建立的主机数据库(hosts database)。

[Reference]

  1. Domain name resolution
  2. Arch manual pages - HOSTS(5)
  3. Arch manual pages - RESOLV.CONF(5)
  4. Arch manual pages - NSSWITCH.CONF(5)

  1. 域名和主机名都是IP的别名,为了避免记忆数字IP而设计出来的人类易读的形式。透过解析器(Resolver),可以将域名和主机名解析为对应的IP。域名的范围要比主机名大,一个域名下可以有多个主机名,例如,域名abc.com下,有主机server1和server2,其主机全名就是 server1.abc.com 和 server2.abc.com 。server1.abc.com 和 server2.abc.com 同时也是abc.com的子域名。 ↩︎