DNSTap और BGP के साथ ILV ब्लॉकिंग को बायपास करें

DNSTap और BGP के साथ ILV ब्लॉकिंग को बायपास करें

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

इस तथ्य के कारण कि अदालतें और आरकेएन सब कुछ दाएं और बाएं ब्लॉक करते हैं, और प्रदाता कड़ी मेहनत कर रहे हैं कि वे रेविज़ोरो द्वारा जारी किए गए जुर्माने के दायरे में न आएं, ब्लॉकिंग से जुड़े नुकसान काफी बड़े हैं। और "कानूनी रूप से" अवरुद्ध साइटों में से कई उपयोगी हैं (हैलो, रट्रैकर)

मैं आरकेएन के अधिकार क्षेत्र से बाहर रहता हूं, लेकिन मेरे माता-पिता, रिश्तेदार और दोस्त घर पर ही रहे। इसलिए आईटी से दूर लोगों के लिए ब्लॉकिंग को बायपास करने का एक आसान तरीका खोजने का निर्णय लिया गया, अधिमानतः उनकी भागीदारी के बिना।

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

ताले के प्रकार

सबसे पहले, ब्लॉक की जा रही चीज़ों के बारे में अपनी याददाश्त को ताज़ा करें।

RKN से अनलोड किए गए XML में कई प्रकार के ताले हैं:

  • IP
  • डोमेन नाम
  • यूआरएल

सरलता के लिए, हम उन्हें घटाकर दो कर देंगे: IP और डोमेन, और हम बस डोमेन को URL द्वारा अवरुद्ध होने से बाहर निकाल देंगे (अधिक सटीक रूप से, उन्होंने हमारे लिए यह पहले ही कर लिया है)।

से अच्छे लोग रोसकोम्सवोबोडा एक अद्भुत एहसास हुआ APIजिसके माध्यम से हम वह प्राप्त कर सकते हैं जिसकी हमें आवश्यकता है:

अवरुद्ध साइटों तक पहुंच

ऐसा करने के लिए, हमें कुछ छोटे विदेशी VPS की आवश्यकता है, अधिमानतः असीमित ट्रैफ़िक के साथ - इनमें से कई 3-5 रुपये के लिए हैं। आपको इसे विदेशों में निकट ले जाने की आवश्यकता है ताकि पिंग बहुत बड़ा न हो, लेकिन फिर से, ध्यान रखें कि इंटरनेट और भूगोल हमेशा मेल नहीं खाते। और चूंकि 5 रुपये के लिए कोई SLA नहीं है, इसलिए दोष सहिष्णुता के लिए विभिन्न प्रदाताओं से 2+ टुकड़े लेना बेहतर है।

अगला, हमें क्लाइंट राउटर से VPS तक एक एन्क्रिप्टेड टनल सेट करने की आवश्यकता है। मैं वायरगार्ड को सेट अप करने के लिए सबसे तेज़ और आसान के रूप में उपयोग करता हूं। मेरे पास लिनक्स पर आधारित क्लाइंट राउटर भी हैं (एपीयू2 या OpenWRT में कुछ)। कुछ Mikrotik/Cisco के मामले में, आप उन पर उपलब्ध प्रोटोकॉल जैसे OpenVPN और GRE-over-IPSEC का उपयोग कर सकते हैं।

रुचि के यातायात की पहचान और पुनर्निर्देशन

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

इसलिए, हमें किसी तरह अवरुद्ध साइटों पर ट्रैफ़िक आवंटित करने और चुनिंदा रूप से इसे सुरंग में निर्देशित करने की आवश्यकता होगी। यहां तक ​​कि अगर कुछ "अतिरिक्त" ट्रैफ़िक वहां पहुंच भी जाता है, तब भी यह सुरंग के माध्यम से सब कुछ चलाने से कहीं बेहतर है।

यातायात का प्रबंधन करने के लिए, हम बीजीपी प्रोटोकॉल का उपयोग करेंगे और अपने वीपीएस से ग्राहकों के लिए आवश्यक नेटवर्कों के मार्गों की घोषणा करेंगे। आइए BIRD को सबसे कार्यात्मक और सुविधाजनक बीजीपी डेमॉन में से एक के रूप में लें।

IP

IP द्वारा ब्लॉक करने के साथ, सब कुछ स्पष्ट है: हम केवल VPS के साथ सभी ब्लॉक किए गए IP की घोषणा करते हैं। समस्या यह है कि एपीआई रिटर्न की सूची में लगभग 600 हजार सबनेट हैं, और उनमें से अधिकांश /32 होस्ट हैं। मार्गों की यह संख्या कमज़ोर क्लाइंट रूटर्स को भ्रमित कर सकती है।

इसलिए, सूची को संसाधित करते समय, नेटवर्क / 24 को सारांशित करने का निर्णय लिया गया था यदि इसमें 2 या अधिक होस्ट हैं। इस प्रकार, मार्गों की संख्या घटाकर ~ 100 हजार कर दी गई। इसके लिए स्क्रिप्ट का पालन किया जाएगा।

डोमेन

यह अधिक जटिल है और इसके कई तरीके हैं। उदाहरण के लिए, आप प्रत्येक क्लाइंट राउटर पर एक पारदर्शी स्क्वीड स्थापित कर सकते हैं और वहां HTTP इंटरसेप्शन कर सकते हैं और पहले मामले में अनुरोधित URL और दूसरे में SNI से डोमेन प्राप्त करने के लिए TLS हैंडशेक में झाँक सकते हैं।

लेकिन हर तरह के नए जमाने के TLS1.3 + eSNI के कारण, HTTPS विश्लेषण हर दिन कम से कम वास्तविक होता जा रहा है। हां, और ग्राहक की ओर से बुनियादी ढांचा अधिक जटिल होता जा रहा है - आपको कम से कम OpenWRT का उपयोग करना होगा।

इसलिए, मैंने डीएनएस अनुरोधों के लिए इंटरसेप्टिंग प्रतिक्रियाओं का रास्ता अपनाने का फैसला किया। यहां भी, कोई भी डीएनएस-ओवर-टीएलएस/एचटीटीपीएस आपके सिर पर मंडराना शुरू कर देता है, लेकिन हम (अभी के लिए) क्लाइंट पर इस हिस्से को नियंत्रित कर सकते हैं - या तो इसे अक्षम करें या डीओटी/डीओएच के लिए अपने स्वयं के सर्वर का उपयोग करें।

डीएनएस को कैसे इंटरसेप्ट करें?

यहाँ भी, कई दृष्टिकोण हो सकते हैं।

  • पीसीएपी या एनएफएलओजी के जरिए डीएनएस ट्रैफिक को रोकना
    इंटरसेप्शन के इन दोनों तरीकों को यूटिलिटी में लागू किया गया है सिडमैट. लेकिन यह लंबे समय से समर्थित नहीं है और कार्यक्षमता बहुत ही आदिम है, इसलिए आपको अभी भी इसके लिए एक हार्नेस लिखने की आवश्यकता है।
  • DNS सर्वर लॉग का विश्लेषण
    दुर्भाग्य से, मेरे लिए ज्ञात पुनरावर्ती प्रतिक्रियाएँ लॉग करने में सक्षम नहीं हैं, लेकिन केवल अनुरोध करते हैं। सिद्धांत रूप में, यह तार्किक है, क्योंकि अनुरोधों के विपरीत, उत्तरों की एक जटिल संरचना होती है और उन्हें पाठ के रूप में लिखना मुश्किल होता है।
  • डीएनएसटैप
    सौभाग्य से, उनमें से कई पहले से ही इस उद्देश्य के लिए DNSTap का समर्थन करते हैं।

डीएनएसटैप क्या है?

DNSTap और BGP के साथ ILV ब्लॉकिंग को बायपास करें

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

यह समझना महत्वपूर्ण है कि DNSTap प्रतिमान में, DNS सर्वर क्लाइंट के रूप में कार्य करता है और संग्राहक सर्वर के रूप में कार्य करता है। यही है, डीएनएस सर्वर कलेक्टर से जुड़ता है, और इसके विपरीत नहीं।

आज DNSTap सभी लोकप्रिय DNS सर्वरों में समर्थित है। लेकिन, उदाहरण के लिए, कई वितरणों में BIND (जैसे Ubuntu LTS) अक्सर किसी कारण से इसके समर्थन के बिना बनाया जाता है। तो चलिए पुनः असेंबली से परेशान नहीं होते हैं, लेकिन एक हल्का और तेज़ पुनरावर्ती लें - अनबाउंड।

DNSTap कैसे पकड़ें?

वहाँ कुछ संख्या DNSTap घटनाओं की धारा के साथ काम करने के लिए सीएलआई उपयोगिताओं, लेकिन वे हमारी समस्या को हल करने के लिए उपयुक्त नहीं हैं। इसलिए, मैंने अपनी खुद की साइकिल का आविष्कार करने का फैसला किया जो आवश्यक सब कुछ करेगी: dnstap-bgp

कार्य एल्गोरिथ्म:

  • लॉन्च होने पर, यह एक टेक्स्ट फ़ाइल से डोमेन की एक सूची लोड करता है, उन्हें उलट देता है (habr.com -> com.habr), टूटी हुई लाइनों, डुप्लिकेट और सबडोमेन को बाहर कर देता है (यानी अगर सूची में habr.com और www.habr.com शामिल हैं, यह केवल पहले लोड किया जाएगा) और इस सूची के माध्यम से तेजी से खोज के लिए एक उपसर्ग पेड़ बनाता है
  • DNSTap सर्वर के रूप में कार्य करते हुए, यह DNS सर्वर से कनेक्शन के लिए प्रतीक्षा करता है। सिद्धांत रूप में, यह UNIX और TCP दोनों सॉकेट्स का समर्थन करता है, लेकिन मुझे पता है कि DNS सर्वर केवल UNIX सॉकेट्स का उपयोग कर सकते हैं
  • इनकमिंग DNSTap पैकेट्स को पहले एक प्रोटोबॉफ़ संरचना में डिसेरिअलाइज़ किया जाता है, और फिर स्वयं बाइनरी डीएनएस संदेश, जो एक प्रोटोबॉफ़ फ़ील्ड में स्थित होता है, को DNS RR रिकॉर्ड के स्तर पर पार्स किया जाता है
  • यह जाँच की जाती है कि क्या अनुरोधित होस्ट (या उसका मूल डोमेन) लोड की गई सूची में है, यदि नहीं, तो प्रतिक्रिया पर ध्यान नहीं दिया जाता है
  • प्रतिक्रिया से केवल A/AAAA/CNAME RR का चयन किया जाता है और संबंधित IPv4/IPv6 पते उनसे निकाले जाते हैं
  • आईपी ​​​​पते कॉन्फ़िगर करने योग्य टीटीएल के साथ कैश किए गए हैं और सभी कॉन्फ़िगर किए गए बीजीपी साथियों को विज्ञापित किए गए हैं
  • पहले से कैश्ड आईपी की ओर इशारा करते हुए प्रतिक्रिया प्राप्त करने पर, इसका टीटीएल अपडेट किया जाता है
  • TTL के समाप्त होने के बाद, प्रविष्टि को कैश और BGP घोषणाओं से हटा दिया जाता है

अतिरिक्त कार्यक्षमता:

  • SIGHUP द्वारा डोमेन की सूची को फिर से पढ़ना
  • कैश को अन्य उदाहरणों के साथ सिंक में रखना dnstap-bgp HTTP/JSON के माध्यम से
  • पुनरारंभ करने के बाद इसकी सामग्री को पुनर्स्थापित करने के लिए डिस्क पर कैश को डुप्लिकेट करें (बोल्टडीबी डेटाबेस में)।
  • किसी भिन्न नेटवर्क नाम स्थान पर स्विच करने के लिए समर्थन (इसकी आवश्यकता क्यों है इसका वर्णन नीचे किया जाएगा)
  • IPv6 समर्थन

प्रतिबंध:

  • IDN डोमेन अभी समर्थित नहीं हैं
  • कुछ बीजीपी सेटिंग्स

मैने एकत्रित किया आरपीएम और डीईबी आसान स्थापना के लिए संकुल। सिस्टमड के साथ सभी अपेक्षाकृत हाल के ओएस पर काम करना चाहिए। उनकी कोई निर्भरता नहीं है।

ड्राइविंग

तो, आइए सभी घटकों को एक साथ जोड़ना शुरू करें। नतीजतन, हमें इस तरह की नेटवर्क टोपोलॉजी मिलनी चाहिए:
DNSTap और BGP के साथ ILV ब्लॉकिंग को बायपास करें

मुझे लगता है कि काम का तर्क आरेख से स्पष्ट है:

  • क्लाइंट के पास हमारा सर्वर DNS के रूप में कॉन्फ़िगर किया गया है, और DNS प्रश्नों को भी VPN पर जाना चाहिए। यह आवश्यक है ताकि प्रदाता ब्लॉक करने के लिए DNS इंटरसेप्शन का उपयोग न कर सके।
  • साइट खोलते समय, क्लाइंट DNS क्वेरी भेजता है जैसे "xxx.org के आईपी क्या हैं"
  • अबाध xxx.org को हल करता है (या इसे कैश से लेता है) और क्लाइंट को एक प्रतिक्रिया भेजता है "xxx.org के पास ऐसा और ऐसा आईपी है", इसे DNSTap के माध्यम से समानांतर में दोहराते हुए
  • dnstap-bgp में इन पतों की घोषणा करता है चिड़िया बीजीपी के माध्यम से यदि डोमेन अवरुद्ध सूची में है
  • चिड़िया के साथ इन आईपी के लिए एक मार्ग का विज्ञापन करता है next-hop self क्लाइंट राउटर
  • क्लाइंट से इन आईपी के बाद के पैकेट सुरंग के माध्यम से जाते हैं

सर्वर पर, अवरुद्ध साइटों के मार्गों के लिए, मैं BIRD के अंदर एक अलग टेबल का उपयोग करता हूं और यह किसी भी तरह से OS के साथ इंटरसेक्ट नहीं करता है।

इस योजना में एक खामी है: ग्राहक का पहला SYN पैकेट घरेलू प्रदाता के माध्यम से जाने का सबसे अधिक समय होगा। मार्ग की घोषणा तुरंत नहीं की जाती है। और यहां विकल्प संभव हैं जो इस बात पर निर्भर करता है कि प्रदाता कैसे ब्लॉक करता है। अगर वह सिर्फ ट्रैफिक गिरा देता है, तो कोई समस्या नहीं है। और अगर वह इसे किसी डीपीआई पर पुनर्निर्देशित करता है, तो (सैद्धांतिक रूप से) विशेष प्रभाव संभव हैं।

यह भी संभव है कि क्लाइंट DNS TTL चमत्कारों का सम्मान न करें, जिसके कारण क्लाइंट अनबाउंड पूछने के बजाय अपने सड़े हुए कैश से कुछ पुरानी प्रविष्टियों का उपयोग कर सकता है।

व्यवहार में, न तो पहले और न ही दूसरे ने मेरे लिए समस्याएँ पैदा कीं, लेकिन आपका माइलेज अलग-अलग हो सकता है।

सर्वर ट्यूनिंग

रोलिंग में आसानी के लिए, मैंने लिखा Ansible के लिए भूमिका. यह लिनक्स पर आधारित सर्वर और क्लाइंट दोनों को कॉन्फ़िगर कर सकता है (डिबेट-आधारित वितरण के लिए डिज़ाइन किया गया)। सभी सेटिंग्स काफी स्पष्ट हैं और अंदर सेट हैं सूची.वाईएमएल. यह भूमिका मेरी बड़ी प्लेबुक से काटी गई है, इसलिए इसमें त्रुटियाँ हो सकती हैं - अनुरोधों को खींचो स्वागत 🙂

आइए मुख्य घटकों के माध्यम से चलते हैं।

बीजीपी

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

आप एक और बीजीपी डेमन की कोशिश कर सकते हैं, लेकिन मुझे बर्ड पसंद है और यह मेरे द्वारा हर जगह इस्तेमाल किया जाता है, मैं संस्थाओं का निर्माण नहीं करना चाहता।

इसलिए, मैंने dnstap-bgp को नेटवर्क नेमस्पेस के अंदर छिपा दिया, जो वीथ इंटरफ़ेस के माध्यम से रूट से जुड़ा है: यह एक पाइप की तरह है, जिसके सिरे अलग-अलग नेमस्पेस में चिपक जाते हैं। इनमें से प्रत्येक छोर पर, हम निजी पी2पी आईपी पते लटकाते हैं जो मेजबान से आगे नहीं जाते हैं, इसलिए वे कुछ भी हो सकते हैं। यह वही तंत्र है जिसका उपयोग अंदर की प्रक्रियाओं तक पहुँचने के लिए किया जाता है सबका प्यारा डॉकटर और अन्य कंटेनर।

इसके लिए लिखा गया था लिखी हुई कहानी और स्वयं को बाल पकड़ कर दूसरे नाम स्थान पर खींचने के लिए ऊपर वर्णित कार्यक्षमता को dnstap-bgp में जोड़ा गया था। इस वजह से, इसे रूट के रूप में चलाया जाना चाहिए या सेटकैप कमांड के माध्यम से CAP_SYS_ADMIN बाइनरी को जारी किया जाना चाहिए।

नेमस्पेस बनाने के लिए उदाहरण स्क्रिप्ट

#!/bin/bash

NS="dtap"

IP="/sbin/ip"
IPNS="$IP netns exec $NS $IP"

IF_R="veth-$NS-r"
IF_NS="veth-$NS-ns"

IP_R="192.168.149.1"
IP_NS="192.168.149.2"

/bin/systemctl stop dnstap-bgp || true

$IP netns del $NS > /dev/null 2>&1
$IP netns add $NS

$IP link add $IF_R type veth peer name $IF_NS
$IP link set $IF_NS netns $NS

$IP addr add $IP_R remote $IP_NS dev $IF_R
$IP link set $IF_R up

$IPNS addr add $IP_NS remote $IP_R dev $IF_NS
$IPNS link set $IF_NS up

/bin/systemctl start dnstap-bgp

dnstap-bgp.conf

namespace = "dtap"
domains = "/var/cache/rkn_domains.txt"
ttl = "168h"

[dnstap]
listen = "/tmp/dnstap.sock"
perm = "0666"

[bgp]
as = 65000
routerid = "192.168.149.2"

peers = [
    "192.168.149.1",
]

बर्ड.कॉन्फ

router id 192.168.1.1;

table rkn;

# Clients
protocol bgp bgp_client1 {
    table rkn;
    local as 65000;
    neighbor 192.168.1.2 as 65000;
    direct;
    bfd on;
    next hop self;
    graceful restart;
    graceful restart time 60;
    export all;
    import none;
}

# DNSTap-BGP
protocol bgp bgp_dnstap {
    table rkn;
    local as 65000;
    neighbor 192.168.149.2 as 65000;
    direct;
    passive on;
    rr client;
    import all;
    export none;
}

# Static routes list
protocol static static_rkn {
    table rkn;
    include "rkn_routes.list";
    import all;
    export none;
}

rkn_routes.list

route 3.226.79.85/32 via "ens3";
route 18.236.189.0/24 via "ens3";
route 3.224.21.0/24 via "ens3";
...

डीएनएस

डिफ़ॉल्ट रूप से, उबंटू में, अनबाउंड बाइनरी को AppArmor प्रोफ़ाइल द्वारा जकड़ा जाता है, जो इसे सभी प्रकार के DNSTap सॉकेट्स से कनेक्ट करने से रोकता है। आप या तो इस प्रोफ़ाइल को हटा सकते हैं, या इसे अक्षम कर सकते हैं:

# cd /etc/apparmor.d/disable && ln -s ../usr.sbin.unbound .
# apparmor_parser -R /etc/apparmor.d/usr.sbin.unbound

इसे शायद प्लेबुक में जोड़ा जाना चाहिए। यह आदर्श है, प्रोफ़ाइल को सही करने और आवश्यक अधिकार जारी करने के लिए, लेकिन मैं बहुत आलसी था।

अनबाउंड.conf

server:
    chroot: ""
    port: 53
    interface: 0.0.0.0
    root-hints: "/var/lib/unbound/named.root"
    auto-trust-anchor-file: "/var/lib/unbound/root.key"
    access-control: 192.168.0.0/16 allow

remote-control:
    control-enable: yes
    control-use-cert: no

dnstap:
    dnstap-enable: yes
    dnstap-socket-path: "/tmp/dnstap.sock"
    dnstap-send-identity: no
    dnstap-send-version: no

    dnstap-log-client-response-messages: yes

डाउनलोडिंग और प्रसंस्करण सूची

IP पतों की सूची को डाउनलोड करने और संसाधित करने के लिए स्क्रिप्ट
यह सूची को डाउनलोड करता है, उपसर्ग तक का योग करता है पीएफएक्स. में नहीं जोड़ें и don_summarize आप आईपी और नेटवर्क को छोड़ने या संक्षेप में नहीं बताने के लिए कह सकते हैं। मुझे यह चाहिए था। मेरे VPS का सबनेट ब्लॉकलिस्ट 🙂 में था

मजेदार बात यह है कि RosKomSvoboda API ब्लॉक डिफ़ॉल्ट पायथन उपयोगकर्ता एजेंट के साथ अनुरोध करता है। लगता है स्क्रिप्ट-किडी को मिल गई। इसलिए, हम इसे ओगनेलिस में बदलते हैं।

अब तक, यह केवल IPv4 के साथ काम करता है। IPv6 की हिस्सेदारी छोटी है, लेकिन इसे ठीक करना आसान होगा। जब तक आपको बर्ड 6 का भी उपयोग नहीं करना है।

आरकेएन.पीवाई

#!/usr/bin/python3

import json, urllib.request, ipaddress as ipa

url = 'https://api.reserve-rbl.ru/api/v2/ips/json'
pfx = '24'

dont_summarize = {
    # ipa.IPv4Network('1.1.1.0/24'),
}

dont_add = {
    # ipa.IPv4Address('1.1.1.1'),
}

req = urllib.request.Request(
    url,
    data=None, 
    headers={
        'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.47 Safari/537.36'
    }
)

f = urllib.request.urlopen(req)
ips = json.loads(f.read().decode('utf-8'))

prefix32 = ipa.IPv4Address('255.255.255.255')

r = {}
for i in ips:
    ip = ipa.ip_network(i)
    if not isinstance(ip, ipa.IPv4Network):
        continue

    addr = ip.network_address

    if addr in dont_add:
        continue

    m = ip.netmask
    if m != prefix32:
        r[m] = [addr, 1]
        continue

    sn = ipa.IPv4Network(str(addr) + '/' + pfx, strict=False)

    if sn in dont_summarize:
        tgt = addr
    else:
        tgt = sn

    if not sn in r:
        r[tgt] = [addr, 1]
    else:
        r[tgt][1] += 1

o = []
for n, v in r.items():
    if v[1] == 1:
        o.append(str(v[0]) + '/32')
    else:
        o.append(n)

for k in o:
    print(k)

अद्यतन करने के लिए स्क्रिप्ट
मैं इसे दिन में एक बार ताज पर चलाता हूं, शायद यह हर 4 घंटे में खींचने लायक है। मेरी राय में, यह नवीनीकरण अवधि है जो आरकेएन को प्रदाताओं से चाहिए। साथ ही, उनके पास कुछ अन्य अति-अत्यावश्यक अवरोधक हैं, जो तेजी से पहुंच सकते हैं।

निम्नलिखित करता है:

  • पहली स्क्रिप्ट चलाता है और मार्गों की सूची को अद्यतन करता है (rkn_routes.list) बर्ड के लिए
  • पक्षी पुनः लोड करें
  • dnstap-bgp के लिए डोमेन की सूची को अपडेट और साफ़ करता है
  • dnstap-bgp को पुनः लोड करें

rkn_update.sh

#!/bin/bash

ROUTES="/etc/bird/rkn_routes.list"
DOMAINS="/var/cache/rkn_domains.txt"

# Get & summarize routes
/opt/rkn.py | sed 's/(.*)/route 1 via "ens3";/' > $ROUTES.new

if [ $? -ne 0 ]; then
    rm -f $ROUTES.new
    echo "Unable to download RKN routes"
    exit 1
fi

if [ -e $ROUTES ]; then
    mv $ROUTES $ROUTES.old
fi

mv $ROUTES.new $ROUTES

/bin/systemctl try-reload-or-restart bird

# Get domains
curl -s https://api.reserve-rbl.ru/api/v2/domains/json -o - | jq -r '.[]' | sed 's/^*.//' | sort | uniq > $DOMAINS.new

if [ $? -ne 0 ]; then
    rm -f $DOMAINS.new
    echo "Unable to download RKN domains"
    exit 1
fi

if [ -e $DOMAINS ]; then
    mv $DOMAINS $DOMAINS.old
fi

mv $DOMAINS.new $DOMAINS

/bin/systemctl try-reload-or-restart dnstap-bgp

वे बिना ज्यादा सोचे-समझे लिखे गए थे, इसलिए यदि आप कुछ ऐसा देखते हैं जिसमें सुधार किया जा सकता है - इसके लिए जाएं।

क्लाइंट सेटअप

यहां मैं लिनक्स राउटर्स के लिए उदाहरण दूंगा, लेकिन मिकरोटिक / सिस्को के मामले में यह और भी आसान होना चाहिए।

सबसे पहले, हमने बर्ड की स्थापना की:

बर्ड.कॉन्फ

router id 192.168.1.2;
table rkn;

protocol device {
    scan time 10;
};

# Servers
protocol bgp bgp_server1 {
    table rkn;
    local as 65000;
    neighbor 192.168.1.1 as 65000;
    direct;
    bfd on;
    next hop self;
    graceful restart;
    graceful restart time 60;
    rr client;
    export none;
    import all;
}

protocol kernel {
    table rkn;
    kernel table 222;
    scan time 10;
    export all;
    import none;
}

इस प्रकार, हम बीजीपी से प्राप्त मार्गों को कर्नेल रूटिंग टेबल नंबर 222 के साथ सिंक्रनाइज़ करेंगे।

उसके बाद, डिफ़ॉल्ट को देखने से पहले कर्नेल को इस प्लेट को देखने के लिए कहना पर्याप्त है:

# ip rule add from all pref 256 lookup 222
# ip rule
0:  from all lookup local
256:    from all lookup 222
32766:  from all lookup main
32767:  from all lookup default

सब कुछ, सर्वर के सुरंग आईपी पते को डीएनएस के रूप में वितरित करने के लिए राउटर पर डीएचसीपी को कॉन्फ़िगर करना बाकी है, और योजना तैयार है।

सीमाएं

डोमेन की सूची बनाने और संसाधित करने के लिए वर्तमान एल्गोरिद्म के साथ, इसमें अन्य बातों के अलावा, शामिल हैं, youtube.com और इसके सीडीएन।

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

निष्कर्ष

वर्णित विधि आपको प्रदाताओं द्वारा वर्तमान में लागू किए जाने वाले लगभग किसी भी अवरोध को बायपास करने की अनुमति देती है।

सिद्धांत रूप में, dnstap-bgp किसी अन्य उद्देश्य के लिए उपयोग किया जा सकता है जहां डोमेन नाम के आधार पर यातायात नियंत्रण के कुछ स्तर की आवश्यकता होती है। बस ध्यान रखें कि हमारे समय में, एक ही आईपी पते (उदाहरण के लिए कुछ Cloudflare के पीछे) पर एक हजार साइटें हैंग हो सकती हैं, इसलिए इस पद्धति की सटीकता कम है।

लेकिन तालों को दरकिनार करने की जरूरतों के लिए यह काफी है।

परिवर्धन, संपादन, पुल अनुरोध - स्वागत है!

स्रोत: www.habr.com

एक टिप्पणी जोड़ें