ping
, curl
и все другие приложения на самом деле не используют DNS напрямую - они используют предоставляемую ОС функцию "gethostbyname", которая затем вызывает несколько провайдеров. Один из них - "dns" (который говорит с 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).