Рассматриваемый хост работает под управлением 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
.
Как я мог это остановить? Возможные решения / обходные пути, которые я пробовал:
foo.example.org
к foo
. Дополнительные запросы к example.com.example.org
не отправляются. Но я не хочу менять имя хоста.search invalid
директива к /etc/resolv.conf
. Дополнительные запросы к example.com.example.org
не отправляются. Но example.com.invalid
отправляются вместо этого. (Обратите внимание, что .invalid - это зарезервированные TLD ICANN)Как я мог сделать процесс разрешения 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