Pencarian DNS gagal dengan misalnya `ping`, tetapi bekerja dengan` host`

35

Saya menggunakan pfSense 2.0rc3, dan saya telah mengaturnya sebagai DNS forwarder dan mengaktifkan "Daftarkan DHCP sewa dalam DNS forwarder" dan apa yang saya pahami adalah semua pengaturan yang sesuai untuk mendapatkan server DNS untuk pencarian lokal.

Ini berfungsi seperti yang diharapkan dengan Linux dan khususnya saya dapat menjalankan host abcdan ping abc(dan aplikasi lain) dan semuanya bekerja seperti yang diharapkan.

Namun di Mac OS X Lion 10.7 tidak berfungsi seperti yang diharapkan. Secara khusus, hanya pencarian dengan hostperintah yang tampaknya berfungsi, yaitu

$ ping abc
ping: cannot resolve abc: Unknown host

$ host abc
abc.local has address 192.168.1.128

$ ping abc.local
ping: cannot resolve abc.local: Unknown host

$ host abc.local
abc.local has address 192.168.1.128

Mengapa pencarian abcbekerja ketika menggunakan hostperintah tetapi gagal dengan ping(dan aplikasi lain)?

Terima kasih sudah membaca.

Brian M. Hunt
sumber
Saya berakhir dengan situasi yang sama pada MBP Yosemite baru (10,10). Setelah banyak mencari dan mengonfigurasi, inilah jawaban yang berfungsi: apple.stackexchange.com/a/152892 Untuk catatan itu tanpa konfigurasi --AlwaysAppendSearchDomains
Stan Kurdziel

Jawaban:

26

Mengapa mereka membuat perubahan ini, saya tidak tahu, tapi itu membuat saya gila untuk sementara waktu.

Saya tidak tahu mengapa semuanya berfungsi untuk host, tetapi tidak ping, tapi saya pikir itu ada hubungannya dengan sifat kedua utilitas ini. Ping adalah utilitas diagnostik yang sederhana (meskipun sangat membantu) untuk menjatuhkan paket pada kabel yang harus digaungkan kembali kepada Anda. Fungsionalitas pencarian hostname hanyalah efek samping dari pekerjaan dan diserahkan ke penyelesai rekursif sistem (saya percaya - saya belum memverifikasi dengan memeriksa pustaka terkait atau semacamnya). Tugas utama host adalah melakukan resolusi nama DNS, sehingga mengimplementasikan resolur rekursifnya sendiri.

Penyelesai rekursif Apple adalah mDNSResponder. Untuk beberapa alasan, versi mDNSResponder di Lion membutuhkan opsi baris perintah "-AlwaysAppendSearchDomains" untuk berperilaku seperti yang terjadi pada Snow Leopard (setidaknya).

Berikut cara cepat untuk memperbaikinya:

sudo sed -i .orig '/ProgramArguments/,/<\/array>/ {
s/\(<string>-launchd<\/string>\)/\1\
                <string>-AlwaysAppendSearchDomains<\/string>/
}' /System/Library/LaunchDaemons/com.apple.mDNSResponder.plist

(Seharusnya ada dua karakter tab di awal baris kedua hingga terakhir di atas, tapi saya tidak tahu cara mendapatkan editor kecil ini untuk menyisipkan tab, jadi saya menambahkan 16 spasi. Baik harus berfungsi, tetapi tab lebih sesuai dengan jarak file asli.)

Ini akan menambahkan argumen "-AlwaysAppendSearchDomains" ke file plist startup mDNSResponder (dan menyimpan salinan cadangan), tetapi karena ini dikendalikan oleh launchd, sistem itu perlu diberitahu untuk me-restart mDNSResponder.

sudo launchctl unload -w /System/Library/LaunchDaemons/com.apple.mDNSResponder.plist
sudo launchctl load -w /System/Library/LaunchDaemons/com.apple.mDNSResponder.plist

Sekarang, jika Anda memeriksa proses mDNSResponder Anda berjalan, Anda akan melihatnya berjalan dengan argumen baru Anda:

ps auxww | grep mDNSResponder

(Props untuk http://www.makingitscale.com/2011/fix-for-broken-search-domain-resolution-in-osx-lion.html dan http://kavassalis.com/2011/07/wtf-bug -in-os-x-10-7 / , di mana saya menemukan jawaban saya untuk masalah ini.)

Sigsegv
sumber
Perbaikan ini juga berfungsi untuk Mountain Lion (10.8). Saya baru saja menerapkannya ke laptop saya.
Sigsegv
Keren! Senang bisa membantu.
Sigsegv
1
FYI: Ini tidak berhasil di bawah Yosemite. Jika Anda memerlukan AlwaysAppendSearchDomains di Yosemite, coba: apple.stackexchange.com/a/157017/65787 Itu TIDAK memecahkan masalah lokal. Saya di Yosemite, tapi ini memang =) apple.stackexchange.com/a/152892
Stan Kurdziel
Tidak bekerja di El Captain. Dan cara yang lebih mudah untuk dilakukan tampaknyasudo defaults write /System/Library/LaunchDaemons/com.apple.mDNSResponder.plist ProgramArguments -array-add "–AlwaysAppendSearchDomains"
Dmitry Verkhoturov
9

Dari halaman manual host (1):

PEMBERITAHUAN Mac OS X

Perintah host tidak menggunakan nama host dan resolusi alamat atau mekanisme routing kueri DNS yang digunakan oleh proses lain yang berjalan di Mac OS X. Hasil permintaan nama atau alamat yang dicetak oleh host mungkin berbeda dari yang ditemukan oleh proses lain yang menggunakan Mac Nama asli OS X dan mekanisme resolusi alamat. Hasil kueri DNS mungkin juga berbeda dari kueri yang menggunakan pustaka perutean DNS Mac OS X.

Sayangnya, tidak ada informasi tentang bagaimana tepatnya perintah host menyelesaikan nama host. Perilaku ini membuatnya agak tidak berguna untuk debugging, IMHO.

Kiezpro
sumber
6

Sejarah dasar ... nslookup adalah perintah, tetapi ia memiliki implementasi sendiri dari semua rutin resolver itu. Apa yang mulai terjadi adalah bahwa resolver sistem pada platform yang berbeda bekerja secara berbeda dari nslookup. Terkadang, ini akan menghasilkan beberapa hasil yang agak berbeda.

Perintah host dan dig dibuat sebagai "menulis ulang" untuk nslookup. Mereka secara statis menghubungkan fungsi-fungsi penyelesai sistem. Pemecah masalah sistem adalah kumpulan fungsi dalam pustaka C standar sistem mirip UNIX atau UNIX (pada Mac OS X, fungsi-fungsi ini adalah bagian dari pustaka netdb). Dengan melakukan ini, perintah host dan dig selalu berfungsi dengan cara yang sama seperti yang dilakukan resolver sistem untuk OS apa pun yang mereka bangun, tetapi mereka tidak bergantung padanya. Dengan cara ini, mereka adalah alat diagnostik yang sangat baik dalam kasus di mana resolver sistem tidak berfungsi.

CATATAN: Tuan rumah dan gali keduanya membaca daftar server nama dari /etc/resolv.conf kecuali mereka diberikan server nama tertentu untuk diajak bicara. Hanya perintah host yang menggunakan daftar pencarian di file /etc/resolv.conf; penggalian tidak, itu sebabnya seseorang harus selalu memberikan menggali FQDN untuk menyelesaikan apa pun. Kedua perintah itu sepenuhnya mandiri; misal, file /etc/resolv.conf adalah satu-satunya yang tidak ada dalam file biner yang mereka gunakan.

mDNSresponder adalah Bonjour. Saya belum menggali terlalu dalam, tapi saya curiga bahwa pengaturan konfigurasi ini tidak memperbaiki ini atau setidaknya, tidak secara langsung. Saya baru saja mengalami masalah yang sama pada Mac OS X 10.9.1 dan hanya me-restart mDNSresponder memperbaikinya untuk saya. Saya belum pernah melihat masalah ini sebelumnya pada 10.5 -> 10.8 / 10.9 pada sistem lain. Juga, aplikasi GUI tidak terpengaruh olehnya, itu hanya alat-alat baris perintah, seperti ping dan ssh yang rusak.

Jika saya menemukan waktu untuk menggali perpustakaan sedikit lebih banyak, saya akan melihat apakah saya dapat menemukan penjelasan yang lebih lengkap.

Lamont Peterson
sumber
4

Saya telah membuat skrip shell untuk mengotomatisasi perbaikan (dan uninstaller jika Anda membutuhkannya nanti), di sini:

https://github.com/michthom/AlwaysAppendSearchDomains

Ini untuk diberikan kepada pengguna yang kurang teknis di tempat kerja yang mungkin menghindar dari mengedit file sistem secara manual.

Mike Thomson
sumber
4

.local dicadangkan untuk multicast. server mDNS dan DNS di jaringan yang sama menggunakan .local bisa bermasalah.

Jim
sumber
1
Saya lebih suka penjelasan di sini atau tautan ke beberapa dokumentasi. Terima kasih atas berita baiknya!
bmike
3

Host menambahkan sufiks .local dns. Ping tidak. Jika Anda menemukan ini membingungkan, Anda dapat menambahkan .local sebagai akhiran default dalam preferensi sistem jaringan dan sistem akan menambahkan bahwa ketika mencoba untuk menyelesaikan nama host.

bmike
sumber
Ini poin yang bagus, dan maaf saya tidak mengatakannya dalam pertanyaan, tetapi ping abc.localtidak berhasil juga (meskipun host abc.localdemikian). Saya sudah memperbaiki pertanyaannya. pfSense secara otomatis menambahkan domain lokal sebagai domain pencarian ketika mengirimkan sewa DHCP, sehingga tidak akan menjadi masalah.
Brian M. Hunt
Wow - aneh. Apa yang terjadi jika Anda sepenuhnya memenuhi syarat lokal dengan trailing. ? ping abc.local.
bmike
1
Hasil yang sama Jelas ada dua mekanisme pencarian di Mac. Mengapa mereka berbeda sulit dibayangkan.
Brian M. Hunt
Saya tidak yakin jawaban ini bekerja pada Yosemite dan OS baru lainnya. Mungkin kita bisa mendapatkan jawaban yang lebih baik ?
bmike
Ada peringatan dokumentasi bahwa file / etc / hosts hanya digunakan dalam mode pengguna tunggal. Tidak benar. Saya mencegah akses yang tidak disengaja ke banyak orang jahat dengan meletakkan nama mereka di / etc / hosts, routing ke 127.0.0.1 Saya tidak berpikir ini penting untuk pertanyaan ini, meskipun itu pasti menunjukkan Apple memiliki beberapa keanehan. Saya juga mencatat bahwa OS X sering mengubah resolv.conf saya, jadi saya mengatur tugas cron untuk mengembalikannya ke apa yang saya inginkan setiap sepuluh menit.
WGroleau
2

Dalam kasus Anda mencoba semua di atas dan tidak ada yang berhasil maka Anda dapat menambahkan Anda nameserver dan mencari jalan untukSystem Preferences>Network>Advance(bottom right of the window)>DNS tab masukkan deskripsi gambar di sini

Pembaruan /etc/resolv.conf dan ping ini sekarang akan berfungsi. Memperbarui jalur pencarian dengan mengedit /etc/resolv.conf tidak benar-benar berfungsi tetapi ini terjadi karena beberapa alasan.

MEMPERBARUI:

Mengedit /etc/resolv.conf tidak berfungsi karena OS menulis ulang file berdasarkan pengaturan panel Preferensi Sistem.

KETALTHEDON
sumber
1
"mengedit /etc/resolv.conf tidak benar-benar berfungsi" karena OS menulis ulang berdasarkan panel pref.
WGroleau
1
Ini benar-benar trik bagi saya berbeda dengan jawaban yang diterima.
Artem Pyanykh
1

Saya kurang memiliki reputasi yang cukup untuk mengomentari posting Lamont Peterson . Restart mDNSresponder bekerja untuk saya di Mac OS X 10.7 (Lion). Tidak seperti Lamont Peterson, masalah ini menyebabkan masalah dengan satu aplikasi GUI untuk saya - Safari tidak dapat menyelesaikan nama host publik atau pribadi. Berikut adalah langkah-langkah khusus yang saya lakukan dan saya curiga Lamont Peterson juga melakukannya:

sudo launchctl unload /System/Library/LaunchDaemons/com.apple.mDNSresponder.plist
sudo launchctl load -w /System/Library/LaunchDaemons/com.apple.mDNSresponder.plist

The unloadMenutup Down mDNSResponder dan loadmulai itu lagi.

Ini segera menyelesaikan masalah; tidak perlu reboot.

Anda dapat memeriksa apakah telah berhasil dimulai kembali dengan menggunakan listperintah:

$ sudo launchctl list | grep '^PID\|mDNSResponder'
PID     Status  Label
708     -       com.apple.mDNSResponder
-       0       com.apple.mDNSResponderHelper

Kehadiran ID Proses (PID) berarti sedang berjalan. 708akan bervariasi karena ditugaskan oleh OS. Jika status menunjukkan sesuatu selain tanda hubung atau nol, ada yang salah.

Saya tidak tahu bagaimana mDNSResponderHelperberinteraksi dengan mDNSResponder; Saya hanya perlu me-restart mDNSResponder.

Setaa
sumber
1

Dalam satu baris:

sudo kill $(ps ax | grep mDNSResponder | grep -v grep | grep -v Helper | awk '{ print $1 }')
Leon Waldman
sumber
0

mohon dicatat pada nama OSX bisa non-standar, jadi untuk kelengkapan:

  • FQDN dapat di-ping
  • nama dalam file "host" bisa ping

Nama Mac TIDAK secara umum: dua perbaikan harus dilakukan: a) ubah spasi menjadi "-" b) tambahkan .local

jadi misalnya Mac saya: ingconti's MacBook Pro

akan ping di: ingcontis-MacBook-Pro.local

Dan pembukaan prefs bisa Anda lihat:

masukkan deskripsi gambar di sini

ingconti
sumber