बाइंड: अमान्य पुनरावर्ती प्रश्नों के लिए ब्लैकहोल?


13

मेरे पास एक नाम सर्वर है जो सार्वजनिक रूप से सुलभ है क्योंकि यह कुछ डोमेन के लिए आधिकारिक नाम सर्वर है

वर्तमान में सर्वर ANYisc.org, ripe.net और इसी तरह के फेक प्रकार के अनुरोधों से भरा हुआ है (यह एक ज्ञात वितरित DoS हमला है )।

सर्वर BIND चलाता है और allow-recursionमेरे LAN पर सेट हो जाता है ताकि ये अनुरोध अस्वीकृत हो जाएं। ऐसे मामलों में सर्वर रूट सर्वर का जिक्र करते हुए सिर्फ authorityऔर सिर्फ जवाब देता additionalहै।

क्या मैं BIND को कॉन्फ़िगर कर सकता हूं ताकि यह इन अनुरोधों को पूरी तरह से अनदेखा कर दे, बिना किसी प्रतिक्रिया के सभी को भेजे?

जवाबों:


5

उसी समस्या का सामना करते हुए, मैंने सभी पुनरावर्ती अनुरोधों को अनदेखा करने का विकल्प चुना। सभी रिसॉल्वर एक गैर-पुनरावर्ती क्वेरी भेजते हैं जब वे मेरे सर्वर को एक आधिकारिक सर्वर के रूप में उपयोग करना चाहते हैं। केवल अपने स्वयं के मामले में ग्राहकों और हमलावरों को गलत तरीके से, पुनरावर्ती प्रश्नों का उपयोग करें।

दुर्भाग्य से मुझे BIND को ऐसा करने का कोई तरीका नहीं मिला है, लेकिन अगर iptables आपके लिए पर्याप्त है, तो मैंने उपयोग किया

iptables -t raw -I PREROUTING -i eth0 -p udp --destination-port 53 \
    -m string --algo kmp --from 30 \
    --hex-string "|01000001000000000000|" -j DROP

नहीं, वह नियम ब्लॉक भी आधिकारिक-प्रकार के अनुरोध (कम से कम मेरी मशीन पर)। जाहिरा तौर पर यह सभी प्रकार के डीएनएस अनुरोधों को अवरुद्ध करता है।
उड्डू जी

मैंने दोबारा जाँच की और मैं वास्तव में उस नियम का उपयोग कर रहा हूँ। यहां लाइव सर्वर से कट-एंड-पेस्ट है। कमांड: iptables -t raw -S PREROUTING। आउटपुट: -P PREROUTING ACCEPTइसके बाद -A PREROUTING -i eth0 -p udp -m udp --dport 53 -m string --hex-string "|01000001000000000000|" --algo kmp --from 30 --to 65535 -j DROP। मैंने परीक्षण किया कि यह सही तरीके से काम कर रहा है host -ar exampledomain.com dns-server.example.net। निश्चित रूप से यह सही ढंग से काम नहीं करता था जब तक कि मैंने -rविकल्प नहीं जोड़ा ।
11:42 पर pino42

ठीक है, -rविकल्प फर्क करता है। मुझे व्यक्तिगत रूप से यह पसंद नहीं है कि सरल hostप्रश्न अब काम नहीं करते हैं और यह बहुत भ्रामक हो सकता है। यह संभवतः एक वैध (अब तक का सबसे अच्छा) उत्तर है, लेकिन मैं आपको इनाम दूंगा, क्योंकि यह समाप्त होने वाला है, भले ही मैं OUTPUT को फ़िल्टर करके अपने दृष्टिकोण का उपयोग करना जारी रखूंगा।
उडो जी

धन्यवाद! यदि मैं एक बेहतर समाधान से टकराता हूं, तो मैं इसे पोस्ट करना सुनिश्चित करूंगा। मैं आपसे सहमत हूं: यह एक हैक है। एक काम कर रहा है, लेकिन अभी भी एक हैक।
पीनो 42

2

मैं कोशिश करूँगा:

zone "." {
  type redirect;
  allow-query "none";
}

रूट सर्वर पर क्लाइंट का संदर्भ देने वाली प्रतिक्रियाओं को "रीडायरेक्ट" ज़ोन द्वारा नियंत्रित किया जाता है। यह इसे उन लोगों को जवाब नहीं देने के लिए कहना चाहिए।

Bind9 डॉक्स में यह संकेत दिया गया है: http://ftp.isc.org/isc/bind9/cur/9.9/doc/arm/Bv9ARM.ch06.html#id2592674

आप "none"अपने स्थानीय सबनेट के साथ बदल सकते हैं ।

यदि आपके पास पहले से ही एक zone "."घोषणा है, तो बस इसमें जोड़ें allow-query "none";


zone "." { type hint; file "/etc/bind/db.root"; };रूट सर्वरों की सूची db.root के साथ मेरे पास एक घोषणा है। उस घोषणा को हटाने से विदेशी डोमेन के लिए अटैक रुक जाता है लेकिन सर्वर फिर भी "सर्वर विफलता" के साथ प्रतिक्रिया दे रहा है और इस प्रकार अभी भी DoS के लिए उपयोग किया जा सकता है।
उडो जी

@UdoG: आप जोड़ने की कोशिश की है allow-query "none";करने के लिए zone "."config?
Freiheit

ऐसा लगता है कि यह केवल अपस्ट्रीम बैंडविड्थ को बचा रहा है जो बहुतायत से होना चाहिए। आपके फिक्स के साथ हमलावर ने पहले ही आपके सर्वर को डाउनस्ट्रीम बैंडविड्थ और प्रोसेसिंग पावर
TheLQ

@ THELQ: यह प्रश्न डीडीओएस के हमले को दर्शाता है। सामान्य डीएनएस-आधारित डीडीओएस हमला लक्ष्य के जाली आईपी के साथ डीएनएस प्रश्न भेजने के लिए है। चूंकि DNS उत्तर पैकेट क्वेरी से बड़ा है, यह एक गुणक प्रदान करता है। यदि आपका सर्वर काफी बड़े पैकेट के साथ प्रतिक्रिया नहीं करता है, तो आपने हमले में अपने सर्वर का उपयोग करने का कारण समाप्त कर दिया है।
Freiheit

@UdoG: सर्वर विफलता पैकेट केवल 31 से 32 है, जबकि रूट सर्वर का रेफरल शायद कई सौ बाइट्स था। यदि आपके सर्वर का उत्तर क्वेरी के समान आकार का है, या केवल एक छोटा सा बड़ा है, तो आपका सर्वर DNS DDoS हमले में बेकार है, क्योंकि हमलावर अपने लक्ष्य को भेजने के लिए आपको जितनी अधिक बैंडविड्थ का उपभोग करेंगे। मैंने कई संभावित अच्छी तरह से कॉन्फ़िगर किए गए आधिकारिक नाम सर्वर (जैसे कि Google) के खिलाफ परीक्षण किया, और उन्होंने "पुनरावृत्ति अनुरोध किया लेकिन उपलब्ध नहीं" के साथ उत्तर दिया।
Freiheit

1

आम तौर पर, मैं सुझाव दूंगा:

बाइंड लॉग्स चालू करें और ips को रिकॉर्ड करें जो अस्वीकार किए गए उत्तर देता है। विफलता 2ban प्रोग्राम स्थापित करें, ब्लैकहोल क्रिया जोड़ें: http://pastebin.com/k4BxrAeG (/etc/fail2ban/actions.d में फ़ाइल में नियम डालें)

/Etc/fail2ban/filter.d में बाइंड फिल्टर फाइल कुछ इस तरह से बनाएं (डिबगिंग की जरूरत है)!

[Definition]
failregex = ^.* security: info: client #<HOST>: query \(cache\) .* denied

विफलता 2ban.conf संपादित करें, अनुभाग जोड़ें:

[bindban]

enabled  = true
filter   = bind
# "bantime" is the number of seconds that a host is banned.
bantime  = 6000
# A host is banned if it has generated "maxretry" during the last "findtime"
# seconds.
findtime  = 60
# "maxretry" is the number of failures before a host get banned.
maxretry = 150
action   = blackhole
logpath  = /var/log/named.log

आशा है कि यह मदद करेगा!


TODO: लॉग फ़ाइल उदाहरण बाँध।
आंद्रेई मिखलात्सोव

1

मूल विचार आइए खंडित DNS प्रतिक्रिया को रेफ्यूज़ के रूप में वर्गीकृत करते हैं, फिर आईप्लेबल्स का उपयोग करके रिफ्यूज्ड को चुपचाप अनदेखा कर दें।

नामांकित विकल्प खंड में इनकार करना आसान हिस्सा है:

allow-recursion { none;};

या निश्चित रूप से स्थानीय अपवादों के लिए अपने पसंदीदा ACLs ...

अगला पागल iptables जादू, आवश्यकतानुसार "-o eth0" को समायोजित या हटाएं। यह कमांड UDP से पहले मानक 20 बाइट IPv4 लेयर हैडर मानती है।

iptables -A OUTPUT -o eth0 -p udp --sport 53 -m string --from 30 --to 32 --hex-string "|8105|" --algo bm -j DROP

निम्न बिट्स सेट के साथ DNS प्रतिक्रिया के झंडे क्षेत्र पर यह कुंजी

  • डीएनएस प्रतिक्रिया
  • पुनरावर्ती प्रश्न
  • उत्तर कोड ने मना कर दिया

डिबग में चल रहे लॉग संदेश को "त्रुटि प्रतिक्रिया भेजने में त्रुटि: मेजबान अप्राप्य" जब नियम परीक्षण के लिए कुछ प्रतिक्रिया से मेल खाते हैं।

यह स्वीकार करना चाहिए कि यह सब कुछ व्यर्थ है। यदि कोई प्रवर्धन नहीं है तो एक हमलावर टीसीपी SYN को आसानी से प्रतिबिंबित कर सकता है। अंततः डीएनएस को तोड़ दिया जाता है बस टीसीपी का उपयोग करने या ईस्टलेक के डीएनएस कुकीज़ की तैनाती के अलावा कोई व्यवहार्य समाधान नहीं है।


0

क्या आपने स्ट्रिंग isc.org को ब्लॉक करने की कोशिश की है या इसके लिए हेक्स स्ट्रिंग को ब्लॉक किया है?

यह मेरे लिए काम किया:

iptables-IN INUTUT -p udp -m string --hex-string "| 03697363036367267700" -गालो बीएम -जे डीआरओपी


क्या उन सभी डोमेन के लिए हेक्स स्ट्रिंग्स की पहचान करना बेहतर नहीं होगा जो सर्वर को जवाब दे रहे हैं, उपरोक्त को उन की अनुमति देने के लिए, और अन्य सभी udp / 53 ट्रैफ़िक को छोड़ना चाहिए?
Freiheit

मैं वर्तमान में यूडीपी प्रतिक्रियाओं को पहले से ही रोक रहा हूं जो रूट सर्वरों का जिक्र कर रहे हैं: iptables -A OUTPUT -p udp -m string -hex-string "|726f6f742d73657276657273|" –algo bm –to 65535 -j DROPलेकिन मैं वास्तव में एक समाधान पसंद करूंगा जो कि सिर्फ बंड कॉन्फ़िगरेशन पर आधारित है, यदि यह बिल्कुल संभव है।
उडो जी

यह कमजोर है। आप डोमेन के रूप में अपनी इच्छा के अनुसार जो भी स्टिंग उत्पन्न कर सकते हैं। हम अभी उस समस्या का सामना कर रहे हैं और यह स्थैतिक नाम के माध्यम से इसे ब्लॉक करने का तरीका नहीं है'bnrexex.www.sf97.net/A/IN' 'whzpkacpxpiuycm.www.tpa.net.cn/A/IN'
3h4x

0

इस हमले को Amplified Denial of Service कहा जाता है। आपको बाइंड को ठीक से कॉन्फ़िगर करना चाहिए लेकिन वह ट्रैफ़िक आपके बाइंड को पहली जगह पर नहीं मिलना चाहिए। इसे पहले नेटवर्क डिवाइस पर ब्लॉक करें जो आपके नेटवर्क में करने में सक्षम है। मेरे पास एक ही समस्या थी और इससे निपटने के लिए बहरा उबाल नियम:

अलर्ट udp $ EXTERNAL_NET कोई भी -> $ HOME_NET 53 (संदेश: "PROTOCOL-DNS अत्यधिक प्रकार के प्रश्न - संभावित DoS"; बाइट_टेस्ट: 1; &;, 0xF8,2; सामग्री: "; 00 00 FF 00 01"; " डिटेक्टिंग_फिल्टर: ट्रैक by_src, काउंट 30, सेकंड 30; मेटाडेटा: सर्विस डीएनएस; संदर्भ: url, foxpaलाइट्स / 2010/07/21/21 / thwarting-the-isc-org-dns-ddos /; क्लैस्टस्टाइप: tryed-dos; sid; : 21817; Rev: 4;)


0

पहले, मुझे पता है कि यह एक पुराना सवाल है लेकिन ...

मैं दशकों से अपने स्वयं के आधिकारिक, गैर पुनरावर्ती, DNS सर्वर चला रहा हूं, लेकिन कभी भी किसी भी DNS आधारित DDoS हमलों में शिकार नहीं हुआ - अब तक, जब मैं एक नए आईएसपी पर स्विच किया गया था। हजारों स्पूफ़ किए गए DNS प्रश्नों ने मेरे लॉग्स को भर दिया और मैं वास्तव में नाराज हो गया - मेरे सर्वर पर प्रभाव के बारे में इतना नहीं, बल्कि इस तथ्य ने मेरे लॉग्स और दुर्व्यवहार किए जाने की असहज भावना को दूर कर दिया। ऐसा लगता है कि हमलावर मेरे DNS का उपयोग " आधिकारिक नाम सर्वर हमले " में करने की कोशिश करता है ।

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

मैंने ऐसा करना शुरू कर दिया जैसा कि बाकी सभी लोग करते हैं , यह पता करें कि किस डोमेन नाम को क्वेर किया गया है और एक लक्षित DROP के साथ उस डोमेन पर एक स्ट्रिंग मैच बनाया है। लेकिन मुझे जल्द ही एहसास हुआ कि मैं बड़ी मात्रा में नियमों का पालन करूंगा, उनमें से प्रत्येक सीपीयू चक्र का उपभोग करेगा। इसलिए क्या करना है? चूंकि मैं एक पुनरावर्ती नाम सर्वर नहीं चलाता हूं, इसलिए मुझे लगा कि मैं उन वास्तविक क्षेत्रों पर मिलान कर सकता हूं, जिनके लिए मैं आधिकारिक हूं और बाकी सभी चीजों को छोड़ दूंगा।

Iptables में मेरी डिफ़ॉल्ट नीति ACCEPT है, यदि आपकी नीति DROP है, तो शायद आपको कुछ समायोजन करने की आवश्यकता है यदि आप निम्नलिखित समाधान का उपयोग करना चाहते हैं।

मैं अपना ज़ोन कॉन्फ़िगरेशन एक अलग फ़ाइल (/etc/bind/onym.conf.local) में रखता हूं, आइए इसे एक उदाहरण के लिए उपयोग करें:

zone "1.168.192.in-addr.arpa" { // Private
        type master;
        allow-query { 192.168.1.0/24; 127.0.0.1; };
        allow-transfer { 127.0.0.1; };
        file "/etc/bind/db.192.168.1";
};

zone "home.example.net" { // Private
        type master;
        allow-query { 192.168.1.0/24; 127.0.0.1; };
        allow-transfer { 127.0.0.1; };
        file "/etc/bind/pri/db.home.example.net";
};

zone "example.net" {
        type master;
        file "/etc/bind/pri/db.example.net";
        allow-transfer { 127.0.0.1; 8.8.8.8; };
};

zone "example.com" {
        type slave;
        masters { 8.8.8.8; };
        file "sec.example.com";
        allow-transfer { 127.0.0.1; };
        notify no;
};

zone "subdomain.of.example.nu" {
        type slave;
        masters { 8.8.8.8; };
        file "sec.subdomain.of.example.nu";
        allow-transfer { 127.0.0.1; };
        notify no;
};

मेरे पहले दो ज़ोन पर "// प्राइवेट" टिप्पणी पर ध्यान दें, मैं इसका उपयोग निम्न स्क्रिप्ट में मान्य ज़ोन की सूची से बाहर करने के लिए करता हूं।

#!/usr/bin/perl
# zone2iptables - Richard Lithvall, april 2014
#
# Since we want to match not only example.net, but also (for example)
# www.example.net we need to set a reasonable maximum value for a domain
# name in our zones - 100 character should be more that enough for most people
# and 255 is the absolute maximum allowed in rfc1034.
# Set it to 0 (zero) if you would like the script to fetch each zone (axfr)
# to get the actual max value.
$maxLengthOfQueryName=255;
$externalInterface="eth1";

print "# first time you run this, you will get error on the 3 first commands.\n";
print "# It's here to make it safe/possible to periodically run this script.\n";
print "/sbin/iptables -D INPUT -i $externalInterface -p udp --dport 53 -j DNSvalidate\n";
print "/sbin/iptables -F DNSvalidate\n";
print "/sbin/iptables -X DNSvalidate\n";
print "#\n";
print "# now, create the chain (again)\n";
print "/sbin/iptables -N DNSvalidate\n";
print "# and populate it with your zones\n";
while(<>){
        if(/^zone\s+"(.+)"\s+\{$/){
                $zone=$1;
                if($maxLengthOfQueryName){
                        $max=$maxLengthOfQueryName;
                } else {
                        open(DIG,"dig -t axfr +nocmd +nostats $zone |");
                        $max=0;
                        while(<DIG>){
                                if(/^(.+?)\.\s/){
                                        $max=(length($1)>$max)?length($1):$max;
                                }
                        }
                        close(DIG);
                }
                printf("iptables -A DNSvalidate -m string --from 40 --to %d --hex-string \"",($max+42));
                foreach $subdomain (split('\.',$zone)){
                        printf("|%02X|%s",length($subdomain),$subdomain);
                }
                print("|00|\" --algo bm -j RETURN -m comment --comment \"$zone\"\n");
        }
}
print "# and end the new chain with a drop\n";
print "/sbin/iptables -A DNSvalidate -j DROP\n";
print "# And, at last, make the new chain active (on UDP/53)\n";
print "/sbin/iptables -A INPUT -i $externalInterface -p udp --dport 53 -j DNSvalidate\n";

ज़ोन कॉन्फ़िगरेशन फ़ाइल के साथ उपरोक्त स्क्रिप्ट को तर्क के रूप में चलाएं।

root:~/tmp/# ./zone2iptables.pl /etc/bind/named.conf.local 
# first time you run this, you will get error on the 3 first commands.
# It's here to make it safe/possible to periodically run this script.
/sbin/iptables -D INPUT -i eth1 -p udp --dport 53 -j DNSvalidate
/sbin/iptables -F DNSvalidate
/sbin/iptables -X DNSvalidate
#
# now, create the chain (again)
/sbin/iptables -N DNSvalidate
# and populate it with your zones
iptables -A DNSvalidate -m string --from 40 --to 297 --hex-string "|07|example|03|net|00|" --algo bm -j RETURN -m comment --comment "example.net"
iptables -A DNSvalidate -m string --from 40 --to 297 --hex-string "|07|example|03|com|00|" --algo bm -j RETURN -m comment --comment "example.com"
iptables -A DNSvalidate -m string --from 40 --to 297 --hex-string "|09|subdomain|02|of|07|example|02|nu|00|" --algo bm -j RETURN -m comment --comment "subdomain.of.example.nu"
# and end the new chain with a drop
/sbin/iptables -A DNSvalidate -j DROP
# And, at last, make the new chain active (on UDP/53)
/sbin/iptables -A INPUT -i eth1 -p udp --dport 53 -j DNSvalidate

एक स्क्रिप्ट में आउटपुट को सेव करें, इसे एक शेल या पाइप में कॉपी करें और नई चेन बनाने के लिए अपने टर्मिनल में पेस्ट करें और सभी अमान्य डेटा प्रश्नों को फ़िल्टर करें।

नई श्रृंखला में प्रत्येक नियम पर पैकेट (और बाइट) काउंटर को देखने के लिए रन / sbin / iptables -L DNSvalidate -nvx (आप इसे और अधिक कुशल बनाने के लिए सूची के शीर्ष पर अधिकांश पैकेट वाले ज़ोन को स्थानांतरित करना चाह सकते हैं)।

उम्मीद है कि किसी को यह उपयोगी मिल सकता है :)

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.