サーバーで動作するために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 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
以前は、このファイルがなぜこのように設定されているのか疑問に思いましたが、答えは明確ではありませんでした。いくつかの問題:
なぜ
127.0.1.1
?これはDebianだけのユニークな歴史かもしれません。 Webを検索してGnomeに対するあいまいな主張を見つけましたが、内容はほとんどありません。Debianでは、このファイルはどこで設定されていますか?
このファイルは現在正しい/最良の形式と見なされますか?
行の名前の順序は重要ですか?私はしないことを願っています。
より一般的には、これらの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
::1
lo
iptables
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
(したがってネットワーク全体で利用可能)は、実際には同じコンピュータで実行されている他のプロセスでのみ使用できることを意味します。
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
アイテムが不要になる可能性があります。
脚注
- 以前はそうでした。私のFedora 15テストシステムでは、TCP / IPの代わりにUNIXソケットを使用しているようです。
- ネットワーク起動前のシステム起動中は除外されます。
- 「聞く」というよりは本当に「結ぶ」。
- または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エントリに追加するスクリプトを書くのははるかに困難です。