AAAA लुकअप को अक्षम कैसे करें?


35

... टूटे हुए DNS सर्वरों की भरपाई करने के लिए जो हमारे नियंत्रण से बाहर हैं।

हमारी समस्या: हम एम्बेडेड उपकरणों को तैनात करते हैं, जो विभिन्न डेटा संवेदक डेटा एकत्र करते हैं, ज्यादातर IPv4- केवल साइट्स। कुछ साइटों में खराब तरीके से बनाए गए नेटवर्क हैं, उदाहरण के लिए गलत तरीके से या अन्यथा टूटे हुए DNS कैश और / या फ़ायरवॉल जो या तो AAAA प्रश्नों को पूरी तरह से अनदेखा करते हैं, या टूटे हुए उत्तरों (जैसे गलत स्रोत आईपी!) के साथ उनका जवाब देते हैं। सुविधा विभाग के लिए एक बाहरी आपूर्तिकर्ता के रूप में, हमारे पास (कभी-कभी अनिच्छुक) आईटी विभागों पर कोई प्रभाव नहीं है। उनके DNS सर्वर / फ़ायरवॉल को ठीक करने की संभावना किसी भी समय जल्द ही घट जाती है।

हमारे डिवाइस पर प्रभाव यह है कि प्रत्येक gethostbyname () के साथ, प्रक्रियाओं को AAAA प्रश्नों के आउट होने तक इंतजार करना पड़ता है, जिस बिंदु पर कुछ प्रक्रियाओं ने अपने कनेक्शन के प्रयासों को पूरी तरह से समाप्त कर दिया है।

मैं उन समाधानों की तलाश में हूं जो ...

  • प्रणाली विस्तृत। मैं व्यक्तिगत रूप से दर्जनों एप्लिकेशन को पुन: कॉन्फ़िगर नहीं कर सकता
  • गैर-स्थायी और विन्यास योग्य। हमें IPv6 को फिर से चालू करने की आवश्यकता है, जहां / जब इसे ठीक किया जाए / रोल आउट किया जाए। रिबूट ठीक है।
  • अगर किसी समाधान के लिए ग्लोबक जैसी कोर लाइब्रेरी की आवश्यकता होती है, तो रिप्लेसमेंट लाइब्रेरी पैकेज एक ज्ञात-से-सुव्यवस्थित रिपॉजिटरी (जैसे डेबियन टेस्टिंग, उबंटू ब्रह्मांड, ईपीईएल) से उपलब्ध होना चाहिए। सेल्फ-बिल्डिंग इतने कारणों से एक विकल्प नहीं है कि मुझे यह भी पता नहीं है कि कहां से शुरू करना है, इसलिए मैं उन्हें बिल्कुल सूचीबद्ध नहीं करता ...

सबसे स्पष्ट समाधान resolver लाइब्रेरी को कॉन्फ़िगर करना होगा, जैसे / etc / { resolv , nsswitch , gai } .conf द्वारा AAAA रिकॉर्ड्स को क्वेरी न करने के लिए। यहाँno-inet6 सुझाए अनुसार एक resolv.conf विकल्प वही होगा जो मैं देख रहा हूँ। दुर्भाग्य से यह लागू नहीं है, कम से कम हमारे सिस्टम पर नहीं (libc6-2.13-38 + deb7u4 डेबियन 7 पर; libc6-2.19-0ubuntu6.3 Ubuntu 14.04 पर)

तो फिर कैसे? एक एसएफ और अन्य जगहों पर सुझाए गए निम्नलिखित तरीकों को खोजता है, लेकिन उनमें से गैर काम करते हैं:

  • IPv6 को पूरी तरह से अक्षम करना, जैसे /etc/modprobe.d/, या में IPv6 LKM को ब्लैकलिस्ट करके sysctl -w net.ipv6.conf.all.disable_ipv6=1। ( जिज्ञासा से बाहर: एएएए के लिए रिज़ॉल्वर क्यों पूछ रहा है जहां आईपीवी 6 अक्षम है? )
  • options inet6/Etc/resolv.conf से निकाल रहा है। यह पहले स्थान पर नहीं था, inet6बस इन दिनों डिफ़ॉल्ट रूप से सक्षम है।
  • options single-request/Etc/resolv.conf में सेटिंग । यह केवल यह सुनिश्चित करता है कि A और AAAA क्वेरी समानांतर के बजाय क्रमिक रूप से की जाती हैं
  • precedence/Etc/gai.conf में बदल रहा है। DNS प्रश्नों को प्रभावित नहीं करता है, केवल कई उत्तरों को कैसे संसाधित किया जाता है।
  • बाहरी रिज़ॉल्वर का उपयोग करना (या टूटी हुई डीएनएस सर्वरों को खत्म करने वाली एक स्थानीय रिज़ॉल्वर डेमॉन चलाने में) मदद करेगा, लेकिन आमतौर पर कंपनी की फ़ायरवॉल नीतियों द्वारा अस्वीकृत हो जाता है। और यह आंतरिक संसाधनों को दुर्गम बना सकता है।

वैकल्पिक बदसूरत विचार:

  • स्थानीय होस्ट पर DNS कैश चलाएँ। इसे सभी गैर-AAAA प्रश्नों को अग्रेषित करने के लिए कॉन्फ़िगर करें, लेकिन NOAAROR या NXDOMAIN (इसी A- क्वेरी के परिणाम के आधार पर) के साथ AAAA प्रश्नों का उत्तर दें। हालांकि, मैं ऐसा करने में सक्षम DNS कैश के बारे में नहीं जानता।
  • कुछ चतुर iptables u32 मैच, या Ondrej Caletka के iptables DNS मॉड्यूल का उपयोग AAAA प्रश्नों से मिलान करने के लिए करें, उन्हें या तो icmp-reject करने के लिए (रिवाल्वर lib उस पर प्रतिक्रिया कैसे करेगा?), या उन्हें प्रतिक्रिया देने वाले स्थानीय DNS सर्वर पर पुनर्निर्देशित करेगा? एक खाली NOERROR के साथ सब कुछ।

ध्यान दें कि एसई पर समान, संबंधित प्रश्न हैं। मेरा प्रश्न अलग-अलग है क्योंकि यह वास्तविक समस्या को हल करने की कोशिश कर रहा है जिसे मैं हल करने की कोशिश कर रहा हूं, क्योंकि यह स्पष्ट आवश्यकताओं को सूचीबद्ध करता है, क्योंकि यह कुछ अक्सर सुझाए गए गैर-कार्यशील समाधानों को ब्लैक लिस्ट करता है, और चूंकि यह एक एकल अनुप्रयोग के लिए विशिष्ट नहीं है। इस चर्चा के बाद , मैंने अपना प्रश्न पोस्ट किया।


13
पुनश्च: एसएफ पर यहां की लोकप्रिय धारणा के विपरीत, आईपीवी 4 / केवल नेटवर्क में एक मशीन पर आईपीवी 6 / एएएए को निष्क्रिय करने के कुछ अच्छे कारण हैं, यहां तक ​​कि जहां डीएनएस काम करता है: प्रसारण लोड को कम करें; DNS रिज़ॉल्वर पर लोड को लगभग 50% कम करें; कनेक्शन स्टार्ट-अप समय को कम करें (महत्वपूर्ण रूप से जहां DNS कैश सुस्त हैं); सुरक्षा और स्थिरता को बढ़ाने के लिए गैर-कार्यात्मक सुविधाओं को अक्षम करने के लिए सर्वोत्तम प्रथाओं का पालन करें। बेशक, अगर मैं उपलब्ध होने के बाद IPv6 को फिर से सक्षम करना भूल जाता हूं, तो मेरा सिस्टम IPv4 विरासत गिट्टी बन जाता है जो IPv6 रोलआउट को बाधित करता है। इस चोर के खिलाफ सूचीबद्ध मुकदमों को तौलना चाहिए।
नेल्स टॉड्टमैन

किसी भी कारण से आप लोकलहोस्ट पर पूर्ण रिज़ॉल्वर नहीं चला सकते हैं? इस तरह आप अन्य लोगों (प्रतीत होता है) पर निर्भर DNS रिज़ॉल्वर पर निर्भरता को पूरी तरह से समाप्त कर देते हैं।
सैंडर स्टीफन

@SanderSteffann कंपनी की फ़ायरवॉल नीतियाँ आमतौर पर इसे अस्वीकार कर देती हैं। लेकिन कहीं और यह एक विकल्प है। मैं इसे बाद में अपने प्रश्न में जोड़ दूंगा।
नेल्स टोडरमैन

3
@joeqwerty हम इस बारे में कोई धारणा नहीं बना रहे हैं कि IPv6 साइट पर समर्थित है या नहीं। हम यह अनुमान लगाते हैं कि DNS सर्वर मानक-अनुरूप हैं। इसके अलावा, कुछ आईटी विभाग दुर्भाग्य से कर उनके बुनियादी ढांचे को ठीक से कॉन्फ़िगर करने के लिए कौशल की कमी है। उस बारे में कुंद होने के लिए क्षमा करें।
नेल्स टॉड्टमैन

4
तुम्हारे द्वारा कहा गया मेरी समझ में आ रहा है। आपको अपने बॉक्स को उनके नेटवर्क पर काम करने की आवश्यकता है, न कि दूसरे तरीके से। जब हम आईटी क्षेत्र में अपने ग्राहकों को दोष देते हैं और उनका सम्मान नहीं करते हैं तो मैं थोड़ा संभल जाता हूं। वे हमारी रोटी और मक्खन हैं। अच्छे या बुरे के लिए हमें उनका सम्मान करना चाहिए और उनका सम्मान करना चाहिए। हमारे ग्राहक हमारे व्यवसाय के लिए बाधा नहीं हैं, वे हमारे व्यवसाय का कारण हैं।
joeqwerty

जवाबों:


9

का उपयोग बंद करो gethostbyname()। आपको getaddrinfo()इसके बजाय उपयोग करना चाहिए , और अब वर्षों के लिए होना चाहिए। मैन पेज आपको इसके बारे में चेतावनी देता है।

Gethostbyname * (), gethostbyaddr * (), हेरर (), और hstrerror () फ़ंक्शन अप्रचलित हैं। अनुप्रयोगों को इसके बजाय getaddrinfo (3), getnameinfo (3) और gai_strerror (3) का उपयोग करना चाहिए।

यहाँ सी में एक त्वरित नमूना प्रोग्राम है जो देख दर्शाता है केवल एक नाम के लिए एक रिकॉर्ड है, और एक Wireshark कब्जा दिखा रहा है कि केवल एक रिकॉर्ड लुकअप नेटवर्क पर चला गया।

विशेष रूप से, आपको यह निर्धारित ai_familyकरने की आवश्यकता है कि AF_INETक्या आप केवल एक रिकॉर्ड लुकअप करना चाहते हैं। यह नमूना कार्यक्रम केवल लौटे हुए आईपी पतों को प्रिंट करता है। getaddrinfo()आउटगोइंग कनेक्शन कैसे करें, इसके अधिक पूर्ण उदाहरण के लिए मैन पेज देखें ।

में Wireshark कब्जा , 172.25.50.3 स्थानीय DNS रिसोल्वर है; कब्जा वहाँ लिया गया था, इसलिए आप इसके निवर्तमान प्रश्नों और प्रतिक्रियाओं को भी देखें। ध्यान दें कि केवल एक रिकॉर्ड का अनुरोध किया गया था। कोई AAAA लुकअप कभी नहीं किया गया था।

#include <sys/types.h>
#include <sys/socket.h>
#include <string.h>
#include <stdlib.h>
#include <netdb.h>
#include <stdio.h>

int main(void) {
    struct addrinfo hints;
    struct addrinfo *result, *rp;
    int s;
    char host[256];

    memset(&hints, 0, sizeof(struct addrinfo));
    hints.ai_family = AF_INET;
    hints.ai_socktype = SOCK_STREAM;
    hints.ai_protocol = 0;

    s = getaddrinfo("www.facebook.com", NULL, &hints, &result);
    if (s != 0) {
        fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(s));
        exit(EXIT_FAILURE);
    }

    for (rp = result; rp != NULL; rp = rp->ai_next) {
        getnameinfo(rp->ai_addr, rp->ai_addrlen, host, sizeof(host), NULL, 0, NI_NUMERICHOST);
        printf("%s\n", host);
    }
    freeaddrinfo(result);
}

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

आपका आवेदन संभवतः सबसे महत्वपूर्ण है। यहां तक ​​कि अगर आप सब कुछ ठीक नहीं कर सकते हैं, तो भी यह स्थिति में सुधार कर सकता है।
माइकल हैम्पटन

4

जब संदेह में, स्रोत कोड पर सिर! तो, चलो देखते हैं ... gethostbyname () दिलचस्प लग रहा है; यह बताता है कि हम क्या देख रहे हैं: पहले IPv6 का प्रयास करें, फिर IPv4 पर वापस जाएं यदि आपको कोई उत्तर नहीं मिलता है। यह RES_USE_INET6झंडा क्या है ? इसे वापस ट्रेस करना, यह res_setoptions () से आ रहा है । यह वह जगह है जहाँ resolv.confमें पढ़ा जाता है।

और .... यह मुझे विचारों से बाहर है। मैं पूरी तरह से स्पष्ट नहीं हूं कि यह कैसे RES_USE_INET6सेट किया जा रहा है यदि नहीं resolv.conf


RES_USE_INET6 के माध्यम से सेट किया जा सकता options inet6है resolv.conf। मुझे लगता है कि मेरी समस्या यह है कि इसे संकलन समय पर सेट किए जाने के बाद इसे किसी भी तरह से परेशान नहीं किया जा सकता है , जो कि सभी प्रमुख डिस्ट्रो को कई दिनों (सही!) में लगते हैं। इसलिए उस के लिए सुविधा अनुरोध options no_inet6मैं ऊपर उल्लेख किया है।
नेल्स टॉड्टमैन

1
दुर्भाग्य से, जैसा कि आप कोड से देख सकते हैं, इसमें कोई no_inet6विकल्प नहीं दिखता है res_setoptions()। हालाँकि, जैसा कि आप (नहीं-) से देख सकते हैं ip6-dotint, यह जोड़ना एक आसान बदलाव है। सिद्धांत यह अपने distro द्वारा डिफ़ॉल्ट रूप से सेट किया जा रहा है कि परीक्षण करने के लिए, मैं पैकेज स्रोत फ़ाइलों को पकड़ो और यह एक बार "कुंवारी" (पुष्टि करते हैं कि पैकेज व्यवहार प्रतिकृति) संकलन और उसके बाद जोड़ेंगे: { STRnLEN ("no-inet6"), 1, ~RES_USE_INET6 },करने के लिए options[]सरणी और अगर देखना जब आप उस विकल्प को सेट करते हैं तो समस्या दूर हो जाती है resolv.conf
BMDAN

1
अंत में: इसके लायक क्या है, मैं इसे लोकलहोस्ट पर DNS कैश (जैसा कि आप ऊपर, संदर्भ में) चलाकर हल करूंगा। यह अपने स्वयं के बनाए रखने के लिए एक हेक्सुवा बहुत आसान होगा, डीएनएस प्रॉक्सी / कैश को हैक करके कोर सिस्टम लाइब्रेरी के हैक किए गए संस्करण को बनाए रखना होगा।
BMDAN

3

आप स्थानीय रिज़ॉल्वर के रूप में BIND का उपयोग कर सकते हैं, इसमें AAAA को फ़िल्टर करने का विकल्प होता है:

https://kb.isc.org/article/AA-00576/0/Filter-AAAA-option-in-BIND-9-.html


2
यह एक एम्बेडेड डिवाइस के लिए बहुत भारी है।
माइकल हैम्पटन

धन्यवाद, मुझे बिंद के AAAA फ़िल्टर के बारे में पता नहीं था। जैसा कि माइकल का उल्लेख है, यह शायद बिंद के बड़े पदचिह्न के कारण हमारे लिए कोई समाधान नहीं है। लेकिन जो लोग AAAA प्रतिक्रियाओं को अन्य परिदृश्यों में फ़िल्टर करना चाहते हैं, उनके लिए यह एक व्यवहार्य तरीका हो सकता है। उबंटू वास्तव में कम से कम 14.04 पर "--enable-filter-aaaa" के साथ बाइंड बनाता है। डेबियन के बारे में निश्चित नहीं है। - ipamworldwide.blogspot.co.uk/2011/09/… पर
Nils Toedtmann

1
मैं 14.04 पर हूं और ऐसा नहीं लगता कि यह फ़िल्टरिंग विकल्प उपलब्ध है।
Zitrax

0

क्या आपने PDNS-recursor को सेटअप करने की कोशिश की, इसे अपने /etc/resolv.conf में सेट किया और इसमें "AAAA" लुकअप से इनकार किया? जैसे कुछ का उपयोग करनाquery-local-address6=


1
query-local-address6=कुछ अलग करता है (जो IPv6 पते से प्रश्न भेजने के लिए - ध्यान दें कि IPv6 अक्षम होने के बावजूद, AAAA अनुरोध अभी भी IPv4 के माध्यम से हल हो जाएंगे)। इसके अलावा, मैं AAAA प्रश्नों ( doc.powerdns.com/html/built-in-recursor.html ) को फ़िल्टर करने वाली किसी अन्य सेटिंग की पहचान नहीं कर सकता । उस जानकारी के बिना, आपका उत्तर बहुत उपयोगी नहीं है :(
निल्स टेड्टमैन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.