サーバーで動作するように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 squeezeを実行)です。
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のどこにあるテンプレートですか?
現在、このファイルの正しい/最良のフォームであると考えられていますか?
行内の名前の順序は重要ですか?私は望みません。
より一般的には、これらの2つの行がなぜそのように構成されているのかについての説明は何ですか?
今のところ、サーバーを変更すると思います/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
私のネットベースのバージョンは4.45です。
行の最初の名前がIPアドレスの逆ルックアップに返されることを期待しています。
まとめ
あなたはいつも持っているべきだった
127.0.0.1 localhost.localdomain localhost
あなたの場合、あなたは永久的なIPアドレスを持っていないので、あなたも持っていることができます
127.0.1.1 machinename.domain machinename
この行はGNOMEなどの一部のアプリケーションに必要なようですが、実際には他のアプリケーションで問題が発生する可能性があります。
システムのホスト名を解決するための提案された新しいスキーム を参照してください。
事実上、マシンには2つのホスト名があります。
localhost.localdomain
は、同じマシンで実行されている2つのTCP/IP対応プロセス間のプライベート通信に使用される名前です。
machinename.domain
は、マシンとマシンに接続されているマシン間の通信に使用される名前です。
常にlocalhost.localdomain
が127.0.0.1
(およびIPv6を使用している場合は::1
)を指すようにする必要があります。このように、同じマシン上の2つの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アドレスがある場合、DHCPサーバーが返したものに基づいてエントリを含めるように/etc/hosts
を編集するためにさまざまなスクリプトが使用されました。
ただし、システムに永続的なネットワーク接続がなかった場合、信頼できるアドレスが1つもなかったため、そのようなエントリを追加できませんでした。
それで人々は何かを始めました
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 ループバックデバイスの接続用。
プログラムはマシンの名前を取得してから、nameのアドレスを検索し、最初に見つかったアドレスを使用して、そのネットワークインターフェイスにバインドします。マシンの名前が127.0.0.1
に解決された場合4 アドレス、つまりmachinename.domain
で実行されていると考えられるサービス(つまり、ネットワーク全体で利用可能)は、実際には同じマシンで実行されている他のプロセスでのみ利用可能でした。
Andyが指摘するように、名前の順序は重要ではありません。 127.0.0.1
のホスト名を検索しようとすると、ホストの正規名/公式名/プライマリ名として最初の名前が取得されますが、これは前方および後方に解決されるため、これがどのように発生するかはわかりませんいずれかの形式を想定している/etc/hosts
を編集するための自動化ツールがない限り、問題。
しかし、私は / etc/hostsの形式 で述べたように、常に完全修飾ドメイン名(つまり、ドメイン名を含む名前)を最初に持っているべきだと思います。
1行ではなく2行を使用する別の同様の形式があります。
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
エントリは不要になりました。
脚注