hostname in Debian
在装 GNU/Linux 的时候,安装程序都会让我们指定一个 hostname。但是有时却不能通过 hostname 访问远端的机器,这个时候绝大多数人就直接在/etc/hosts里添加一条记录了。
其实,这和 hostname serach path 有关。要把一个 hostname 翻译成对应的 IP,我们的 Linux 系统有三条途径:
- 查询 DNS 服务器,这和 DNS 客户端的配置有关
- 读
/etc/hosts文件 - 问 NIS(Network Information System)服务器
你可以打电话给你的朋友,可以询问现场观众,也可以让电脑去掉一个错误答案。但是先用哪一条求助方式呢?/etc/host.conf告诉 Linux 应该使用哪些求助方式,以及使用它们的顺序。最常见的就像这样:
order hosts,bind multi on
order这一行告诉系统应该先读 /etc/hosts文件,再查询 DNS 服务器。在这里 DNS 服务器被称为 bind 是因为,BIND(Berkeley Internet Name Daemon) 就是一种历史悠久的 DNS 服务器。如果要用 NIS,就在这一行里加上nis就行了。
multi on会让系统在 /etc/hosts里找到所有和所要查询的 host 相匹配的 IP。
如果你的 /etc/host.conf看起来没问题,但是没有办法 ping 到对方的 hostname。那么十有八九是对方的问题。
今天就碰到一个这样的问题,有同学新装了一台 Ubuntu。Ubuntu 在一个局域网里,局域网有自己的 DNS 服务器和 DHCP 服务器。从 Ubuntu 上可以 ping 别人的 hostname,但是没办法从别人的电脑 ping Ubuntu 的 hostname。注意到其他机器都是用的 DHCP。而 Ubuntu 的/etc/hosts没有问题。我联想到 DHCP 服务器有可能被配置成能动态更新 DNS 服务器的了。RFC2136规定了这个协议 DNS Update,因此只要支持 RFC2136 的 DNS 服务器,就能接受 DHCP 服务器发来动态更新信息。这样,只要有新的电脑加入网络,一旦 DHCP 给它分配了 IP 地址,就可以把新电脑指定的 hostname 更新到 DNS 那里去了。DHCP 服务器端的配置可以看 dhcpd.conf 的 manpage。这里主要说客户端的配置。在 Debian 里,客户端的配置一般是 /etc/dhclient.conf。
send host-name \"hostname\";
这样,Debian 就会把自己的 hostname 交给 DHCP 服务器,由它转达给 DNS 服务器。其他电脑就能通过你的 hostname 访问你了。
刚才的案例是一个比较常见的例子,是 DHCP+DNS。如果没有较复杂的网络应用,一般场所不会使用 NIS 服务。NIS 是 Sun 开发的,它希望给用户提供一个网络透明的环境,让用户无论在局域网的那个机器上登录,都有“宾至如归”的感觉,从用户名、用户权限都有一样的设置。这个想法和 Windows NT 的 domain system 很相似。
