Saya memiliki VM yang menjalankan Debian Wheezy di mana beberapa pencarian nama host memerlukan beberapa detik untuk diselesaikan, meskipun resolver segera menjawab. Anehnya, pencarian dengan getaddrinfo()
terpengaruh, tetapi gethostbyname()
tidak.
Saya telah beralih ke resolver Google untuk mengecualikan kemungkinan bahwa yang lokal rusak, jadi /etc/resolv.conf
sepertinya:
search my-domain.com
nameserver 8.8.4.4
nameserver 8.8.8.8
Saya nsswitch.conf
memiliki garis:
hosts: files dns
dan saya /etc/hosts
tidak mengandung sesuatu yang tidak biasa.
Jika saya mencoba telnet webserver 80
, itu hang selama beberapa detik sebelum mendapatkan resolusi nama. Sebuah ltrace
keluaran [1] menunjukkan bahwa menguasainya adalah dalam getaddrinfo()
panggilan:
getaddrinfo("ifconfig.me", "telnet", { AI_CANONNAME, 0, SOCK_STREAM, 0, 0, NULL, '\000', NULL }, 0x7fffb4ffc160) = 0 <5.020621>
Namun, tcpdump
terungkap bahwa server nama itu menjawab dengan segera, dan hanya pada balasan kedua yang tidak telnet
diblokir. Balasannya terlihat sama:
05:52:58.609731 IP 192.168.1.75.43017 > 8.8.4.4.53: 54755+ A? ifconfig.me. (29)
05:52:58.609786 IP 192.168.1.75.43017 > 8.8.4.4.53: 26090+ AAAA? ifconfig.me. (29)
05:52:58.612188 IP 8.8.4.4.53 > 192.168.1.75.43017: 54755 4/0/0 A 219.94.235.40, A 133.242.129.236, A 49.212.149.105, A 49.212.202.172 (93)
[...five second pause...]
05:53:03.613811 IP 192.168.1.75.43017 > 8.8.4.4.53: 54755+ A? ifconfig.me. (29)
05:53:03.616424 IP 8.8.4.4.53 > 192.168.1.75.43017: 54755 4/0/0 A 219.94.235.40, A 133.242.129.236, A 49.212.149.105, A 49.212.202.172 (93)
05:53:03.616547 IP 192.168.1.75.43017 > 8.8.4.4.53: 26090+ AAAA? ifconfig.me. (29)
05:53:03.618907 IP 8.8.4.4.53 > 192.168.1.75.43017: 26090 0/1/0 (76)
Saya telah memeriksa log firewall host dan tidak ada port 53 yang diblokir.
Apa yang menyebabkan balasan DNS pertama diabaikan?
[1] Saya telah menambahkan beberapa baris ke saya ltrace.conf
sehingga saya dapat melihat di dalam addrinfo
struct.
Jawaban:
Balasan DNS pertama tidak diabaikan.
getaddrinfo()
tidak kembali sampai ia menerima respons terhadap permintaan AAAA pertama (ID: 26090). Jadi masalah sebenarnya di sini adalah mengapa mesin Anda belum segera menerima respons untuk kueri AAAA, sementara itu telah menerima respons untuk kueri A (ID: 54755).Salah satu perbedaan antara
getaddrinfo()
dangethostbyname()
adalah bahwa yang pertama mendukung kedua IPv4 dan IPv6, sedangkan yang kedua hanya mendukung IPv4. Jadi ketika Anda menelepongetaddrinfo()
denganai_family
set ke 0 (AF_UNSPEC
), itu tidak akan kembali sampai mendapat respon (atau memukul timeout) untuk kedua A dan AAAA query untuk nama domain yang disediakan.gethostbyname()
hanya pertanyaan untuk catatan A.Sulit untuk menentukan dari jarak jauh apa yang mungkin menyebabkan masalah Anda, terutama bahwa Anda telah memotong beberapa
tcpdump
output. Sesuatu mungkin secara selektif memfilter / menjatuhkan lalu lintas DNS antara VM Anda dan Google DNS resolver. Saya telah mencoba mereproduksi masalah Anda menggunakan KVM Debian Wheezy VM, tetapitelnet ifconfig.me
hampir segera mencetakTrying <IP_address_here>...
baris (berarti itu sudah menyelesaikan nama saat itu).sumber
Ini disebabkan oleh aturan yang terlalu ketat pada firewall Juniper yang berada di depan infrastruktur VMware.
Saya membuat test resolver sehingga saya bisa melihat kedua sisi percakapan, dan paket yang hilang yang diidentifikasi oleh Kempniu dalam jawabannya yang sangat bagus memang dijatuhkan di suatu tempat di sepanjang jalan. Sebagaimana dicatat dalam jawaban itu,
getaddrinfo()
tanpa keluarga alamat yang ditentukan akan menunggu jawaban yang berkaitan dengan semua keluarga yang didukung sebelum kembali (atau, dalam kasus saya, waktu habis).Rekan saya yang menjalankan jaringan mencatat itu
Jadi firewall melihat respons IPv4, mencatat bahwa itu menjawab permintaan VM, dan menutup jalur masuk untuk port itu. Paket balasan IPv6 berikut karena itu dijatuhkan. Saya tidak tahu mengapa kedua paket berhasil melewati kedua kalinya, tetapi menonaktifkan fitur ini di firewall memperbaiki masalah.
Ini adalah ekstrak terkait dari Juniper KB:
Jika Anda berpikir untuk memperbaiki jawaban ini, mohon junjung juga jawaban Kempniu. Tanpa itu saya masih akan berusaha mencari beberapa masalah konfigurasi pada VM.
sumber