Как переопределить конфигурацию 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
, Вот почему у вас разные результаты.