Debian

Debian 的 /etc/hosts

  • May 13, 2011

我試圖獲得一個與 PostgreSQL 數據庫聯繫以在伺服器上工作的 perl 腳本。這個腳本神秘地失敗了。然後我意識到那localhost不在/etc/hosts文件中。

這台機器(目前執行 Debian lenny)的文件目前看起來像

127.0.0.1       machinename.domain   machinename
xxx.xx.x.xxx    machinename.domain   machinename

xxx.xx.x.xxxIP 地址。我目前的家用機器的文件是稍舊的安裝(目前正在執行 Debian 擠壓)是

127.0.0.1       machinename          localhost
127.0.1.1       machinename.domain   machinename

我的家用機器位於路由器後面,不直接暴露在網際網路上。無論如何,我使用的是 DSL 並且沒有靜態 IP 地址。

我已經/etc對我的機器(使用 etckeeper)進行了版本控制一段時間,我看到對於這個伺服器,一些策劃者(可能是我自己)在 2009 年 12 月 17 日進行了以下更改。

-127.0.0.1      localhost
+127.0.0.1      machinename.domain  machinename

我之前一直想知道為什麼這個文件是這樣設置的,但答案並不明顯。一些問題:

  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

註釋?

在我的系統上,我有以下內容/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

我的 netbase 版本是 4.45。

我希望該行中的第一個名稱將被返回以進行 IP 地址的反向查找,否則我懷疑順序是否重要。

概括

你應該一直有

127.0.0.1    localhost.localdomain localhost

在您的情況下,因為您沒有永久 IP 地址,所以您也可以擁有

127.0.1.1    machinename.domain machinename

某些應用程序(如 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

w.x.y.z您的主要網路介面的地址在哪裡,例如eth0.

如果您的系統使用靜態 IP 地址並且始終處於連接狀態,那麼這一切正常2。

如果您的系統具有動態 IP 地址,則可以使用各種腳本進行編輯/etc/hosts以包含基於 DHCP 伺服器返回的條目的條目。

但是,如果您的系統沒有永久的網路連接,則無法添加這樣的條目,因為您沒有一個可靠的地址。

於是人們開始做類似的事情

127.0.0.1    localhost.localdomain localhost machinename.domain machinename

要麼

127.0.0.1    machinename.domain machinename localhost.localdomain localhost

這樣,使用 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

這是一個巧妙的技巧,因為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 地址。

引用自:https://unix.stackexchange.com/questions/11844