Назад | Перейти на главную страницу

Запретить дополнительные DNS-запросы, если не установлен «поиск»

Рассматриваемый хост работает под управлением Arch Linux с именем хоста, установленным на foo.example.org. Здесь нет search директива в /etc/resolv.conf.

Если я ping example.com или curl example.com или wget example.com (example.com не существует, NXDOMAIN), будет четыре запроса DNS, пара запросов A / AAAA для example.com и пара запросов A / AAAA для example.com.example.org.

Я удивлен, узнав, что преобразователь glibc попробовал example.com.example.org даже когда здесь нет search директива в /etc/resolv.conf.

Как я мог это остановить? Возможные решения / обходные пути, которые я пробовал:

Как я мог сделать процесс разрешения 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) он по-прежнему выполняет поиск, но возвращаемый результат будет таким же, как и в противном случае, он просто выполняет повторяющиеся идентичные запросы. (Ошибка?)

Это своего рода странное поведение: случай, когда «предполагается корневой домен», приводит к отключению поиска, а явное указание корневого домена вместо этого генерирует избыточные запросы.


Что касается того, как установить системное имя хоста, существуют разные точки зрения.

Использование полного доменного имени по всем направлениям, вероятно, является наиболее очевидным подходом в настоящее время, оно устраняет любые возможные вопросительные знаки относительно того, какой домен будет использоваться для построения полного доменного имени.

Если в качестве имени хоста системы задано только фактическое имя хоста (без домена), вы получите разные значения из gethostname(2) и gethostname(3) (последний динамически генерирует полное доменное имя по мере необходимости с помощью распознавателя, на практике обычно соответствует записи в /etc/hosts для локальной системы). В зависимости от того, что запрашивает приложение, оно получит либо только имя хоста, либо полное доменное имя, как можно увидеть, например, с помощью hostname против hostname --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