DNS लुकअप में कभी-कभी 5 सेकंड लगते हैं


11

मेरे पास एक VM रनिंग डेबियन व्हीज़ी है जिस पर कुछ होस्टनाम लुकअप को पूरा होने में कई सेकंड लगते हैं, भले ही रिज़ॉल्वर तुरंत जवाब दे। अजीब तरह से, लुकअप getaddrinfo()प्रभावित होते हैं, लेकिन gethostbyname()ऐसा नहीं है।

मैंने Google रिज़ॉल्वर को इस संभावना से बाहर करने के लिए स्विच किया है कि स्थानीय लोग टूट गए हैं, इसलिए मेरा /etc/resolv.confऐसा दिखता है:

search my-domain.com
nameserver 8.8.4.4
nameserver 8.8.8.8

मेरी nsswitch.confलाइन है:

hosts: files dns

और मेरे /etc/hostsपास कुछ भी असामान्य नहीं है।

यदि मैं कोशिश करता हूं telnet webserver 80, तो नाम समाधान प्राप्त करने से पहले यह कई सेकंड तक लटका रहता है। एक ltraceआउटपुट [1] से पता चलता है कि हैंग getaddrinfo()कॉल में है:

getaddrinfo("ifconfig.me", "telnet", { AI_CANONNAME, 0, SOCK_STREAM, 0, 0, NULL, '\000', NULL }, 0x7fffb4ffc160) = 0 <5.020621>

हालांकि, tcpdumpपता चलता है कि नाम देने वाले ने तुरंत जवाब दिया, और यह केवल दूसरे उत्तर पर था जो telnetअनब्लॉक हो गया। उत्तर समान दिखते हैं:

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)

मैंने होस्ट फ़ायरवॉल लॉग की जाँच की है और पोर्ट 53 पर कुछ भी ब्लॉक नहीं किया जा रहा है।

पहले DNS उत्तर को अनदेखा करने का क्या कारण है?

[१] मैंने अपने साथ कुछ पंक्तियाँ जोड़ी हैं ltrace.confताकि मैं addrinfoसंरचना के अंदर देख सकूँ ।


वीएम का एनआईसी सेटअप कैसे है? पाट? नेट?
स्लम

यह स्वाभाविक है। मुझे यकीन नहीं है कि एनएटी को लागू किया गया है (चाहे ईएसएक्स या आगे अपस्ट्रीम); मुझे पता चल सकता है कि क्या आपको लगता है कि यह मामला हो सकता है।
फुल जूल

मुझे संदेह है कि यह NAT + VM है जो इसे प्रभावित कर रहा है।
स्लम

अच्छी तरह से हो सकता है - नीचे केम्पनिउ के जवाब पर मेरी टिप्पणी देखें।
फुल जूल

यह नेटवर्कयुक्त था, लेकिन विशेष रूप से एनएटी इसका कारण नहीं था - नीचे मेरा जवाब देखें।
फ्लाप

जवाबों:


13

पहले DNS उत्तर को अनदेखा नहीं किया जाता है। getaddrinfo()जब तक इसे पहले AAAA क्वेरी (ID: 26090) का जवाब नहीं मिला, वापस नहीं आया। तो यहां असली समस्या यह है कि एएएए क्वेरी के लिए आपकी मशीन ने तुरंत प्रतिक्रिया क्यों नहीं दी, जबकि इसे ए क्वेरी (आईडी: 54755) के लिए प्रतिक्रिया मिली है।

के बीच अंतर यह है getaddrinfo()और gethostbyname()यह है कि पूर्व का समर्थन करता है दोनों IPv4 और IPv6, जबकि बाद केवल IPv4 समर्थन करता है। इसलिए जब आप सेट के getaddrinfo()साथ ai_family0 पर कॉल करते हैं AF_UNSPEC, तो यह तब तक वापस नहीं आएगा जब तक कि इसे दिए गए डोमेन नाम के लिए ए और एएएए दोनों प्रश्नों के लिए प्रतिक्रिया (या हिटआउट) नहीं मिलती । gethostbyname()ए रिकॉर्ड के लिए केवल पूछताछ।

यह निर्धारित करना मुश्किल है कि आपकी समस्या क्या हो सकती है, विशेष रूप से यह कि आपने कुछ tcpdumpआउटपुट काट दिया है । आपके वीएम और Google पब्लिक डीएनएस रिज़ॉल्वर के बीच DNS ट्रैफ़िक को चुनिंदा रूप से फ़िल्टर / ड्रॉप करना कुछ हो सकता है। मैंने केवीएम डेबियन व्हीज़ी वीएम का उपयोग करके आपकी समस्या को पुन: पेश करने की कोशिश की है, लेकिन telnet ifconfig.meलगभग तुरंत ही Trying <IP_address_here>...लाइन को प्रिंट कर दिया (मतलब यह तब तक नाम हल कर चुका है)।


आपके विस्तृत उत्तर के लिए धन्यवाद। मैंने tcpdump के बाहर कुछ भी नहीं काटा है, मैंने केवल यह स्पष्ट करने के लिए एक पंक्ति सम्मिलित की है कि ठहराव कहाँ था। हालांकि आपने मुझे निश्चित रूप से कुछ दिया है; मुझे दो लाइब्रेरी कॉल के बीच महत्वपूर्ण अंतर का एहसास नहीं हुआ।
फ्लॉप

यदि कोई अधिक डीएनएस-संबंधित पैकेट आपकी मशीन को हिट नहीं करता है, तो कुछ संभवतः अपने ट्रैफ़िक को फ़िल्टर कर रहा है (जरूरी नहीं कि उद्देश्य पर)। वैसे भी, अगर आपको कोई समाधान मिल जाए, तो क्या आप इसे यहाँ साझा करेंगे?
केम्पनिउ

1
मैं वास्तव में करूँगा। एक टेस्ट रिज़ॉल्वर सेट करने के बाद, मैं निर्णायक रूप से देख सकता हूं कि एक उत्तर पैकेट - मेरे प्रश्न से एक - हर बार गिरा दिया जाता है। मुझे संदेह है कि वीएमवेयर इंफ्रास्ट्रक्चर में या उसके आस-पास कुछ ऐसा हो रहा है, इसलिए मैंने अपने समकक्ष से संपर्क किया है जो चीजों की तरफ देखता है। जब मैं इसकी तह तक पहुँचता हूँ तो वापस आता हूँ और विस्तार जोड़ता हूँ। एक बार फिर धन्यवाद!
फुल जूल

समाधान मेरे अपने उत्तर में जोड़ा गया। आपकी मदद के लिए एक बार फिर बहुत धन्यवाद।
फ्लाप

9

यह एक जुनिपर फ़ायरवॉल पर अत्यधिक प्रतिबंधात्मक नियम के कारण था जो VMware के बुनियादी ढांचे के सामने बैठता है।

मैंने एक टेस्ट रिज़ॉल्वर का निर्माण किया ताकि मैं बातचीत के दोनों पक्षों को देख सकूं, और केम्पनिउ द्वारा अपने उत्कृष्ट उत्तर में पहचाने गए गायब पैकेट को वास्तव में रास्ते में कहीं गिराया जा रहा था। जैसा कि उस उत्तर में उल्लेख किया गया है, getaddrinfo()जिसमें कोई पता नहीं है , निर्दिष्ट परिवार लौटने से पहले सभी समर्थित परिवारों से संबंधित उत्तरों की प्रतीक्षा करेगा (या, मेरे मामले में, समय समाप्त हो रहा है)।

नेटवर्क चलाने वाले मेरे सहयोगी ने कहा कि

जुनिपर फ़ायरवॉल पर डिफ़ॉल्ट व्यवहार डीएनएस से संबंधित सत्र को बंद करना है जैसे ही एक डीएनएस उत्तर मिलता है जो उस सत्र से मिलता है।

तो फ़ायरवॉल IPv4 प्रतिक्रिया देख रहा था, यह देखते हुए कि यह VM की क्वेरी का उत्तर देता है, और उस पोर्ट के लिए इनबाउंड पथ को बंद कर रहा है। निम्नलिखित IPv6 उत्तर पैकेट इसलिए छोड़ दिया गया था। मुझे नहीं पता कि दोनों पैकेटों ने दूसरी बार इसे क्यों बनाया, लेकिन फ़ायरवॉल पर इस सुविधा को अक्षम करने से समस्या ठीक हो गई।

यह जुनिपर KB से एक संबंधित उद्धरण है:

यहाँ एक परिदृश्य है जहाँ DNS उत्तर पैकेट गिराए जाते हैं:

  1. DNS ट्रैफ़िक के लिए एक सत्र बनाया जाता है जब पहला DNS क्वेरी पैकेट फ़ायरवॉल को हिट करता है और एक अनुमत नीति कॉन्फ़िगर की जाती है। डिफ़ॉल्ट समय सीमा 60 सेकंड है।
  2. सत्र बंद होने से तुरंत पहले, एक नई DNS क्वेरी प्रेषित की जाती है, और चूंकि यह मौजूदा सत्र (चूंकि स्रोत और गंतव्य पोर्ट / आईपी जोड़ी हमेशा समान होती है) से मेल खाती है, इसे फ़ायरवॉल द्वारा अग्रेषित किया जाता है। ध्यान दें कि किसी नए आने वाले पैकेट के अनुसार सत्र का समय समाप्त नहीं हुआ है।
  3. निर्मित DNS सत्र तब पुराना हो जाता है जब पहली DNS क्वेरी प्रतिक्रिया (उत्तर) डिवाइस को हिट करती है, भले ही टाइमआउट कितना भी हो।
  4. जब DNS उत्तर फ़ायरवॉल के माध्यम से पारित किया जाता है, तो सत्र समाप्त हो जाता है।
  5. कोई भी सत्र मौजूद नहीं होने के कारण, बाद के सभी DNS उत्तर फ़ायरवॉल द्वारा हटा दिए जाते हैं।

यदि आप इस उत्तर को बढ़ाने की सोच रहे हैं, तो कृपया केम्पनिउ के उत्तर को भी बढ़ाएं। इसके बिना मैं अभी भी वीएम पर कुछ विन्यास समस्या खोजने की कोशिश कर रहा था।


1
हमने डेबियन 8.2 पर समान लक्षणों का अनुभव किया है। हमारा एक अलग कारण था, और "समाधान" अलग था (क्लाइंट-साइड)। मैंने हमारी विशिष्ट समस्या और अधिक सामान्य समस्या के बारे में ब्लॉग किया: philippecloutier.com/ ... मैं Flup और Kempniu को धन्यवाद देना चाहता हूं, क्योंकि आपके सवाल और जवाब ने मुझे सही रास्ते पर ला खड़ा किया है।
फिलिप क्लाउटियर 20
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.