web-dev-qa-db-ja.com

「検索」が設定されていない場合に追加のDNSクエリを防止する

問題のホストは、ホスト名がfoo.example.orgに設定されたArchLinuxを実行しています。 /etc/resolv.confにはsearchディレクティブはありません。

ping example.comまたはcurl example.comまたはwget example.comexample.comが存在しない、NXDOMAIN)の場合、4つのDNSクエリ、example.comのA/AAAAクエリのペア、およびexample.com.example.orgのA/AAAAクエリのペアがあります。

example.com.example.orgsearchディレクティブがないの場合でも、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の解決プロセスを停止するにはどうすればよいですか?

3
Zhuoyun Wei

まず、これは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で観察されるように)はこれです:

searchdomainがなく、gethostname(2)に従ったホスト名にドメイン部分がない場合、検索は無効になります。

一方、_search ._(または_domain ._を指定し、searchを指定しない場合)は検索しますが、返される結果は検索しなかった場合と同じになります。冗長な同一のクエリを作成するだけです。 (バグ?)

これは一種の奇妙な動作です。「ルートドメインが想定されている」場合、ルートドメインを明示的に指定すると検索が無効になり、代わりに冗長なクエリが生成されます。


システムのホスト名を設定する方法については、さまざまな考え方があります。

FQDNを全面的に使用することは、おそらく今日最も明白なアプローチであり、FQDNの構築に使用されるドメインに関する考えられる疑問符をすべて削除します。

システムホスト名を実際のホスト名のみ(ドメインなし)に設定している場合は、gethostname(2)gethostname(3)から異なる値を取得します(後者は、リゾルバーを使用して必要に応じてFQDNを動的に生成します、実際には、通常、ローカルシステムの_/etc/hosts_のエントリと一致します)。アプリケーションが何を要求するかに応じて、たとえばhostname vs _hostname --fqdn_で見られるように、ホスト名またはFQDNのいずれかのみを取得します。

上記の選択が実際にsearchを無効にする機能にもどのように影響するかはあまり期待されていません。
しかし、奇妙なことに、検索をグローバルに無効にしたい場合、検索する名前が明示的に絶対的であるか(末尾にドットがあるか)にかかわらず、現在のglibcバージョンはgethostname(2)がドメインのないホスト名を返す場合にのみ、検索を適切に無効にします。

3

/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
2
yoonix