Nslookup, dig и ping возвращают разные значения для меня. Я хочу, чтобы foo.bar.name всегда статически разрешал localhost на моей машине.

Я использовал команду

host foo.bar.name

и отредактировал /etc /hosts, чтобы включить строку

1.1.1.1 foo.bar.name foo

(где 1.1.1.1 IP-адрес моей хост-машины)

Когда я запускаю ping или curl, он ведет себя так, как я хочу.

Но когда я запускаю dig или nslookup, адрес foo.bar.name разрешается совершенно иначе.

Я что-то пропустил?

Какие конфигурации мне нужно изменить, чтобы убедиться, что на этом конкретном хосте разрешение DNS происходит так, как я сказал.

3 ответа3

2

Какие конфигурации мне нужно изменить, чтобы убедиться, что на этом конкретном хосте разрешение DNS происходит так, как я сказал.

Вы можете настроить облегченный DNS-сервер пересылки, такой как unbound где вы можете переопределить любые записи DNS.

Используя ваш пример, он будет выглядеть в unbound конфиге как:

local-zone: "foo.bar.name" redirect
local-data: "foo.bar.name A 1.1.1.1"

Если вы хотите переопределить внешний DNS, вы можете использовать:

local-data: "www.google.com.  1800  IN  A    172.16.34.12"
local-data: 'www.google.com.  7200  IN  TXT "My own TXT record for text"'
local-data-ptr: "172.16.34.12        www.google.com"

Когда вы закончите настройку, протестируйте его с помощью dig @127.0.0.1 foo.bar.name a
Если ваш новый преобразователь работает нормально, тогда установите его как системную, изменив строку nameserver в /etc/resolf.conf на nameserver 127.0.0.1

PS

Некоторые из базовых дистрибутивов Debian устанавливают dnsmasq в качестве кэша DNS. Если вы будете использовать unbound отключите dnsmasq

1

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).

0

Система проверяет по умолчанию в /etc /hosts и затем использует сервер имен. и то, что ты сделал, прекрасно. Просто некоторые программы предназначены для непосредственного общения с серверами имен, например host , nslookup и dig . Вот почему у вас разные результаты.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .