Debian の /etc/hosts

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.xxxIPアドレスです。少し古いインストール(現在Debian Freezeを実行している)の現在の自宅コンピュータのファイルは次のとおりです。

127.0.0.1       machinename          localhost
127.0.1.1       machinename.domain   machinename

私の家のコンピュータはルータの後ろにあり、インターネットに直接公開されません。とにかく私はDSLを使用しており、固定IPアドレスはありません。

私は/etcしばらくの間私のコンピュータをバージョン管理(etckeeperを使って)の下に置いていました。

-127.0.0.1      localhost
+127.0.0.1      machinename.domain  machinename

以前は、このファイルがなぜこのように設定されているのか疑問に思いましたが、答えは明確ではありませんでした。いくつかの問題:

  1. なぜ127.0.1.1?これはDebianだけのユニークな歴史かもしれません。 Webを検索してGnomeに対するあいまいな主張を見つけましたが、内容はほとんどありません。

  2. Debianでは、このファイルはどこで設定されていますか?

  3. このファイルは現在正しい/最良の形式と見なされますか?

  4. 行の名前の順序は重要ですか?私はしないことを願っています。

より一般的には、これらの2行が現在の方法で構成されている理由を説明するものは何ですか?

/etc/hostsそれでは、サーバーを次のように変更します。

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

コメント?

答え1

一般化する

あなたはいつも持っている必要があります

127.0.0.1    localhost.localdomain localhost

お客様の場合、永続的な IP アドレスがないため、次のような場合もあります。

127.0.1.1    machinename.domain machinename

この行は、GNOMEなどの一部のアプリケーションに必要なようですが、実際には他のアプリケーションで問題を引き起こす可能性があります!

バラよりシステムホスト名を解決するための新しいソリューションの提案


実際、コンピュータには2つのホスト名があります。

localhost.localdomain同じコンピューターで実行されている2つのTCP / IP使用プロセス間のプライベート通信に使用される名前。

machinename.domainあなたのデバイスとあなたのデバイスに接続されているデバイス間の通信に使用される名前。

常に(IPv6を使用している場合)localhost.localdomainを指したいと思います。これにより、同じシステム上の2つのTCP / IPプロセス間のすべての通信が(たとえば)通常ファイアウォールで許可されている(ループバック)インターフェイスを使用し、ネットワークが利用可能かDNSが利用可能かどうかを心配する必要がなくなります。 。わかりました、働いてください。127.0.0.1::1loiptables

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/hostsDHCPサーバーが返すエントリに基づいてエントリを含めるように編集します。

ただし、システムに永続的なネットワーク接続がない場合は、信頼できるアドレスがないため、そのエントリを追加できません。

それで人々は次のことを始めました。

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(したがってネットワーク全体で利用可能)は、実際には同じコンピュータで実行されている他のプロセスでのみ使用できることを意味します。

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私が言及した問題は引き続き発生します。

また、仮想マシンでFedora 15を起動してGnomeデスクトップにログインしたが、TCP / IP接続を見ることはできません。彼らはすべてUNIXソケットを使用しているようです。したがって、127.0.1.1アイテムが不要になる可能性があります。


脚注

  1. 以前はそうでした。私のFedora 15テストシステムでは、TCP / IPの代わりにUNIXソケットを使用しているようです。
  2. ネットワーク起動前のシステム起動中は除外されます。
  3. 「聞く」というよりは本当に「結ぶ」。
  4. または127.xxxアドレス。

答え2

私のシステムには次のものがあります/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アドレスを逆方向に検索して、行の最初の名前を返したいと思います。それ以外の場合、順序が重要かどうか疑われます。

答え3

以前は、このファイルがなぜこのように設定されているのか疑問に思いましたが、答えは明確ではありませんでした。

テキストファイルから1行を追加または削除することは、スクリプトするのが非常に簡単です。

コンポーネントを追加または削除するために、テキストファイルの1行を編集することははるかに困難です。

したがって、 "hostname -s"と "hostname -f"を実行し、/ etc / hostsから127.0.1.1を削除し、ホスト名の結果を含む新しいスクリプトを追加するスクリプトを作成するのは非常に簡単です。

ただし、127.0.0.1を含む行からホスト名を削除し(オペレータが手動で追加したエントリを中断することなく)、現在のホスト名をlocalhostエントリに追加するスクリプトを書くのははるかに困難です。

関連情報