LINUX.ORG.RU

Почему /etc/hosts не учитывается при косвенном разрешении имени посредством CNAME?

 , ,


0

3

Здравствуй, ЛОР.

Пусть есть имя узла, указывающее CNAME’ом на другое имя, которое указывает на адрес(а):

$ host irc.freenode.net
irc.freenode.net is an alias for chat.freenode.net.
chat.freenode.net has address 174.143.119.91
chat.freenode.net has address 91.217.189.42
<...>
$ getent hosts irc.freenode.net
185.30.166.38   chat.freenode.net irc.freenode.net
164.132.77.237  chat.freenode.net irc.freenode.net
<...>

Дописываю в /etc/hosts:

127.127.127.127	chat.freenode.net

Ожидаемо имею:

$ getent hosts chat.freenode.net
127.127.127.127 chat.freenode.net

Но вместе с тем я ожидал, что получив от сервера имен CNAME, NSS будет разрешать его так же через /etc/hosts, однако нет:

$ getent hosts irc.freenode.net
174.143.119.91  chat.freenode.net irc.freenode.net
185.30.166.38   chat.freenode.net irc.freenode.net
<...>

Основной вопрос — почему? В смысле, где это документировано?

Вместе с тем, я также был бы рад узнать, что можно сделать, чтоб было, как я сперва предположил.

★★★★★

Да, можно было предположить, что дело в том, что я имя написал неполное, но нет — дописал точку:

127.127.127.127	chat.freenode.net.

— ничего не поменялось.

Zmicier ★★★★★
() автор топика

Надо полагать — потому что так работает NSS. Запрос, попадая в libnss_dns.so, обрабатывается им до конца — то есть, либо до положительного ответа (который и возвращается пользователю), либо до отрицательного ответа (в каковом случае поиск ведётся дальше).

Другими словами, взаимодействие NSS с модулями не является итеративным.

intelfx ★★★★★
()
Последнее исправление: intelfx (всего исправлений: 1)
Ответ на: комментарий от intelfx

потому что так работает NSS

Да я как бы догадался. :-)

Zmicier ★★★★★
() автор топика
Ответ на: комментарий от intelfx

Я сейчас проверил — dnsmasq (который, вроде бы, читает /etc/hosts самостоятельно) ведет себя точно так же. Так что это не похоже на случайность реализации.

Zmicier ★★★★★
() автор топика

Основной вопрос — почему?

В ответе DNS, помимо CNAME, содержится A.
Получив ответ от DNS, резолв завершается.

$ grep '^hosts' /etc/nsswitch.conf
hosts:      files dns myhostname

$ man nsswitch.conf | grep '^ *success'
success     No error occurred and the requested entry is returned.
            The default action for this condition is "return".

ArcFi
()
Ответ на: комментарий от ArcFi

В ответе DNS, помимо CNAME, содержится A.

Ага! А ведь действительно предельно логично — зачем запрашивать еще раз то, что уже получено.

Спасибо.

Zmicier ★★★★★
() автор топика
Последнее исправление: Zmicier (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.