Debian 的 /etc/hosts

Fah*_*tha 6 networking debian hosts

我试图获得一个与 PostgreSQL 数据库联系以在服务器上工作的 perl 脚本。这个脚本神秘地失败了。然后我意识到这localhost不在/etc/hosts文件中。

这台机器的文件(目前正在运行 Debian lenny)目前看起来像

127.0.0.1       machinename.domain   machinename
xxx.xx.x.xxx    machinename.domain   machinename
Run Code Online (Sandbox Code Playgroud)

xxx.xx.x.xxx是IP地址。我当前家用机器的文件,这是一个稍旧的安装(当前运行 Debian 挤压)是

127.0.0.1       machinename          localhost
127.0.1.1       machinename.domain   machinename
Run Code Online (Sandbox Code Playgroud)

我的家用机器位于路由器后面,没有直接暴露在互联网上。无论如何,我使用的是 DSL 并且没有静态 IP 地址。

/etc一段时间以来,我一直对我的机器进行版本控制(使用 etckeeper),我看到对于这台服务器,某些策划者(可能是我自己)在 2009 年 12 月 17 日进行了以下更改。

-127.0.0.1      localhost
+127.0.0.1      machinename.domain  machinename
Run Code Online (Sandbox Code Playgroud)

我以前想知道为什么这个文件是这样设置的,但答案并不明显。一些问题:

  1. 为什么127.0.1.1?这可能是 Debian 特有的一段历史。我在网上搜索了一下,发现了一些关于 Gnome 的模糊的嘀咕,但几乎没有任何实质内容。

  2. 在 Debian 中,这个文件的模板是从哪里设置的?

  3. 目前是否认为该文件有正确/最佳形式?

  4. 行中名称的顺序是否重要?我希望不是。

更一般地说,为什么这两条线的结构是这样的?

现在,我想我会将服务器更改/etc/hosts

127.0.0.1       machinename.domain  machinename localhost
xxx.xx.x.xxx    machinename.domain  machinename
Run Code Online (Sandbox Code Playgroud)

注释?

Mik*_*kel 8

概括

你应该一直有

127.0.0.1    localhost.localdomain localhost
Run Code Online (Sandbox Code Playgroud)

在你的情况下,因为你没有一个永久的 IP 地址,你也可以有

127.0.1.1    machinename.domain machinename
Run Code Online (Sandbox Code Playgroud)

像 GNOME 这样的一些应用程序似乎需要这一行,但它实际上可能会导致其他应用程序出现问题!

请参阅建议的解析系统主机名的新方案


实际上,您的机器有两个主机名。

localhost.localdomain 是用于在同一台机器上运行的两个支持 TCP/IP 的进程之间进行私有通信的名称。

machinename.domain 是用于在您的机器和连接到您机器的机器之间进行通信的名称。

您总是想localhost.localdomain指向127.0.0.1::1如果您使用的是 IPv6)。这样,同一台机器上的两个 TCP/IP 进程之间的所有通信都将使用lo(环回)接口,这通常是防火墙等允许的iptables,无需担心您的网络是否可用或 DNS 是否正常工作。

一些应用程序(例如 GNOME 1)尝试对所有内容使用您机器的公共名称,即使在与同一台机器交谈时也是如此。这是为了让 GNOME 的一部分可以与 GNOME 的另一部分通信,即使它运行在您网络上的另一台机器上。(GNOME 中的 N 最初代表“网络”。)

理想情况下,您的机器名称使用 DNS 或其他共享数据库已知,其他机器也可以使用这些共享数据库来确定您的机器地址,以便其他机器上的应用程序可以与您的机器通信。

但是,如果您的机器名称不在 DNS 中,或者 DNS 不工作,那么像 GNOME 这样的程序仍然需要一种与自身对话的方法。

有多种修改方法/etc/hosts可以使这项工作正常进行。

最常见的曾经是

127.0.0.1    localhost.localdomain localhost
w.x.y.z      machinename.domain machinename
Run Code Online (Sandbox Code Playgroud)

w.x.y.z您的主要网络接口的地址在哪里,例如eth0.

如果您的系统使用静态 IP 地址并且始终处于连接状态2 ,则可以正常工作

如果您的系统具有动态 IP 地址,/etc/hosts则会使用各种脚本进行编辑,以根据 DHCP 服务器返回的内容包含一个条目。

但是,如果您的系统没有永久的网络连接,则无法添加这样的条目,因为您没有一个可靠的地址。

于是人们开始做类似的事情

127.0.0.1    localhost.localdomain localhost machinename.domain machinename
Run Code Online (Sandbox Code Playgroud)

或者

127.0.0.1    machinename.domain machinename localhost.localdomain localhost
Run Code Online (Sandbox Code Playgroud)

这样,使用 TCP/IP 的进程仍然可以与同一台机器上的其他进程通信,即使它们使用机器名称查找 IP 地址。

但它破坏了其他应用程序。

例如,dnsdomainname

我还记得有一些问题,只有同一台机器上的人才能连接到服务器,因为服务器只监听3 个环回设备上的连接。

该程序将获取机器的名称,然后查找名称的地址,并使用找到的第一个地址,并绑定到该网络接口。如果您的机器名称解析为127.0.0.14地址,则意味着您认为正在运行的服务machinename.domain(因此可用于整个网络)实际上仅可用于同一台机器上运行的其他进程。

正如安迪指出的那样,名称的顺序应该无关紧要。试图查找主机名的东西127.0.0.1会将名字作为的规范/官方/主名称,但因为它会向前和向后解析,我想不出这会如何导致任何问题,除非有一些/etc/hosts需要一种格式或另一种格式的自动化编辑工具。

但是我认为您应该始终首先拥有一个完全限定的域名(即包含域名的名称),正如我在 /etc/hosts 格式中

还有另一种类似的格式,它使用两行而不是一行,例如

127.0.0.1    localhost.localdomain localhost
127.0.1.1    machinename.domain machinename
Run Code Online (Sandbox Code Playgroud)

这是一个巧妙的技巧,因为lo的地址确实是127.0.0.1/8,这意味着127网络中的任何地址都是环回设备。

我假设使用了这种格式,以便需要更改条目的工具 machinename.domain可以在不触及127.0.0.1 localhost...条目的情况下。

但请注意,它仍然会导致machinename.domain映射到lo,因此它仍然会导致我提到的问题。

我也刚刚在 VM 中启动了 Fedora 15 并登录到 Gnome 桌面,但我看不到任何 TCP/IP 连接。他们似乎都在使用 UNIX 套接字。因此,也许127.0.1.1不再需要该条目。


脚注

  1. 过去就是这样。在我的 Fedora 15 测试机器上,它似乎使用 UNIX 套接字而不是 TCP/IP。
  2. 除非在网络启动之前的系统引导期间。
  3. 真正“绑定”而不是“聆听”。
  4. 或任何 127.xxx 地址。


And*_*ndy 4

在我的系统上,我有以下内容/var/lib/dpkg/info/netbase.postinst

create_hosts_file() {
  if [ -e /etc/hosts ]; then return 0; fi

  cat > /etc/hosts <<-EOF
        127.0.0.1       localhost
        ::1             localhost ip6-localhost ip6-loopback
        fe00::0         ip6-localnet
        ff00::0         ip6-mcastprefix
        ff02::1         ip6-allnodes
        ff02::2         ip6-allrouters

EOF
Run Code Online (Sandbox Code Playgroud)

我的netbase版本是4.45。

我希望反向查找 IP 地址时会返回该行的第一个名称,否则我怀疑顺序是否重要。