Prevent additional DNS queries when “search” is not set

The host in question is running Arch Linux with hostname set to foo.example.org. There is no search directive in /etc/resolv.conf.

If I ping example.com or curl example.com or wget example.com (example.com does not exist, NXDOMAIN), there would be four DNS queries, a pair of A/AAAA queries for example.com and a pair of A/AAAA queries for example.com.example.org.

I am surprised to find out that glibc resolver would try example.com.example.org even when there is no search directive in /etc/resolv.conf.

How could I stop this? Possible solutions / workarounds I have tried:

  • Change the hostname from foo.example.org to foo. The additional queries to example.com.example.org are not sent. But I don't want to change hostname.
  • Add a search invalid directive to /etc/resolv.conf. The additional queries to example.com.example.org are not sent. But example.com.invalid are sent instead. (Note that .invalid are reserved TLD of ICANN)

How could I make the resolving process of example.com stop on first try (NXDOMAIN) without continuing to try example.com.something-else?

3
задан 13 April 2018 в 21:54
2 ответа

Прежде всего, это соответствующий раздел из resolv.conf (5) :

  домен Имя локального домена.
  Большинство запросов для имен в этом домене могут использовать короткие имена
  относительно локального домена.  Если установлено в '.', Корневой домен
  считается.  Если запись о домене отсутствует, домен определен.
  добывается из локального имени хоста, возвращенного gethostname (2);  в
  часть домена считается всем, что находится после первого символа '.'.
  Наконец, если имя хоста не содержит части домена,
  предполагается корневой домен.

  search Список поиска для поиска имени хоста.
  Список поиска обычно определяется из локального домена
  имя;  по умолчанию он содержит только локальное доменное имя.  Этот
  можно изменить, указав желаемый путь поиска домена.
  вставка ключевого слова поиска с пробелами или табуляцией, разделяющими имена.
  Запросы резолвера, содержащие менее ndots точек (по умолчанию 1) в
  они будут предприняты с использованием каждого компонента пути поиска
  по очереди, пока не будет найдено совпадение.  Для сред с несколькими
  поддомены, пожалуйста, прочтите параметры ndots: n ниже, чтобы избежать злоумышленников.
  атаки посередине и ненужный трафик для root-DNS-
  серверы.  Обратите внимание, что этот процесс может быть медленным и приведет к
  много сетевого трафика, если серверы для перечисленных доменов
  не локальный, и запросы будут истекать, если сервер недоступен
  возможность для одного из доменов.

  Список поиска в настоящее время ограничен шестью доменами с общим количеством
  256 знаков.
 

Т.е., поиск не просто отключен по умолчанию; если поиск не указан, он использует либо домен , либо, если он также не указан, он использует любую часть домена, присутствующую в том, что возвращает gethostname (2) (т.е. , все, что находится после первой точки в имени хоста локальной системы).

Однако реальная реализация немного странная. На практике (как показано в glibc 2.26) происходит следующее:

Если нет поиска , нет домена и имени хоста согласно gethostname (2) не имеет части домена, поиск отключен.

Если, с другой стороны, вы укажете поиск. (или домен. и не поиск ) он все еще выполняет поиск, но возвращаемый результат будет таким же, как если бы он этого не делал, он просто выполняет повторяющиеся идентичные запросы. (Ошибка?)

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


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

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

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

Менее ожидаемым является то, как вышеупомянутый выбор фактически также влияет на возможность отключения поиска .
Но, как это ни странно, суть в том, что если вы хотите глобально отключить поиск, независимо от того, являются ли имена, которые вы ищите, явно абсолютными (с конечной точкой) или нет, текущие версии glibc, похоже, правильно отключают поиск только в том случае, если gethostname (2) возвращает имя хоста без домена.

3
ответ дан 3 December 2019 в 05:39

Ukuziphatha kokwenza igama lommandla wedomeyini ukuba akukho thambeka okanye ukukhangela kongezwe kwi /etc/resolv.conf kulindeleke kwaye kubhalwe kwiphepha lomntu le-resolutionv.conf.

Ufumana Isigqibo sokuyekisa ukuphatha igama lomamkeli ongafanelekanga ngokufaka ichaphaza elisekugqibeleni ukuze uchaze ukuba lifaneleke ngokupheleleyo.

Igama lomamkeli ku-example.org, akukho thambeka kwi /etc/resolv.conf: [212139] Igama lenginginya elingafanelekanga ukukhangela kune- example.org appended:

[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

Ukongeza ichaphaza ekugqibeleni kuthintela ukuba:

[root@test ~]# ping -c 1 www.
ping: www.: Name or service not known
2
ответ дан 3 December 2019 в 05:39

Теги

Похожие вопросы