hirunesuki
@hirunesuki

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

ループバックアドレスとlocalhostの違いに関して

解決したいこと

表題の件に関しまして、何個かサイトを確認してみたのですが理解ができず…。

BINDのnamed.confを確認していた際にoptionsステートメントのサブステートメントである、listen-onでの記述に疑問を持ちました。

デフォルトでのlisten-onの記述は

listen-on port 53 { 127.0.0.1; };

こちらのとおりです。

この状態でallow-queryをanyした状態でも外部からの問い合わせができない状態です。

しかし、このループバックアドレスをlocalhostに置換してみると外部からの問い合わせが成功します。

127.0.0.1 = localhost

と認識していたのですが、どうして挙動に違いが発生するのでしょうか。

よろしくお願いいたします。

0

3Answer

お目にかかった動作は、確かに興味深いものでした。なぜループバックアドレスの 127.0.0.1localhost に置き換えると、異なる動作になるのか説明させていただきます。

ネットワークアドレッシングの文脈において、127.0.0.1 はループバックアドレスであり、ローカルマシン自体を表します。BINDがこのアドレス(127.0.0.1)での接続を受け入れるように設定されている場合、それはローカルマシンからの接続のみを受け付けます。

一方、localhost は通常、ループバックアドレスに関連付けられたホスト名です。これはローカルマシンを指すより一般的な方法です。'listen-on'ディレクティブで 127.0.0.1localhost に置き換えた場合、BINDは異なる解釈を行います。

設定で localhost を指定すると、BINDはそれを実際の localhost に関連付けられたIPアドレスに解決します。通常、そのIPアドレスは 127.0.0.1 です。この場合、BINDは 'localhost' をループバックアドレスと認識するため、外部のクエリを許可します。

異なる動作が観察された原因は、おそらくBINDが 'listen-on' ディレクティブで提供された値を解釈する方法に起因するものです。直接 127.0.0.1 を使用する場合、BINDは接続をローカルマシンに制限します。しかし、localhost を使用すると、BINDはそれをループバックアドレスに解決し、外部のクエリを許可します。

4Like

Comments

少し興味があってマニュアルを見てみました。

listen-onaddress_match_listacl の順で追っていくとlocalhostの説明に

Matches the IPv4 and IPv6 addresses of all network interfaces on the system.

と記述があり、localhostを指定すると全IPアドレスで待ち受けするとなっています。
なので、BINDの仕様です。

1Like

Comments

  1. @hirunesuki

    Questioner

    @mrbonjin

    ご回答ありがとうございます。
    そちらのドキュメントは確認しておりませんでした。
    ありがとうございます!

  2. 捕捉すると、全てのIPアドレスではなく、全てのインタフェースのIPアドレスなので、
    そこに書かれたIPアドレスはインタフェースにかかわらずマッチしたものが対象ですよということです。

    従って、127.0.0.1 を指定した場合、全てのインタフェースでこのアドレスにマッチするものが対象となりますが、通常127.0.0.1のアドレスを持っているのは loop backインタフェースなのでここだけが対象となるというのはご承知の通りです。

    では、なぜ localhost だと外部から受け付けるのか?

    これは、localhost が 127.0.0.1 ではなく(acl名)だからです。ここに指定するものはIPアドレスですが、複数の条件をまとめたaclも記述できます。localhostはIPアドレスではなく文字列なので acl として解釈された(ドメイン名と解釈してIPアドレスへの変換が行われるわけではない)のでしょう。

    そして localhost という aclは定義されていないので特定のIPアドレスでのlistenは指定されていません。
    この為デフォルトで用意されている全インタフェース(に設定されたIPアドレス)でのlistenが優先されるということでしょう。

  3. @hirunesuki

    Questioner

    補足ありがとうございます。

    非常に分かりやすく、ようやく腑に落ちました!

    ご丁寧にありがとうございます。

127.0.0.1 = localhost

localhostは単純にIPアドレスへ名前解決されるホスト名です。また、BINDはそもそも、名前解決のサービスなので、他PCからの要求に答えられる、IPアドレスでなくては本来の役割を果たせません。

/etc/hosts
127.0.0.1 localhost

BINDではなく/etc/hostsで十分です。

/etc/hosts
0.0.0.0 localhost

或いは上記のようなワイルドカードの名前解決が可能です。
0.0.0.0はip addr 等で確認できる、IPアドレスで名前解決がなされます。

通常、BINDのデーモンにはホスト名ではなく、ip addr 等で確認した、IPアドレスを指定します。

何故なら、BINDはそもそも、名前解決のサービスだからです。

listen-on port 53 { 0.0.0.0; };

ワイルドカードの指定は上記の様になります。

何故、localhostを指定すると全IPアドレスで待ち受けするとなったかは知るよしもありませんが、名前解決のサービスとしてlocalhostは特別(ワイルドカード的)な存在だったのでしょう。

1Like

Your answer might help someone💌