avahi: ping tidak bisa menyelesaikan nama host, tetapi nslookup bisa

41

pingmemberitahu saya bahwa itu tidak dapat menyelesaikan beberapa nama host ("ping: unknown host domain.company.local") di URL tetapi ketika saya menggunakan hostatau nslookupdi komputer yang sama pada baris perintah, resolusi berfungsi dengan baik (yaitu cepat dan dapat diandalkan ).

Apa yang menyebabkan ini?

Lebih banyak pengujian: Firefox, wgetdan pingmemiliki masalah yang sama. Mem-ping alamat IP berfungsi.

OS: Linux (Ubuntu 13.04)

Sunting Saya /etc/resolv.confmembaca:

nameserver 127.0.1.1
search domain.company.local

netstat laporan:

Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 127.0.1.1:53            0.0.0.0:*               LISTEN      -               

jadi ada sesuatu yang berjalan pada port ini ( nslookupjuga melaporkan digunakan 127.0.1.1sebagai server DNS).

Tidak ada /etc/*inetd.conf, jadi saya tidak yakin aplikasi mana yang melayani port ini.

Tampaknya yang dnsmasqdigunakan:

/usr/sbin/dnsmasq --no-resolv --keep-in-foreground --no-hosts --bind-interfaces
   --pid-file=/var/run/NetworkManager/dnsmasq.pid --listen-address=127.0.1.1
   --conf-file=/var/run/NetworkManager/dnsmasq.conf --cache-size=0 --proxy-dnssec
   --enable-dbus=org.freedesktop.NetworkManager.dnsmasq
   --conf-dir=/etc/NetworkManager/dnsmasq.d

Semua file dan folder konfigurasi kosong. Karena nslookupkatanya menggunakan 127.0.1.1#53tebakan saya yang dnsmasqbekerja bahkan tanpa konfigurasi. Tapi bagaimana cara mengetahui DNS induk yang diminta?

EDIT2 Menonaktifkan dnsmasqseperti yang disarankan oleh harrymc tidak membantu. Jadi saya berlari strace pingyang memberi saya output aneh ini (hanya bagian yang menarik):

open("/etc/host.conf", O_RDONLY|O_CLOEXEC) = 4
read(4, "127.0.0.1\tlocalhost\n#127.0.1.1\ta"..., 4096) = 613
...
open("/lib/libnss_mdns4_minimal.so.2", O_RDONLY|O_CLOEXEC) = 4
read(4, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\0\f\0\0\0\0\0\0"..., 832) = 832
...
mmap(NULL, 2105560, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 4, 0) = 0x7f7829b00000
...
socket(PF_FILE, SOCK_STREAM, 0)         = 4
fcntl(4, F_GETFD)                       = 0
fcntl(4, F_SETFD, FD_CLOEXEC)           = 0
connect(4, {sa_family=AF_FILE, path="/var/run/avahi-daemon/socket"}, 110) = 0
fcntl(4, F_GETFL)                       = 0x2 (flags O_RDWR)
fstat(4, {st_mode=S_IFSOCK|0777, st_size=0, ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f782a4f8000
lseek(4, 0, SEEK_CUR)                   = -1 ESPIPE (Illegal seek)
write(4, "RESOLVE-HOSTNAME-IPV4 domain.com"..., 44) = 44
read(4, "-15 Timeout reached\n", 4096)  = 20

Jadi pingterlihat /etc/hostsmasuk akal. Maka beban dan mmap()s /lib/libnss_mdns4_minimal.so.2yang masuk akal juga.

Tapi kemudian dia berbicara untuk avahi !?

Yang membawa saya ke posting forum ini: ping tidak membuat permintaan dns .

Saya /etc/nsswitch.confjuga mengandung baris ini:

hosts:          files mdns4_minimal [NOTFOUND=return] dns mdns4

Jika saya pingalamat yang berfungsi, saya melihat bahwa proses juga memuat /lib/libnss_mdns4_minimal.so.2tetapi kemudian, ia melakukan permintaan DNS melalui port 53.

Jadi tebakan saya sekarang /lib/libnss_mdns4_minimal.so.2adalah entah bagaimana memperhatikan bahwa alamat IP berakhir dengan .localdan tidak dengan .comdan kemudian [NOTFOUND=return]dipicu.

Bagaimana cara saya memperbaikinya?

Aaron Digulla
sumber
Apa yang ada di Anda /etc/resolv.conf?
Joseph R.
Mana yang benar dan mana yang salah? Haruskah nama host dipecahkan atau tidak? Anda tidak memberi tahu kami yang mana dari dua masalah yang sangat berbeda yang Anda miliki. (Dan jika itu harus diselesaikan, jelaskan sedetail mungkin bagaimana dan mengapa itu harus diselesaikan, karena itu kemungkinan akan mengarah pada penjelasan mengapa tidak.)
David Schwartz
... dan apa pengaturan proxy HTTP Anda untuk Chrome, Firefox, dan wget.
JdeBP
@ Davidvidchwartz: Saya mengharapkan resolusi bekerja. Apa yang saya tidak mengerti bagaimana nslookupatau hostbisa menyelesaikan nama dan hal lain pada sistem tidak bisa.
Aaron Digulla
1
Jika Anda tidak melakukan berbagi koneksi dengan perangkat lain atau VM melalui komputer Anda, Anda bisa mematikan dnsmasq di Network Manager. Edit /etc/NetworkManager/NetworkManager.confdan komentari dns=dnsmasqbaris (beri tanda # di depannya) lalu lakukan a sudo restart network-manager. Itu akan mematikan resolver lokal. ( sumber )
harrymc

Jawaban:

33

Seperti yang dijelaskan secara rinci dalam posting blog ini , Anda perlu mengedit /etc/avahi/avahi-daemon.conf:

[server]
domain-name=.alocal

Ini mengikat daemon ke domain .alocalalih-alih default .local.

dan restart daemon dengan:

sudo service avahi-daemon restart

Catatan dari posting blog:

Anda mungkin perlu membersihkan DNS, mDNS dan cache penyelesai, serta memulai kembali browser web Anda untuk menghapus cache internal mereka.

Setelah itu, pingdan nslookupmulai setuju.

Terima kasih kepada harrymc karena membuat saya berada di jalur yang benar.

Aaron Digulla
sumber
1
Perhatikan juga, pingakan menggunakan nss, nslookuptidak. (Menggunakan lwres dan, yah, ikat, untuk berbicara langsung dengan resolver)
Ricky Beam
Bagi saya lebih masuk akal untuk mengkonfigurasinya dengan benar daripada menonaktifkannya untuk lokal.
keiki
@ otakun85: Dan bagaimana saya melakukannya?
Aaron Digulla
@ AaronDigulla Anda mengonfigurasinya dan jawaban tertinggi saat ini menonaktifkannya untuk lokal.
keiki
2
Ini luar biasa. Terima kasih banyak. Berjuang dengan ini selama berjam-jam sebelum menemukan posting ini.
fpghost
11

Memodifikasi /etc/nsswitch.conf dan mengganti:

hosts:          files mdns4_minimal [NOTFOUND=return] dns mdns4

oleh:

hosts:          files dns

bekerja untukku.

doep
sumber
2
Ini bekerja dengan biaya layanan AVAHI
Aaron Digulla
8

Hal yang mudah dilakukan: Edit /etc/default/avahi-daemon

Ubah baris:

AVAHI_DAEMON_DETECT_LOCAL=1

untuk

AVAHI_DAEMON_DETECT_LOCAL=0

Mulai ulang avahi-daemon, atau bunuh.

Saya tidak suka Avahi, dan saya tidak menggunakan fitur-fiturnya. Jika Anda ingin benar-benar menonaktifkan avahi, ubah /etc/init/avahi-daemon.conf, mirip dengan yang berikut:

start on (never 
          and filesystem
      and started dbus)
stop on stopping dbus
MikeDawg
sumber
2
Saya tidak peduli jika Anda tidak seharusnya memberikan komentar "terima kasih" di sini, saya hanya ingin mengucapkan terima kasih dan berapa banyak waktu dan energi yang Anda selamatkan. Terima kasih banyak! Saya menggunakan VPN perusahaan untuk melakukan pekerjaan darurat dari mal dan tidak dapat membuat beberapa situs kami berfungsi meskipun semua yang saya coba coba. Saya tidak akan bisa mengatasinya sendiri, itu sudah pasti ...
eresonance
7

sepertinya .local address tidak bisa diakses di ubuntu.

solusinya adalah mengedit /etc/nsswitch.confdan mengubah baris ini:

hosts:          files mdns4_minimal [NOTFOUND=return] dns

dengan ini :

hosts:          files dns
Dragouf
sumber
Jenis pekerjaan ini untuk saya. Dalam kasus saya, baris host memiliki "file menyelesaikan [! UNAVAIL = kembali] mdns4_minimal [NOTFOUND = return] dns" dan mengubahnya menjadi "file mdns4_minimal [NOTFOUND = return] dns" berfungsi. Terima kasih atas penunjuk ke arah yang benar.
Andorbal
Mencoba jawaban lain di atas, menonaktifkan avahi (yang melegakan) dan masih memiliki masalah. Jawaban ini menyelesaikannya untuk saya. Terima kasih
Adam Plocher
3

Jika Anda tidak melakukan berbagi koneksi dengan perangkat lain atau VM melalui komputer Anda, Anda bisa mematikan dnsmasq di Network Manager.

Edit /etc/NetworkManager/NetworkManager.confdan komentari baris (beri tanda # di depannya):

dns=dnsmasq

Lalu lakukan:

sudo restart network-manager

Itu akan mematikan resolver lokal.

Sumber: DNS di Ubuntu 12.04 .

harrymc
sumber
2

Jadi tebakan saya sekarang adalah bahwa /lib/libnss_mdns4_minimal.so.2 entah bagaimana memperhatikan bahwa alamat IP berakhir dengan .local dan bukan dengan .com dan kemudian [NOTFOUND = return] dipicu.

Bagaimana cara saya memperbaikinya?

Tebakan yang cukup bagus, tetapi jawaban lainnya terlalu banyak. Solusi sederhana adalah menghapus bit yang memang dipicu, yaitu hapus saja [NOTFOUND=return] .

Menghapusnya berarti bahwa jika mdns4_minimalkembali NOTFOUND, entri berikutnya pada daftar resolver digunakan. Ini adalah perilaku normal; [NOTFOUND=return]adalah pengoptimalan untuk gagal lebih cepat pada nama yang tidak diketahui tetapi mengasumsikan semua .localnama berada di mDNS.

MSalters
sumber
1

Saya punya kasus yang menarik dengan gejala yang sama (ping, mount dll tidak bekerja, tetapi tuan rumah, gali bekerja). Periksa izin pada file /etc/resolv.conf . Dalam kasus saya, seseorang mengubahnya dan saya tidak punya hak untuk membacanya (walaupuncat /etc/resolv.conf dan mengedit file berfungsi dengan baik).

Bagaimanapun, strace menunjukkan:

open("/etc/resolv.conf", O_RDONLY|O_CLOEXEC) = -1 EACCES (Permission denied)

Dan sebagai hasilnya, ia mencoba untuk query localhost (127.0.0.1) bukannya IP nameserver dari file resolv.conf:

socket(PF_INET, SOCK_DGRAM|SOCK_NONBLOCK, IPPROTO_IP) = 4
connect(4, {sa_family=AF_INET, sin_port=htons(53), sin_addr=inet_addr("127.0.0.1")}, 16) = 0
poll([{fd=4, events=POLLOUT}], 1, 0)    = 1 ([{fd=4, revents=POLLOUT}])

Dan tcpdump tidak menunjukkan lalu lintas DNS saat melakukan ping. Semua berfungsi setelah perbaikan izin:

# chmod 644 /etc/resolv.conf
# ls -l /etc/resolv.conf
-rw-r--r-- 1 root root 111 Oct  3 09:54 /etc/resolv.conf

Masalah lain mungkin atribut yang diperluas dari file atau masalah akses lainnya. Jika demikian, hapus saja file /etc/resolv.conf dan buat kembali dari awal.

Pik Master
sumber
Masalah lain yang saya punya satu server adalah bahwa semua folder root telah kehilangan xbendera mereka , dan dengan demikian banyak biner tidak berperilaku baik. Cara mengatasinya adalah chmod +x /*.
Silex
0

Alasan lain adalah format /etc/hosts. Pastikan tidak ada spasi antara IP dan nama host, alih-alih gunakan TAB. Setelah mengubah ke TAB nama host dapat diselesaikan dengan ping.

127.0.0.1        test.local
         ^^^^^^^^ → Should be a TAB not multiple spaces.
Thomas Lauria
sumber
itu bisa menjadi jawaban tetapi diformat sebagai komentar ...
Francisco Tapia
-1

Atur avahi-daemon di Ubuntu agar Anda dapat mencapai nama host ubuntu.local dari OS host

sudo apt-get install avahi-daemon avahi-temukan avahi-utils libnss-mdns mdns-scan

João Pedro Rodrigues
sumber
Maaf, jawaban ini tidak terkait dengan pertanyaan. Kami tidak menanyakan cara menginstal Avahi. Pertanyaannya adalah bagaimana Avahi dapat memecah pencarian DNS setelah diinstal.
Aaron Digulla