/etc/hosts 文件的格式
/etc/hosts 文件是一个普通的文本文件。
允许使用两种类型的行:
- 空行
- 主机名定义
线可以根据需要混合。
注释以井号 (#) 开始,一直到行尾。
关联主机名和 IP 地址
对于每个主机,应该有一行包含以下信息:
IP_address canonical_hostname [aliases ...]
条目的字段由任何空格(空格或者制表符)分隔。
第一个字段是用于此条目中所有主机名的数字 IP 地址。
根据要求,可以使用 IPv4 地址 (10.1.2.3)、IPv6 地址 (2001:0db8:0000:0000:0000:0000:1428:57ab) 或者 IPv6 缩写 (::1)。
在 IP 地址之后,剩余的令牌指定与该 IP 地址关联的本地已知主机名。
按照惯例,IP 地址后的第一个名称是规范或者完全限定的域名。
规范名称的一个例子是 server.example.com;这是主机的正式名称。
为 IP 地址定义的任何剩余名称都是正式主机名的别名或者备用名称。
例如,假设分配给 server.example.com 的职责之一是成为 FTP 站点。
一个合适的别名可能是 myftp.example.com,并且可以将此名称添加到规范名称之后的 /etc/hosts 条目中。
很多时候,别名只是主机名,没有任何域后缀。
例如:
192.168.10.12 server.example.com myftp.example.com myhost myftp
将规范主机名列为第一个定义的优点是 IP 到主机名的转换(类似于反向 DNS 查找)通常只显示找到的第一个名称;约定为此使用规范名称。
在我们的示例中,命令:
$ ping myftp PING myhost.example.com (192.168.10.12) 56(84) bytes of data. 64 bytes from myhost.example.com (192.168.10.12): icmp_seq=1 ttl=64 time=0.023 ms 64 bytes from myhost.example.com (192.168.10.12): icmp_seq=2 ttl=64 time=0.028 ms 64 bytes from myhost.example.com (192.168.10.12): icmp_seq=3 ttl=64 time=0.028 ms
请注意,我们 ping myftp 但结果来自主机 myhost:这是一个可靠的提示,表明我们正在寻址别名,而不是实际主机。
什么是 /etc/hosts 以及为什么使用它?
为了向主机发送网络流量,必须知道该主机的数字互联网协议 (IP) 地址。
IP 地址传统上写为 xxx.xxx.xxx.xxx,其中每个 xxx 代表一个从 0 到 255 的值,用于 IPv4 网络地址。
计算机需要这些地址,但人类发现很难记住数值。
域名服务 (DNS) 提供了一种将一个或者多个字母数字名称与数字 IP 地址相关联的机制。
在 Linux 系统上,这些可读名称由解析器库转换为它们的数字 IP 等效项,包含在作为 glibc RPM 包的一部分提供的 libresolve.so 文件中。
需要查找名称的数字 IP 地址的程序会调用此库。
主机名及其 IP 地址可以在很多地方找到:本地文件、远程 DNS 服务器或者 NIS+ 服务器,仅举几例。
搜索这些资源的顺序取决于 /etc/nsswitch.conf 文件中的 hosts: 条目。
该行通常如下所示:
# vi /etc/nsswitch.conf hosts: files dns
这会导致解析器库首先查询本地 /etc/hosts 文件;如果在那里找不到主机名,则咨询由 /etc/resolv.conf 文件标识的远程 DNS 名称服务器。
Linux 确实提供了绑定 RPM 包,以允许管理域配置和维护自己的 DNS 服务,但本地网络的大小通常只有几台主机,这使得维护 DNS 服务的努力变得毫无根据。