Mengapa nslookup tidak menggunakan mdns saat ping?

9

Di dnsmasq.conf:

address=/local/127.0.0.1

Dalam 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

Saya bisa menggunakan nslookup:

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

Name:   www.local
Address: 127.0.0.1

Tapi saya tidak bisa menggunakan ping:

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

Saya menggunakan tcpdump untuk menangkap lo sambil ping www.local, tidak ada paket, sementara paket suka

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

muncul dari antarmuka fisik.

Yang berarti ping menggunakan mdns, tetapi mengapa nslookup tidak menggunakan mdns? Mengapa ping tidak akan menggunakan dns normal ketika mdns tidak mengembalikan nilai berguna?

Terima kasih.

dspjm
sumber

Jawaban:

8

pingmenggunakan sistem resolusi nama glibc, yang disebut Name Service Switch. Ini menggunakan /etc/nsswitch.conffile untuk mengetahui ke mana harus mencari untuk menyelesaikan nama ke IP. The hosts:baris dalam file ini merupakan urutan preferensi untuk setiap layanan. Sebagai contoh, filesmewakili /etc/hostsfile lokal , dnsmenggunakan /etc/resolv.conffile untuk menghubungi server DNS, dan mdnsmenggunakan mdns.

Namun, nslookupjangan gunakan itu. Ini berbicara langsung ke server DNS yang ditentukan dalam /etc/resolv.confdan tidak dapat digunakan mdns.

Tapi saya tidak bisa menjawab pertanyaan terakhir Anda. Jika Anda memiliki keduanya mdnsdan dnsmasuk /etc/nsswitch.conf, bahkan dengan yang mdnspertama, itu harus terlebih dahulu mencoba untuk menyelesaikan nama dengan mdns, maka jika tidak menggunakan jawaban dns.

piernov
sumber
Terima kasih @priernov, saya menemukan jawaban dari jawaban terakhir saya juga, yang merupakan baris "host: file mdns4_minimal [NOTFOUND = return] dns myhostname" di nsswitch.conf, itu akan kembali jika tidak ada ip mdns ditemukan.
dspjm
1
Sebenarnya nslookup dapat dibujuk untuk menyelesaikan .local address dengan menentukan server 224.0.0.251 dan port 5353: masukkan mode interaktif nslookup, terbitkan 'server 224.0.0.251', 'set port = 5353', dan kemudian nama host yang harus diselesaikan, misalnya ' Microknoppix.local '. (diuji pada 2 sistem debian. Pada Windows 10 nslookup.exe yang disediakan oleh Microsoft tidak berfungsi, yang diunduh dari isc.org/downloads/bind tidak)
NameOfTheRose
Omong-omong, gunakan getent hosts foo.localjika Anda hanya ingin mencari alamat IP terlepas dari apakah itu mDNS atau DNS. Tidak seperti itu nslookup, getentperintah ini menggunakan nsswitch Perpustakaan GNU C, jadi selalu berhasil.
hackerb9
3

Ini sangat sederhana - nslookupsecara khusus alat DNS - itu bagian dari alat BIND.

Itu hanya tidak tahu tentang layanan nama lain yang panggilan perpustakaan seperti gethostbynamedapat mengakses melalui NSS karena nslookuptidak digunakan gethostbyname, dll.

Alnitak
sumber