DNSTap اور BGP کے ساتھ ILV بلاکنگ کو بائی پاس کریں۔

DNSTap اور BGP کے ساتھ ILV بلاکنگ کو بائی پاس کریں۔

میں جانتا ہوں کہ موضوع بہت اچھا ہے. مثال کے طور پر، ایک عظیم ہے مضمون، لیکن وہاں بلاک لسٹ کا صرف IP حصہ سمجھا جاتا ہے۔ ہم ڈومینز بھی شامل کریں گے۔

اس حقیقت کی وجہ سے کہ عدالتیں اور RKN ہر چیز کو دائیں اور بائیں بلاک کر دیتے ہیں، اور فراہم کنندگان بہت کوشش کر رہے ہیں کہ Revizorro کے جاری کردہ جرمانے کی زد میں نہ آئیں، بلاک کرنے سے متعلقہ نقصانات کافی زیادہ ہیں۔ اور "قانونی طور پر" مسدود سائٹس میں بہت سی مفید سائٹیں ہیں (ہیلو، رٹرکر)

میں RKN کے دائرہ اختیار سے باہر رہتا ہوں، لیکن میرے والدین، رشتہ دار اور دوست گھر پر ہی رہے۔ لہذا یہ فیصلہ کیا گیا کہ آئی ٹی سے دور لوگوں کے لیے بلاکنگ کو نظرانداز کرنے کا ایک آسان طریقہ پیش کیا جائے، ترجیحاً ان کی شرکت کے بغیر۔

اس نوٹ میں، میں نیٹ ورک کی بنیادی چیزوں کو مراحل میں بیان نہیں کروں گا، لیکن میں عام اصولوں کو بیان کروں گا کہ اس سکیم کو کیسے نافذ کیا جا سکتا ہے۔ لہذا نیٹ ورک عام طور پر اور لینکس میں خاص طور پر کیسے کام کرتا ہے اس کا علم ہونا ضروری ہے۔

تالے کی اقسام

شروع کرنے کے لیے، آئیے اپنی یادداشت کو تازہ کریں جو بلاک کیا جا رہا ہے۔

RKN سے اتارے گئے XML میں کئی قسم کے تالے ہیں:

  • IP
  • ڈومین۔
  • URL

سادگی کے لیے، ہم ان کو کم کر کے دو کر دیں گے: IP اور ڈومین، اور ہم صرف ڈومین کو URL کے ذریعے بلاک کرنے سے نکال دیں گے (مزید واضح طور پر، وہ ہمارے لیے یہ کام پہلے ہی کر چکے ہیں)۔

سے اچھے لوگ Roskomsvoboda ایک شاندار احساس ہوا APIجس کے ذریعے ہم اپنی ضرورت حاصل کر سکتے ہیں:

مسدود سائٹس تک رسائی

ایسا کرنے کے لیے، ہمیں کچھ چھوٹے غیر ملکی VPS کی ضرورت ہے، ترجیحاً لامحدود ٹریفک کے ساتھ - ان میں سے بہت سے 3-5 روپے میں ہیں۔ آپ کو اسے قریبی بیرون ملک لے جانے کی ضرورت ہے تاکہ پنگ بہت بڑا نہ ہو، لیکن ایک بار پھر، اس بات کو ذہن میں رکھیں کہ انٹرنیٹ اور جغرافیہ ہمیشہ ایک دوسرے کے ساتھ نہیں ہوتے ہیں۔ اور چونکہ 5 روپے کے لیے کوئی SLA نہیں ہے، اس لیے بہتر ہے کہ غلطی برداشت کرنے کے لیے مختلف فراہم کنندگان سے 2+ ٹکڑے لیں۔

اگلا، ہمیں کلائنٹ راؤٹر سے VPS تک ایک انکرپٹڈ ٹنل سیٹ کرنے کی ضرورت ہے۔ میں Wireguard کو ترتیب دینے کے لیے سب سے تیز اور آسان کے طور پر استعمال کرتا ہوں۔ میرے پاس لینکس پر مبنی کلائنٹ راؤٹرز بھی ہیں (اے پی یو 2 یا OpenWRT میں کچھ)۔ کچھ Mikrotik/Cisco کے معاملے میں، آپ ان پر دستیاب پروٹوکول جیسے OpenVPN اور GRE-over-IPSEC استعمال کر سکتے ہیں۔

دلچسپی کی ٹریفک کی شناخت اور ری ڈائریکشن

آپ یقیناً غیر ممالک کے ذریعے تمام انٹرنیٹ ٹریفک کو بند کر سکتے ہیں۔ لیکن، زیادہ تر امکان ہے کہ، مقامی مواد کے ساتھ کام کرنے کی رفتار اس سے بہت متاثر ہوگی۔ اس کے علاوہ، VPS پر بینڈوتھ کی ضروریات بہت زیادہ ہوں گی۔

لہذا، ہمیں کسی نہ کسی طرح بلاک شدہ سائٹوں پر ٹریفک مختص کرنے اور اسے منتخب طور پر سرنگ کی طرف لے جانے کی ضرورت ہوگی۔ یہاں تک کہ اگر کچھ "اضافی" ٹریفک وہاں پہنچ جاتی ہے، تب بھی یہ سرنگ کے ذریعے ہر چیز کو چلانے سے کہیں بہتر ہے۔

ٹریفک کو منظم کرنے کے لیے، ہم BGP پروٹوکول کا استعمال کریں گے اور اپنے VPS سے کلائنٹس تک ضروری نیٹ ورکس کے راستوں کا اعلان کریں گے۔ آئیے BIRD کو سب سے زیادہ فعال اور آسان BGP ڈیمن کے طور پر لیں۔

IP

IP کے ذریعے بلاک کرنے کے ساتھ، سب کچھ واضح ہے: ہم صرف VPS کے ساتھ تمام بلاک شدہ IPs کا اعلان کرتے ہیں۔ مسئلہ یہ ہے کہ اس فہرست میں تقریباً 600 ہزار ذیلی نیٹس ہیں جو API واپس کرتا ہے، اور ان میں سے زیادہ تر /32 میزبان ہیں۔ روٹس کی یہ تعداد کمزور کلائنٹ راؤٹرز کو الجھا سکتی ہے۔

لہذا، فہرست پر کارروائی کرتے وقت، نیٹ ورک / 24 تک خلاصہ کرنے کا فیصلہ کیا گیا تھا اگر اس میں 2 یا زیادہ میزبان ہیں۔ اس طرح راستوں کی تعداد کم ہو کر ~100 ہزار رہ گئی۔ اس کے لیے اسکرپٹ کی پیروی کی جائے گی۔

ڈومینز

یہ زیادہ پیچیدہ ہے اور اس کے کئی طریقے ہیں۔ مثال کے طور پر، آپ ہر کلائنٹ روٹر پر ایک شفاف اسکویڈ انسٹال کر سکتے ہیں اور وہاں HTTP انٹرسیپشن کر سکتے ہیں اور پہلے کیس میں درخواست کردہ URL اور دوسرے میں SNI سے ڈومین حاصل کرنے کے لیے TLS ہینڈ شیک میں جھانک سکتے ہیں۔

لیکن ہر طرح کے نئے ٹی ایل ایس 1.3 + eSNI کی وجہ سے، HTTPS تجزیہ روز بروز کم سے کم حقیقی ہوتا جا رہا ہے۔ ہاں، اور کلائنٹ سائیڈ پر انفراسٹرکچر زیادہ پیچیدہ ہوتا جا رہا ہے - آپ کو کم از کم OpenWRT استعمال کرنا پڑے گا۔

لہذا، میں نے DNS سوالات کے جوابات کو روکنے کا راستہ اختیار کرنے کا فیصلہ کیا۔ یہاں بھی، کوئی بھی DNS-over-TLS/HTTPS آپ کے سر پر منڈلانے لگتا ہے، لیکن ہم (ابھی کے لیے) اس حصے کو کلائنٹ پر کنٹرول کر سکتے ہیں - یا تو اسے غیر فعال کر سکتے ہیں یا DoT/DoH کے لیے اپنا سرور استعمال کر سکتے ہیں۔

ڈی این ایس کو کیسے روکا جائے؟

یہاں بھی کئی طریقے ہو سکتے ہیں۔

  • PCAP یا NFLOG کے ذریعے DNS ٹریفک کو روکنا
    مداخلت کے یہ دونوں طریقے افادیت میں لاگو ہوتے ہیں۔ sidmat. لیکن یہ ایک طویل عرصے سے تعاون یافتہ نہیں ہے اور فعالیت بہت قدیم ہے، لہذا آپ کو اب بھی اس کے لیے ایک ہارنس لکھنے کی ضرورت ہے۔
  • DNS سرور لاگز کا تجزیہ
    بدقسمتی سے، میرے جاننے والے ریکرسر جوابات کو لاگ کرنے کے قابل نہیں ہیں، لیکن صرف درخواستیں کرتے ہیں۔ اصولی طور پر، یہ منطقی ہے، کیونکہ درخواستوں کے برعکس، جوابات کی ساخت پیچیدہ ہوتی ہے اور انہیں متن کی شکل میں لکھنا مشکل ہوتا ہے۔
  • DNSTap
    خوش قسمتی سے، ان میں سے بہت سے پہلے ہی اس مقصد کے لیے DNSTap کی حمایت کرتے ہیں۔

DNSTap کیا ہے؟

DNSTap اور BGP کے ساتھ ILV بلاکنگ کو بائی پاس کریں۔

یہ ایک کلائنٹ سرور پروٹوکول ہے جو پروٹوکول بفرز اور فریم اسٹریمز پر مبنی DNS سرور سے ساختی DNS سوالات اور جوابات کے جمع کرنے والے کو منتقل کرنے کے لیے ہے۔ بنیادی طور پر، DNS سرور استفسار اور جوابی میٹا ڈیٹا (پیغام کی قسم، کلائنٹ/سرور IP، وغیرہ) کے علاوہ مکمل DNS پیغامات (بائنری) فارم میں منتقل کرتا ہے جس میں یہ نیٹ ورک پر ان کے ساتھ کام کرتا ہے۔

یہ سمجھنا ضروری ہے کہ DNSTap پیراڈائم میں، DNS سرور ایک کلائنٹ کے طور پر کام کرتا ہے اور کلکٹر ایک سرور کے طور پر کام کرتا ہے۔ یعنی، DNS سرور کلکٹر سے جڑتا ہے، اور اس کے برعکس نہیں۔

آج DNSTap تمام مقبول DNS سرورز میں تعاون یافتہ ہے۔ لیکن، مثال کے طور پر، BIND بہت سی تقسیموں میں (جیسے Ubuntu LTS) اکثر کسی وجہ سے اس کی حمایت کے بغیر بنایا جاتا ہے۔ تو آئیے دوبارہ جوڑنے سے پریشان نہ ہوں، بلکہ ہلکا اور تیز ریکرسر لیں - ان باؤنڈ۔

DNSTap کیسے پکڑیں؟

ہے کچھ مقدار DNSTap ایونٹس کے سلسلے کے ساتھ کام کرنے کے لیے CLI کی افادیت، لیکن وہ ہمارے مسئلے کو حل کرنے کے لیے موزوں نہیں ہیں۔ لہذا، میں نے اپنی سائیکل ایجاد کرنے کا فیصلہ کیا ہے جو ہر وہ کام کرے گی جو ضروری ہے: dnstap-bgp

کام کا الگورتھم:

  • جب لانچ کیا جاتا ہے، یہ ٹیکسٹ فائل سے ڈومینز کی فہرست لوڈ کرتا ہے، ان کو الٹ دیتا ہے (habr.com -> com.habr)، ٹوٹی ہوئی لائنوں، ڈپلیکیٹس اور ذیلی ڈومینز کو خارج کر دیتا ہے (یعنی اگر فہرست میں habr.com اور www.habr.com شامل ہیں، اسے صرف پہلا لوڈ کیا جائے گا) اور اس فہرست کے ذریعے تیزی سے تلاش کرنے کے لیے ایک سابقہ ​​درخت بناتا ہے۔
  • DNSTap سرور کے طور پر کام کرتے ہوئے، یہ DNS سرور سے کنکشن کا انتظار کرتا ہے۔ اصولی طور پر، یہ UNIX اور TCP ساکٹ دونوں کو سپورٹ کرتا ہے، لیکن جن DNS سرورز کو میں جانتا ہوں وہ صرف UNIX ساکٹ استعمال کر سکتے ہیں۔
  • آنے والے DNSTap پیکٹوں کو پہلے ایک Protobuf ڈھانچے میں ڈی سیریلائز کیا جاتا ہے، اور پھر بائنری DNS پیغام خود، جو کہ Protobuf فیلڈز میں سے ایک میں واقع ہے، DNS RR ریکارڈز کی سطح پر پارس ہو جاتا ہے۔
  • یہ چیک کیا جاتا ہے کہ آیا درخواست کردہ میزبان (یا اس کا پیرنٹ ڈومین) بھری ہوئی فہرست میں ہے، اگر نہیں، تو جواب کو نظر انداز کر دیا جاتا ہے۔
  • جواب سے صرف A/AAAA/CNAME RRs کا انتخاب کیا جاتا ہے اور ان سے متعلقہ IPv4/IPv6 پتے نکالے جاتے ہیں۔
  • آئی پی ایڈریسز قابل ترتیب TTL کے ساتھ کیش کیے جاتے ہیں اور تمام کنفیگر شدہ BGP ساتھیوں کے لیے مشتہر کیے جاتے ہیں۔
  • پہلے سے کیش شدہ آئی پی کی طرف اشارہ کرنے والا جواب موصول ہونے پر، اس کا TTL اپ ڈیٹ ہوجاتا ہے۔
  • TTL کی میعاد ختم ہونے کے بعد، اندراج کو کیشے اور BGP کے اعلانات سے ہٹا دیا جاتا ہے۔

اضافی فعالیت:

  • SIGHUP کے ذریعے ڈومینز کی فہرست کو دوبارہ پڑھنا
  • کیشے کو دیگر مثالوں کے ساتھ مطابقت پذیر رکھنا dnstap-bgp HTTP/JSON کے ذریعے
  • دوبارہ شروع کرنے کے بعد اس کے مواد کو بحال کرنے کے لیے ڈسک پر موجود کیشے کو (بولٹ ڈی بی ڈیٹا بیس میں) ڈپلیکیٹ کریں۔
  • ایک مختلف نیٹ ورک کے نام کی جگہ پر سوئچ کرنے کے لیے سپورٹ (اس کی ضرورت کیوں ہے ذیل میں بیان کی جائے گی)
  • IPv6 سپورٹ

پابندیاں:

  • IDN ڈومینز ابھی تک تعاون یافتہ نہیں ہیں۔
  • چند BGP ترتیبات

میں نے جمع کیا۔ RPM اور DEB آسان تنصیب کے لیے پیکجز. systemd کے ساتھ تمام نسبتاً حالیہ OS پر کام کرنا چاہیے۔ ان کے پاس کوئی انحصار نہیں ہے۔

ڈرائیونگ

تو، آئیے تمام اجزاء کو ایک ساتھ جمع کرنا شروع کریں۔ نتیجے کے طور پر، ہمیں اس نیٹ ورک ٹوپولوجی کی طرح کچھ حاصل کرنا چاہئے:
DNSTap اور BGP کے ساتھ ILV بلاکنگ کو بائی پاس کریں۔

کام کی منطق، میرے خیال میں، خاکہ سے واضح ہے:

  • کلائنٹ نے ہمارے سرور کو DNS کے بطور کنفیگر کیا ہوا ہے، اور DNS استفسارات کو بھی VPN پر جانا چاہیے۔ یہ ضروری ہے تاکہ فراہم کنندہ بلاک کرنے کے لیے DNS مداخلت کا استعمال نہ کر سکے۔
  • سائٹ کو کھولتے وقت، کلائنٹ ایک DNS استفسار بھیجتا ہے جیسے "xxx.org کے IPs کیا ہیں"
  • اباد xxx.org کو حل کرتا ہے (یا اسے کیشے سے لیتا ہے) اور کلائنٹ کو جواب بھیجتا ہے "xxx.org کے پاس فلاں اور فلاں IP ہے"، اسے DNSTap کے ذریعے متوازی طور پر نقل کرتا ہے۔
  • dnstap-bgp میں ان پتوں کا اعلان کرتا ہے۔ پرندہ اگر ڈومین بلاک شدہ فہرست میں ہے تو BGP کے ذریعے
  • پرندہ کے ساتھ ان IPs کے راستے کی تشہیر کرتا ہے۔ next-hop self کلائنٹ راؤٹر
  • کلائنٹ سے ان IPs کے بعد کے پیکٹ سرنگ سے گزرتے ہیں۔

سرور پر، بلاک شدہ سائٹس کے راستوں کے لیے، میں BIRD کے اندر ایک علیحدہ ٹیبل استعمال کرتا ہوں اور یہ کسی بھی طرح سے OS کے ساتھ نہیں جڑتا۔

اس اسکیم میں ایک خرابی ہے: کلائنٹ کی طرف سے پہلا SYN پیکٹ، غالباً، گھریلو فراہم کنندہ کے ذریعے جانے کا وقت ہوگا۔ راستے کا فوری اعلان نہیں کیا جاتا۔ اور یہاں آپشنز اس بات پر منحصر ہیں کہ فراہم کنندہ کس طرح بلاکنگ کرتا ہے۔ اگر وہ صرف ٹریفک چھوڑ دے تو کوئی حرج نہیں۔ اور اگر وہ اسے کچھ DPI پر بھیجتا ہے، تو (نظریاتی طور پر) خصوصی اثرات ممکن ہیں۔

یہ بھی ممکن ہے کہ کلائنٹ DNS TTL معجزات کا احترام نہ کریں، جس کی وجہ سے کلائنٹ ان باؤنڈ پوچھنے کے بجائے اپنے بوسیدہ کیش سے کچھ باسی اندراجات استعمال کر سکتا ہے۔

عملی طور پر، نہ تو پہلی اور نہ ہی دوسری نے میرے لیے مسائل پیدا کیے، لیکن آپ کا مائلیج مختلف ہو سکتا ہے۔

سرور ٹیوننگ

رولنگ کی آسانی کے لئے، میں نے لکھا جوابدہ کے لیے کردار. یہ لینکس کی بنیاد پر سرورز اور کلائنٹس دونوں کو ترتیب دے سکتا ہے (ڈیب پر مبنی تقسیم کے لیے ڈیزائن کیا گیا ہے)۔ تمام ترتیبات بالکل واضح ہیں اور ترتیب دی گئی ہیں۔ inventory.yml. یہ کردار میری بڑی پلے بک سے کاٹا گیا ہے، اس لیے اس میں غلطیاں ہو سکتی ہیں - درخواستیں ھیںچو خوش آمدید 🙂

آئیے اہم اجزاء کے ذریعے چلتے ہیں۔

بی جی پی

ایک ہی میزبان پر دو BGP ڈیمن چلانے میں ایک بنیادی مسئلہ ہے: BIRD لوکل ہوسٹ (یا کسی مقامی انٹرفیس) کے ساتھ BGP پیئرنگ سیٹ اپ نہیں کرنا چاہتا۔ بالکل لفظ سے۔ میلنگ لسٹوں کو گوگل کرنے اور پڑھنے سے کوئی فائدہ نہیں ہوا، ان کا دعویٰ ہے کہ یہ ڈیزائن کے لحاظ سے ہے۔ شاید کوئی راستہ ہو، لیکن مجھے یہ نہیں ملا۔

آپ ایک اور BGP ڈیمون آزما سکتے ہیں، لیکن مجھے BIRD پسند ہے اور یہ میرے ذریعہ ہر جگہ استعمال ہوتا ہے، میں ادارے تیار نہیں کرنا چاہتا۔

لہذا، میں نے نیٹ ورک کے نام کی جگہ کے اندر dnstap-bgp کو چھپا دیا، جو کہ جڑ سے جڑے ہوئے ویتھ انٹرفیس کے ذریعے: یہ ایک پائپ کی طرح ہے، جس کے سرے مختلف نام کی جگہوں میں چپک جاتے ہیں۔ ان میں سے ہر ایک سرے پر، ہم نجی p2p IP ایڈریس لٹکا دیتے ہیں جو میزبان سے آگے نہیں جاتے، اس لیے وہ کچھ بھی ہو سکتے ہیں۔ یہ وہی طریقہ کار ہے جو اندر کے عمل تک رسائی کے لیے استعمال ہوتا ہے۔ سب سے پیار کیا ڈوکر اور دیگر کنٹینرز۔

اس کے لیے لکھا تھا۔ اسکرپٹ اور اوپر بیان کردہ فعالیت کو بالوں کے ذریعے کسی اور نام کی جگہ پر گھسیٹنے کے لیے 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",
]

bird.conf

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";
...

DNS

پہلے سے طے شدہ طور پر، Ubuntu میں، Unbound بائنری کو AppArmor پروفائل کے ذریعے کلیمپ کیا جاتا ہے، جو اسے ہر قسم کے DNSTap ساکٹ سے منسلک ہونے سے منع کرتا ہے۔ آپ یا تو اس پروفائل کو حذف کر سکتے ہیں، یا اسے غیر فعال کر سکتے ہیں:

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

اسے شاید پلے بک میں شامل کیا جانا چاہیے۔ یہ مثالی ہے، یقینا، پروفائل کو درست کرنا اور ضروری حقوق جاری کرنا، لیکن میں بہت سست تھا۔

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 پتوں کی فہرست کو ڈاؤن لوڈ اور پروسیس کرنے کے لیے اسکرپٹ
یہ فہرست کو ڈاؤن لوڈ کرتا ہے، جو سابقہ ​​تک ہوتا ہے۔ پی ایف ایکس. میں شامل نہ کریں и اختصار نہ کریں آپ IPs اور نیٹ ورکس کو چھوڑنے یا خلاصہ نہ کرنے کے لیے کہہ سکتے ہیں۔ مجھے اس کی ضرورت تھی۔ میرے VPS کا سب نیٹ بلاک لسٹ میں تھا 🙂

مضحکہ خیز بات یہ ہے کہ RosKomSvoboda API ڈیفالٹ Python صارف ایجنٹ کے ساتھ درخواستوں کو روکتا ہے۔ ایسا لگتا ہے کہ اسکرپٹ کِڈی کو مل گیا ہے۔ لہذا، ہم اسے Ognelis میں تبدیل کرتے ہیں.

اب تک، یہ صرف IPv4 کے ساتھ کام کرتا ہے۔ IPv6 کا حصہ چھوٹا ہے، لیکن اسے ٹھیک کرنا آسان ہوگا۔ جب تک کہ آپ کو برڈ 6 بھی استعمال نہ کرنا پڑے۔

rkn.py

#!/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 کو فراہم کنندگان سے درکار ہے۔ اس کے علاوہ، ان کے پاس کچھ اور انتہائی فوری بلاکنگ ہے، جو تیزی سے پہنچ سکتی ہے۔

مندرجہ ذیل کرتا ہے:

  • پہلا اسکرپٹ چلاتا ہے اور راستوں کی فہرست کو اپ ڈیٹ کرتا ہے (rkn_routes.list) برڈ کے لیے
  • BIRD کو دوبارہ لوڈ کریں۔
  • 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

وہ زیادہ سوچے سمجھے بغیر لکھے گئے تھے، لہذا اگر آپ کو کوئی ایسی چیز نظر آتی ہے جس میں بہتری لائی جا سکتی ہے تو اس کے لیے جائیں۔

کلائنٹ سیٹ اپ

یہاں میں لینکس راؤٹرز کے لیے مثالیں دوں گا، لیکن Mikrotik/Cisco کے معاملے میں یہ اور بھی آسان ہونا چاہیے۔

سب سے پہلے، ہم نے BIRD قائم کیا:

bird.conf

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;
}

اس طرح، ہم BGP سے موصول ہونے والے راستوں کو کرنل روٹنگ ٹیبل نمبر 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

سب کچھ، سرور کے سرنگ IP ایڈریس کو DNS کے طور پر تقسیم کرنے کے لیے راؤٹر پر DHCP کو ترتیب دینا باقی ہے، اور اسکیم تیار ہے۔

حدود

ڈومینز کی فہرست بنانے اور اس پر کارروائی کرنے کے لیے موجودہ الگورتھم کے ساتھ، اس میں دیگر چیزوں کے علاوہ، youtube.com اور اس کے CDNs۔

اور یہ اس حقیقت کی طرف جاتا ہے کہ تمام ویڈیوز VPN کے ذریعے جائیں گے، جو پورے چینل کو روک سکتا ہے۔ شاید یہ مقبول ڈومینز کی ایک فہرست مرتب کرنے کے قابل ہے - جو کہ RKN کو وقتی طور پر بلاک کرتے ہیں، ہمت پتلی ہے۔ اور تجزیہ کرتے وقت انہیں چھوڑ دیں۔

حاصل يہ ہوا

بیان کردہ طریقہ آپ کو تقریباً کسی بھی بلاکنگ کو نظرانداز کرنے کی اجازت دیتا ہے جسے فراہم کنندگان فی الحال نافذ کرتے ہیں۔

بنیادی طور پر، dnstap-bgp کسی دوسرے مقصد کے لیے استعمال کیا جا سکتا ہے جہاں ڈومین نام کی بنیاد پر ٹریفک کنٹرول کی کچھ سطح کی ضرورت ہوتی ہے۔ ذرا ذہن میں رکھیں کہ ہمارے وقت میں، ایک ہزار سائٹس ایک ہی IP ایڈریس پر لٹک سکتی ہیں (مثال کے طور پر کچھ Cloudflare کے پیچھے)، اس لیے اس طریقہ کی درستگی کافی کم ہے۔

لیکن تالے کو نظرانداز کرنے کی ضروریات کے لیے، یہ کافی ہے۔

اضافے، ترامیم، درخواستیں - خوش آمدید!

ماخذ: www.habr.com

نیا تبصرہ شامل کریں