У меня проблема, когда имена хостов ищутся из 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, которая имеет свои собственные сложности с функцией разрешения имен, см., Например: