ping
, curl
И все другие приложения на самом деле не использовать DNS непосредственно - они используют функцию ОС , предоставляемые «gethostbyname», который затем вызывает несколько провайдеров. Один из них - «днс» (который говорит с DNS-серверами), другой - «файлы» (то есть /etc/hosts
); могут быть дополнительные провайдеры, которые говорят по другим протоколам. Они все настроены через /etc/nsswitch.conf
.
Между тем dig
, host
и nslookup
, по сути, являются клиентами DNS - они обходят функции «gethostbyname» ОС и вместо этого напрямую обрабатывают и отправляют пакеты DNS. (Они были специально написаны таким образом.) В результате они также пропускают /etc/hosts
и любые другие механизмы разрешения имен, и вы ничего не можете настроить, чтобы «исправить» это.
(Сама ОС не собирается проверять каждый пакет UDP, чтобы проверить, является ли он DNS, и также не собирается вставлять поддельный ответ DNS из / etc / hosts только потому, что.)
Единственный способ сделать dig
& c. Честь / etc / hosts состоит в том, чтобы установить фактический DNS-сервер для приложения, с которым можно разговаривать, что обеспечит требуемые статические ответы. Например, dnsmasq будет действовать как кэш / прокси DNS и по умолчанию загружает статические данные из / etc / hosts. В качестве альтернативы, Unbound имеет расширенную конфигурацию «локальных данных», хотя он не может напрямую читать / etc / hosts.
После настройки dnsmasq или Unbound укажите /etc/resolv.conf
127.0.0.1 (или любой другой хост, на котором работает dnsmasq).
/etc/hosts
по умолчанию (если дистрибутив не отключил ее).