問題のホストは、ホスト名がfoo.example.org
に設定されたArchLinuxを実行しています。 /etc/resolv.conf
にはsearch
ディレクティブはありません。
ping example.com
またはcurl example.com
またはwget example.com
(example.com
が存在しない、NXDOMAIN)の場合、4つのDNSクエリ、example.com
のA/AAAAクエリのペア、およびexample.com.example.org
のA/AAAAクエリのペアがあります。
example.com.example.org
にsearch
ディレクティブがないの場合でも、glibcリゾルバーが/etc/resolv.conf
を試行することに驚いています。
どうすればこれを止めることができますか?私が試した可能な解決策/回避策:
foo.example.org
からfoo
に変更します。 example.com.example.org
への追加のクエリは送信されません。しかし、ホスト名を変更したくありません。search invalid
ディレクティブを/etc/resolv.conf
に追加します。 example.com.example.org
への追加のクエリは送信されません。ただし、代わりにexample.com.invalid
が送信されます。 (.invalidはICANNの予約済みTLDであることに注意してください)example.com
の試行を続行せずに、最初の試行(NXDOMAIN)でexample.com.something-else
の解決プロセスを停止するにはどうすればよいですか?
まず、これはresolv.conf(5)
の関連セクションです。
_domain Local domain name. Most queries for names within this domain can use short names relative to the local domain. If set to '.', the root domain is considered. If no domain entry is present, the domain is deter‐ mined from the local hostname returned by gethostname(2); the domain part is taken to be everything after the first '.'. Finally, if the hostname does not contain a domain part, the root domain is assumed. search Search list for Host-name lookup. The search list is normally determined from the local domain name; by default, it contains only the local domain name. This may be changed by listing the desired domain search path follow‐ ing the search keyword with spaces or tabs separating the names. Resolver queries having fewer than ndots dots (default is 1) in them will be attempted using each component of the search path in turn until a match is found. For environments with multiple subdomains please read options ndots:n below to avoid man-in- the-middle attacks and unnecessary traffic for the root-dns- servers. Note that this process may be slow and will generate a lot of network traffic if the servers for the listed domains are not local, and that queries will time out if no server is avail‐ able for one of the domains. The search list is currently limited to six domains with a total of 256 characters.
_
つまり、search
はデフォルトで単にオフになっているわけではありません。 search
が指定されていない場合は、domain
のいずれかを使用します。それも指定されていない場合は、gethostname(2)
が返すドメイン部分(つまり、最初の以降のすべて)を使用します。ローカルシステムのホスト名のドット)。
ただし、実際の実装は少し奇妙です。実際に起こること(glibc 2.26で観察されるように)はこれです:
search
、domain
がなく、gethostname(2)
に従ったホスト名にドメイン部分がない場合、検索は無効になります。
一方、_search .
_(または_domain .
_を指定し、search
を指定しない場合)は検索しますが、返される結果は検索しなかった場合と同じになります。冗長な同一のクエリを作成するだけです。 (バグ?)
これは一種の奇妙な動作です。「ルートドメインが想定されている」場合、ルートドメインを明示的に指定すると検索が無効になり、代わりに冗長なクエリが生成されます。
システムのホスト名を設定する方法については、さまざまな考え方があります。
FQDNを全面的に使用することは、おそらく今日最も明白なアプローチであり、FQDNの構築に使用されるドメインに関する考えられる疑問符をすべて削除します。
システムホスト名を実際のホスト名のみ(ドメインなし)に設定している場合は、gethostname(2)
とgethostname(3)
から異なる値を取得します(後者は、リゾルバーを使用して必要に応じてFQDNを動的に生成します、実際には、通常、ローカルシステムの_/etc/hosts
_のエントリと一致します)。アプリケーションが何を要求するかに応じて、たとえばhostname
vs _hostname --fqdn
_で見られるように、ホスト名またはFQDNのいずれかのみを取得します。
上記の選択が実際にsearch
を無効にする機能にもどのように影響するかはあまり期待されていません。
しかし、奇妙なことに、検索をグローバルに無効にしたい場合、検索する名前が明示的に絶対的であるか(末尾にドットがあるか)にかかわらず、現在のglibcバージョンはgethostname(2)
がドメインのないホスト名を返す場合にのみ、検索を適切に無効にします。
/etc/resolv.confにドメインまたは検索が追加されていない場合にホスト名のドメインを追加する動作が予想され、resolv.confのマニュアルページに記載されています。
リゾルバーは、完全修飾されていないことを明示的に示すために末尾にドットを追加することで、完全修飾されていないホスト名の処理を停止します。
Example.orgにホスト名、/ etc /resolv.confにドメインがありません:
[root@test ~]# hostname
test.example.org
[root@test ~]# cat /etc/resolv.conf
nameserver 8.8.8.8
修飾されていないホスト名ルックアップには、example.orgが追加されています。
[root@test ~]# ping -c 1 www
PING www.example.org (93.184.216.34) 56(84) bytes of data.
64 bytes from 93.184.216.34 (93.184.216.34): icmp_seq=1 ttl=57 time=82.8 ms
--- www.example.org ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 82.891/82.891/82.891/0.000 ms
最後にドットを追加すると、次のことが防止されます。
[root@test ~]# ping -c 1 www.
ping: www.: Name or service not known