Debian 的 /etc/hosts
我試圖獲得一個與 PostgreSQL 數據庫聯繫以在伺服器上工作的 perl 腳本。這個腳本神秘地失敗了。然後我意識到那
localhost
不在/etc/hosts
文件中。這台機器(目前執行 Debian lenny)的文件目前看起來像
127.0.0.1 machinename.domain machinename xxx.xx.x.xxx machinename.domain machinename
是
xxx.xx.x.xxx
IP 地址。我目前的家用機器的文件是稍舊的安裝(目前正在執行 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
我之前一直想知道為什麼這個文件是這樣設置的,但答案並不明顯。一些問題:
- 為什麼
127.0.1.1
?這可能是 Debian 特有的一段歷史。我在網上做了一些搜尋,發現了一些關於 Gnome 的含糊的喃喃自語,但幾乎沒有任何實質內容。- 在 Debian 中,該文件設置的模板在哪裡?
- 目前是否認為該文件是正確/最佳形式?
- 行中名稱的順序是否重要?我希望不是。
更一般地說,為什麼這兩條線的結構是這樣的?
現在,我想我將伺服器更改
/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.1
4地址,這意味著您認為正在執行的服務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
不再需要該條目。腳註
- 這曾經是這樣的。在我的 Fedora 15 測試機器上,它似乎使用的是 UNIX 套接字而不是 TCP/IP。
- 網路啟動前的系統引導期間除外。
- 真正“綁定”而不是“聽”。
- 或任何 127.xxx 地址。