Почему nslookup не использует mdns, а ping -?

9

В dnsmasq.conf:

address=/local/127.0.0.1

В resolv.conf:

# Generated by NetworkManager
domain example.com
search example.com
nameserver 127.0.0.1
nameserver 10.66.127.17
nameserver 10.68.5.26

Я могу использовать nslookup:

# nslookup www.local
Server:     127.0.0.1
Address:    127.0.0.1#53

Name:   www.local
Address: 127.0.0.1

Но я не могу использовать пинг:

# ping www.local
ping: unknown host www.local

Я использую tcpdump для захвата lo при пинге www.local, пакетов нет, а пакеты вроде

# tcpdump -i em1 -n | grep local

tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on em1, link-type EN10MB (Ethernet), capture size 65535 bytes
20:14:38.189335 IP 10.66.65.188.mdns > 224.0.0.251.mdns: 0 A (QM)? www.local. (27)
20:14:39.190700 IP 10.66.65.188.mdns > 224.0.0.251.mdns: 0 A (QM)? www.local. (27)
20:14:41.192979 IP 10.66.65.188.mdns > 224.0.0.251.mdns: 0 A (QM)? www.local. (27)

появился из физического интерфейса.

Что означает, что ping использует mdns, но почему nslookup не использует mdns? Почему ping не будет использовать обычные днс, когда mdns не возвращает полезного значения?

Спасибо.

dspjm
источник

Ответы:

8

pingиспользуйте систему разрешения имен glibc, которая называется Name Service Switch. Это использует /etc/nsswitch.confфайл, чтобы узнать, где искать, чтобы преобразовать имя в IP. hosts:Строка в этом файле представляет порядок предпочтения для каждой службы. Например, filesпредставляет локальный /etc/hostsфайл, dnsиспользует /etc/resolv.confфайл для связи с DNS-сервером и mdnsиспользует mdns.

Однако nslookupне использует его. Он общается напрямую с указанным в DNS-сервере /etc/resolv.confи поэтому не может его использовать mdns.

Но я не могу ответить на ваш последний вопрос. Если у вас есть как mdnsи dnsв /etc/nsswitch.conf, даже с mdnsпервым, он должен в первую очередь попытаться разрешить имя с mdns, а затем , если не использовать ответ dns.

piernov
источник
Спасибо @priernov, я также нашел ответ на мой последний ответ, который является строкой "hosts: files mdns4_minimal [NOTFOUND = return] dns myhostname" в nsswitch.conf, он вернется, если mdns ip не найден.
dspjm
1
На самом деле nslookup можно убедить разрешить адрес .local, указав сервер 224.0.0.251 и порт 5353: введите интерактивный режим nslookup, введите «server 224.0.0.251», «set port = 5353», а затем укажите имя хоста, которое необходимо разрешить, например, « Microknoppix.local. (протестировано на 2 системах Debian. В Windows 10 nslookup.exe, поставляемый Microsoft, не работает, загружается с isc.org/downloads/bind )
NameOfTheRose
Кстати, используйте, getent hosts foo.localесли вы просто хотите посмотреть IP-адрес независимо от того, является ли он mDNS или DNS. В отличие nslookupот getentкоманды использует GNSS C Library nsswitch, поэтому он всегда работает.
hackerb9
3

Это очень просто - nslookupэто, в частности, инструмент DNS - это часть инструментов BIND.

Он просто не знает о других службах имен, к которым библиотеки gethostbynameобращаются, например, которые могут получить доступ через NSS, потому nslookupчто не использует gethostbynameи т. Д.

Альнитак
источник