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

Почему поиск DNS не учитывает /etc/nsswitch.conf и /etc/host.conf?

У меня проблема, когда имена хостов ищутся из DNS, даже если они присутствуют в / etc / hosts.

У меня настроено следующее:

/etc/host.conf:

order hosts,bind

/etc/nsswitch.conf:

hosts:      files dns

/etc/resolv.conf:

nameserver <nameserver one>
nameserver <nameserver two>

Приложение, работающее на хосте, выполняет некоторые внутренние и внешние запросы API.

Из tcpdump я вижу DNS-запросы к некоторым именам хостов внутренних служб, которые перечислены в / etc / hosts. Я использую команду tcpdump:

tcpdump -tqAlU -s0 port 53 and host <nameserver one>

В дампе вижу такие запросы:

IP 10.0.80.11.domain > app004-private.51308: UDP, length 102
E...I2..>...
.P.
.........I.1E...:...Q.. localhost............   ..@.a.root-servers.net..nstld.verisign-grs.com.w..
IP app004-private.33828 > 10.0.80.11.domain: UDP, length 39
E..Ca.@.@.B.
.2.
.P..$.5./..3e.......... localhost.site.com.....
IP 10.0.80.11.domain > app004-private.33828: UDP, length 96
E..|....>.T;
.P.
.2..5.$.hU.3e.......... localhost.site.com................-.ns10.dnshost.com...dns.8w.............u.....

Обратите внимание, что localhost отправляется DNS, а также localhost.site.com. Запись в / etc / hosts для localhost:

127.0.0.1 localhost.localdomain localhost

И

IP 10.0.80.11.domain > app004-private.51664: UDP, length 93
E..yx...>.m.
.P.
.2..5...e.<N2...........api.site.com................-.ns10.dnshost...dns.5w.............u.....
IP app004-private.51664 > 10.0.80.11.domain: UDP, length 48
E..L`.@.@.C.
.2.
.P....5.8..n............api.site.com.site.com.....
IP 10.0.80.11.domain > app004-private.48878: UDP, length 76
E..h&e..>..w
.P.
.2..5...TQ..............11.80.0.10.in-addr.arpa.............Q............p.... .        :...Q.
IP 10.0.80.11.domain > app004-private.51664: UDP, length 105
E...VX..>..g
.P.
.2..5...qJ.n............api.site.com.site.com................-.ns10.dnshost.'.dns.Aw.............u.....

Где api.site.com находится в / etc / hosts. Запуск getent для запроса api.site.com возвращает:

$ getent hosts api.site.com
10.36.176.114   api001-private api001-private.site.com api001 api.site.com api

Я в тупике. Кажется, все настроено правильно (насколько мне известно), чтобы сначала использовать / etc / hosts затем DNS. Любое понимание того, почему /etc/nsswitch.conf и /etc/host.conf не соблюдаются?

Основное приложение, работающее в системе, - это http (apache 2.2.15 и PHP 5.3.8 с curl 7.30.0). ОС - Centos 5.6, работающая с ядром 2.6.18-238.9.1.el5 и glibc 2.5-58.el5_6.3.

Заранее спасибо!

Мы смогли решить эту проблему, отключив ipv6. Мы отключили ipv6, добавив следующее в /etc/modprobe.conf и перезагрузившись.

alias net-pf-10 off
alias ipv6 off
options ipv6 disable=1

После перезагрузки мы больше не видим DNS-запросы для хостов, перечисленных в / etc / hosts.

Мне не совсем понятно, почему это решает проблему.

Есть много приложений, которые не используют OS-api для запроса имен. Вместо этого они делают явный DNS-запрос.

Если это произойдет - они не пройдут через библиотеку преобразователя.

В Linux вы можете сделать то же самое в командной строке:

  • host YOURHOST попытается разрешить DNS - несмотря ни на что.
  • gethostip YOURHOST будет использовать определенные настройки резолвера в настроенном порядке.

Похоже, ваше приложение использует библиотеку curl, которая имеет свои собственные сложности с функцией разрешения имен, см., Например:

https://stackoverflow.com/questions/29570033/how-can-i-get-libcurl-to-return-me-dnsresolver-used-for-connect-call