Как переопределить конфигурацию DNS по умолчанию в Ubuntu, чтобы nslookup возвращал статические значения?

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 ответа

ping, curlи все другие приложения на самом деле не используют DNS напрямую - они используют предоставляемую ОС функцию "gethostbyname", которая затем вызывает несколько провайдеров. Один из них - "днс" (который говорит с DNS-серверами), другой - "файлы" (то есть /etc/hosts); могут быть дополнительные провайдеры, которые говорят по другим протоколам. Они все настроены через /etc/nsswitch.conf,

между тем dig, host, а также nslookup по сути, являются клиентами DNS - они обходят функции "gethostbyname" ОС и вместо этого напрямую обрабатывают и отправляют пакеты DNS. (Они были специально написаны таким образом.) В результате они также пропускают /etc/hosts и любые другие механизмы разрешения имен, и вы ничего не можете настроить, чтобы "исправить" это.

(Сама ОС не собирается проверять каждый пакет UDP, чтобы проверить, является ли он DNS, и также не собирается вставлять поддельный ответ DNS из /etc/hosts только потому, что.)

Единственный способ сделать dig & Гр. Честь /etc/hosts состоит в том, чтобы установить фактический DNS-сервер для приложения, с которым можно разговаривать, что обеспечит требуемые статические ответы. Например, dnsmasq будет действовать как кэш / прокси DNS и по умолчанию загружает статические данные из /etc/hosts. В качестве альтернативы, Unbound имеет расширенную конфигурацию "локальных данных", хотя он не может напрямую читать /etc/hosts.

После настройки dnsmasq или Unbound укажите /etc/resolv.conf до 127.0.0.1 (или любого другого хоста, на котором работает dnsmasq).

Какие конфигурации мне нужно изменить, чтобы убедиться, что на этом конкретном хосте разрешение 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 Base устанавливаются dnsmasq как DNS кешер. Если вы будете использовать unbound затем выключите dnsmasq

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

Другие вопросы по тегам