บายพาสการบล็อก ILV ด้วย DNSTap และ BGP

บายพาสการบล็อก ILV ด้วย DNSTap และ BGP

ฉันรู้ว่าหัวข้อนี้ค่อนข้างถูกโจมตี ยกตัวอย่างมีเรื่องใหญ่ บทความแต่จะมีการพิจารณาเฉพาะส่วน IP ของรายการบล็อกเท่านั้น เราจะเพิ่มโดเมนด้วย

เนื่องจากศาลและ RKN ปิดกั้นทุกอย่างทั้งซ้ายและขวา และผู้ให้บริการพยายามอย่างหนักที่จะไม่ตกอยู่ภายใต้ค่าปรับที่ออกโดย Revizorro ความสูญเสียที่เกี่ยวข้องจากการบล็อกนั้นค่อนข้างมาก และในบรรดาไซต์ที่ถูกบล็อก "ถูกกฎหมาย" ก็ยังมีไซต์ที่มีประโยชน์มากมาย (สวัสดี rutracker)

ฉันอาศัยอยู่นอกเขตอำนาจศาลของ RKN แต่พ่อแม่ ญาติ และเพื่อนของฉันยังคงอยู่ที่บ้าน ดังนั้นจึงตัดสินใจหาวิธีง่ายๆ สำหรับผู้ที่อยู่ห่างไกลจากฝ่ายไอทีในการหลีกเลี่ยงการบล็อก โดยไม่จำเป็นต้องมีส่วนร่วมเลย

ในบันทึกนี้ ฉันจะไม่อธิบายสิ่งพื้นฐานเกี่ยวกับเครือข่ายเป็นขั้นตอน แต่จะอธิบายถึงหลักการทั่วไปของการนำโครงร่างนี้ไปใช้ ดังนั้นความรู้เกี่ยวกับวิธีการทำงานของเครือข่ายโดยทั่วไปและโดยเฉพาะอย่างยิ่งใน Linux จึงเป็นสิ่งที่ต้องมี

ประเภทของล็อค

ก่อนอื่น มารีเฟรชความทรงจำของเราเกี่ยวกับสิ่งที่ถูกบล็อกกันก่อน

มีการล็อกหลายประเภทใน XML ที่ไม่ได้โหลดจาก RKN:

  • IP
  • Домен
  • URL

เพื่อความง่าย เราจะลดให้เหลือสอง: IP และโดเมน และเราจะดึงโดเมนออกจากการบล็อกด้วย URL (หรือเจาะจงกว่านั้นคือ พวกเขาได้ทำสิ่งนี้ให้เราแล้ว)

คนดีจาก รอสคอมสโวโบดา ตระหนักถึงความมหัศจรรย์ APIซึ่งเราจะได้สิ่งที่เราต้องการ:

การเข้าถึงไซต์ที่ถูกบล็อก

ในการดำเนินการนี้ เราจำเป็นต้องมี VPS ต่างประเทศขนาดเล็ก โดยควรมีปริมาณการรับส่งข้อมูลไม่จำกัด - มีหลาย VPS ในราคา 3-5 ดอลลาร์ คุณต้องดำเนินการในต่างประเทศใกล้ ๆ เพื่อให้ ping ไม่ใหญ่มาก แต่โปรดคำนึงอีกครั้งว่าอินเทอร์เน็ตและภูมิศาสตร์ไม่ตรงกันเสมอไป และเนื่องจากไม่มี SLA ในราคา 5 เหรียญ จึงควรรับชิ้นส่วนมากกว่า 2 ชิ้นจากผู้ให้บริการหลายรายเพื่อความทนทานต่อข้อผิดพลาด

ต่อไป เราต้องตั้งค่าอุโมงค์เข้ารหัสจากเราเตอร์ไคลเอ็นต์ไปยัง VPS ฉันใช้ Wireguard เป็นการตั้งค่าที่เร็วและง่ายที่สุด ฉันยังมีเราเตอร์ไคลเอนต์ที่ใช้ Linux (เอพียู2 หรือบางอย่างใน OpenWRT) ในกรณีของ Mikrotik / Cisco บางตัว คุณสามารถใช้โปรโตคอลที่มีอยู่ได้ เช่น OpenVPN และ GRE-over-IPSEC

การระบุและการเปลี่ยนเส้นทางการรับส่งข้อมูลที่น่าสนใจ

แน่นอนคุณสามารถปิดการรับส่งข้อมูลอินเทอร์เน็ตทั้งหมดผ่านต่างประเทศได้ แต่เป็นไปได้มากว่าความเร็วในการทำงานกับเนื้อหาในท้องถิ่นจะต้องทนทุกข์ทรมานอย่างมากจากสิ่งนี้ นอกจากนี้ความต้องการแบนด์วิธบน VPS จะสูงกว่ามาก

ดังนั้นเราจึงจำเป็นต้องจัดสรรการรับส่งข้อมูลไปยังไซต์ที่ถูกบล็อกและเลือกนำไปยังอุโมงค์ แม้ว่าการจราจรจะติดขัดบ้าง แต่ก็ยังดีกว่าการขับรถทุกอย่างผ่านอุโมงค์

ในการจัดการการรับส่งข้อมูล เราจะใช้โปรโตคอล BGP และประกาศเส้นทางไปยังเครือข่ายที่จำเป็นจาก VPS ของเราไปยังไคลเอนต์ ลองใช้ BIRD เป็นหนึ่งใน BGP daemons ที่ใช้งานได้สะดวกและสะดวกที่สุด

IP

ด้วยการบล็อกโดย IP ทุกอย่างชัดเจน: เราเพียงแต่ประกาศ IP ที่ถูกบล็อกทั้งหมดด้วย VPS ปัญหาคือมีซับเน็ตประมาณ 600 ซับเน็ตในรายการที่ API ส่งคืน และส่วนใหญ่เป็นโฮสต์ /32 เส้นทางจำนวนนี้อาจทำให้เราเตอร์ไคลเอนต์ที่อ่อนแอสับสนได้

ดังนั้นเมื่อประมวลผลรายการจึงตัดสินใจสรุปเป็นเครือข่าย / 24 หากมีโฮสต์ 2 ตัวขึ้นไป ดังนั้นจำนวนเส้นทางจึงลดลงเหลือ ~100 เส้นทาง สคริปต์สำหรับเรื่องนี้จะตามมา

โดเมน

ซับซ้อนกว่าและมีหลายวิธี ตัวอย่างเช่น คุณสามารถติดตั้ง Squid แบบโปร่งใสบนเราเตอร์ไคลเอนต์แต่ละตัวและทำการสกัดกั้น HTTP ที่นั่นและแอบดู TLS handshake เพื่อรับ URL ที่ร้องขอในกรณีแรกและโดเมนจาก SNI ในครั้งที่สอง

แต่เนื่องจาก TLS1.3 + eSNI รูปแบบใหม่ทุกประเภท การวิเคราะห์ HTTPS จึงมีความสมจริงน้อยลงทุกวัน ใช่ และโครงสร้างพื้นฐานในฝั่งไคลเอ็นต์มีความซับซ้อนมากขึ้น คุณจะต้องใช้ OpenWRT เป็นอย่างน้อย

ดังนั้นฉันจึงตัดสินใจใช้เส้นทางของการสกัดกั้นการตอบสนองต่อคำขอ DNS ที่นี่เช่นกัน DNS-over-TLS / HTTPS ใดๆ จะเริ่มลอยอยู่เหนือหัวของคุณ แต่เราสามารถควบคุมส่วนนี้บนไคลเอ็นต์ได้ (สำหรับตอนนี้) ไม่ว่าจะเป็นการปิดใช้งานหรือใช้เซิร์ฟเวอร์ของคุณเองสำหรับ DoT / DoH

จะสกัดกั้น DNS ได้อย่างไร?

ที่นี่อาจมีหลายวิธีเช่นกัน

  • การสกัดกั้นการรับส่งข้อมูล DNS ผ่าน PCAP หรือ NFLOG
    วิธีการสกัดกั้นทั้งสองวิธีนี้ถูกนำไปใช้ในยูทิลิตี้ ซิดมัต. แต่ไม่ได้รับการสนับสนุนเป็นเวลานานและฟังก์ชันการทำงานนั้นล้าสมัยมาก ดังนั้นคุณยังคงต้องเขียนสายรัดสำหรับมัน
  • การวิเคราะห์บันทึกเซิร์ฟเวอร์ DNS
    น่าเสียดายที่ตัวเรียกซ้ำที่ฉันรู้จักไม่สามารถบันทึกการตอบกลับได้ แต่ทำได้เฉพาะคำขอเท่านั้น โดยหลักการแล้ว นี่เป็นตรรกะ เนื่องจากคำตอบมีโครงสร้างที่ซับซ้อนซึ่งต่างจากการร้องขอ และเป็นการยากที่จะเขียนในรูปแบบข้อความ
  • DNSTap
    โชคดีที่หลายคนสนับสนุน DNSTap เพื่อจุดประสงค์นี้แล้ว

DNSTap คืออะไร

บายพาสการบล็อก ILV ด้วย DNSTap และ BGP

เป็นโปรโตคอลไคลเอนต์เซิร์ฟเวอร์ที่ใช้โปรโตคอลบัฟเฟอร์และเฟรมสตรีมสำหรับการถ่ายโอนจากเซิร์ฟเวอร์ DNS ไปยังตัวรวบรวมการสืบค้นและการตอบสนอง DNS ที่มีโครงสร้าง โดยพื้นฐานแล้ว เซิร์ฟเวอร์ DNS จะส่งข้อมูลเมตาของแบบสอบถามและการตอบสนอง (ประเภทของข้อความ, IP ของไคลเอ็นต์/เซิร์ฟเวอร์ ฯลฯ) รวมถึงข้อความ DNS ที่สมบูรณ์ในรูปแบบ (ไบนารี) ซึ่งทำงานร่วมกับพวกเขาผ่านเครือข่าย

สิ่งสำคัญคือต้องเข้าใจว่าในกระบวนทัศน์ DNSTap เซิร์ฟเวอร์ DNS ทำหน้าที่เป็นไคลเอนต์ และตัวรวบรวมทำหน้าที่เป็นเซิร์ฟเวอร์ นั่นคือเซิร์ฟเวอร์ DNS เชื่อมต่อกับตัวรวบรวมและไม่ใช่ในทางกลับกัน

วันนี้ DNSTap ได้รับการสนับสนุนในเซิร์ฟเวอร์ DNS ยอดนิยมทั้งหมด แต่ตัวอย่างเช่น BIND ในหลาย ๆ ดิสทริบิวชัน (เช่น Ubuntu LTS) มักจะสร้างขึ้นด้วยเหตุผลบางประการโดยไม่ได้รับการสนับสนุน ดังนั้นอย่ากังวลกับการประกอบซ้ำ แต่ใช้ recursor ที่เบากว่าและเร็วกว่า - Unbound

จะจับ DNSTap ได้อย่างไร?

มี บาง จำนวน ยูทิลิตี้ CLI สำหรับการทำงานกับสตรีมของเหตุการณ์ DNSTap แต่ไม่เหมาะสำหรับการแก้ปัญหาของเรา ดังนั้นฉันจึงตัดสินใจประดิษฐ์จักรยานของตัวเองซึ่งจะทำทุกอย่างที่จำเป็น: DNSTP-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 RR เท่านั้นที่ถูกเลือกจากการตอบกลับ และที่อยู่ IPv4/IPv6 ที่เกี่ยวข้องจะถูกแยกออกมา
  • ที่อยู่ IP จะถูกแคชด้วย TTL ที่กำหนดค่าได้ และโฆษณาไปยังเพียร์ BGP ที่กำหนดค่าทั้งหมด
  • เมื่อได้รับการตอบกลับที่ชี้ไปยัง IP ที่แคชไว้แล้ว TTL จะได้รับการอัปเดต
  • หลังจากที่ TTL หมดอายุ รายการจะถูกลบออกจากแคชและจากประกาศ BGP

ฟังก์ชั่นเพิ่มเติม:

  • อ่านรายชื่อโดเมนซ้ำโดย SIGHUP
  • ทำให้แคชซิงค์กับอินสแตนซ์อื่นๆ DNSTP-BGP ผ่าน HTTP/JSON
  • ทำซ้ำแคชบนดิสก์ (ในฐานข้อมูล BoltDB) เพื่อกู้คืนเนื้อหาหลังจากรีสตาร์ท
  • รองรับการสลับไปใช้เนมสเปซเครือข่ายอื่น (เหตุใดจึงมีการอธิบายไว้ด้านล่าง)
  • รองรับ IPv6

ข้อ จำกัด :

  • โดเมน IDN ยังไม่ได้รับการสนับสนุน
  • การตั้งค่า BGP เล็กน้อย

ฉันรวบรวม RPM และ DEB แพ็คเกจสำหรับการติดตั้งง่าย ควรทำงานกับระบบปฏิบัติการล่าสุดทั้งหมดที่มี systemd พวกเขาไม่มีการพึ่งพาใด ๆ

โครงการนี้

เรามาเริ่มประกอบส่วนประกอบทั้งหมดเข้าด้วยกัน ด้วยเหตุนี้ เราควรได้รับโทโพโลยีเครือข่ายนี้:
บายพาสการบล็อก ILV ด้วย DNSTap และ BGP

ฉันคิดว่าตรรกะของการทำงานชัดเจนจากแผนภาพ:

  • ไคลเอนต์ได้กำหนดค่าเซิร์ฟเวอร์ของเราเป็น DNS และการสืบค้น DNS จะต้องส่งผ่าน VPN ด้วย นี่เป็นสิ่งจำเป็นเพื่อให้ผู้ให้บริการไม่สามารถใช้การสกัดกั้น DNS เพื่อบล็อกได้
  • เมื่อเปิดไซต์ ลูกค้าจะส่งแบบสอบถาม DNS เช่น “IP ของ xxx.org คืออะไร”
  • หลุด แก้ไข xxx.org (หรือรับจากแคช) และส่งการตอบกลับไปยังไคลเอนต์ “xxx.org มี IP ดังกล่าว” โดยทำซ้ำแบบขนานผ่าน DNSTap
  • DNSTP-BGP ประกาศที่อยู่เหล่านี้ใน นก ผ่าน BGP หากโดเมนอยู่ในรายการที่ถูกบล็อก
  • นก โฆษณาเส้นทางไปยัง IP เหล่านี้ด้วย next-hop self เราเตอร์ไคลเอนต์
  • แพ็กเก็ตที่ตามมาจากไคลเอนต์ไปยัง IP เหล่านี้จะผ่านอุโมงค์

บนเซิร์ฟเวอร์ สำหรับเส้นทางไปยังไซต์ที่ถูกบล็อก ฉันใช้ตารางแยกต่างหากภายใน BIRD และตารางดังกล่าวไม่ได้ตัดกับระบบปฏิบัติการแต่อย่างใด

โครงการนี้มีข้อเสียเปรียบ: แพ็กเก็ต SYN แรกจากไคลเอนต์มักจะมีเวลาออกผ่านผู้ให้บริการในประเทศ เส้นทางไม่ได้ประกาศทันที และตัวเลือกนี้เป็นไปได้ขึ้นอยู่กับว่าผู้ให้บริการทำการบล็อกอย่างไร ถ้าเขาแค่ลดการจราจรก็ไม่มีปัญหา และหากเขาเปลี่ยนเส้นทางไปที่ DPI เอฟเฟกต์พิเศษ (ตามทฤษฎี) ก็เป็นไปได้

อาจเป็นไปได้ว่าไคลเอนต์ไม่เคารพปาฏิหาริย์ DNS TTL ซึ่งอาจทำให้ไคลเอนต์ใช้รายการเก่าบางรายการจากแคชที่เน่าเสียแทนที่จะถาม Unbound

ในทางปฏิบัติ ทั้งครั้งแรกและครั้งที่สองทำให้เกิดปัญหาสำหรับฉัน แต่ระยะทางของคุณอาจแตกต่างกันไป

การปรับแต่งเซิร์ฟเวอร์

เพื่อความสะดวกในการกลิ้งฉันเขียน บทบาทของ Ansible. สามารถกำหนดค่าทั้งเซิร์ฟเวอร์และไคลเอนต์โดยใช้ Linux (ออกแบบมาสำหรับการแจกแจงแบบอิงเดบ) การตั้งค่าทั้งหมดค่อนข้างชัดเจนและตั้งค่าไว้แล้ว สินค้าคงคลัง.yml. บทบาทนี้ถูกตัดออกจาก Playbook ขนาดใหญ่ของฉัน ดังนั้นอาจมีข้อผิดพลาด - ดึงคำขอ ยินดีต้อนรับ🙂

มาดูส่วนประกอบหลักกัน

BGP

การเรียกใช้ BGP daemons สองตัวบนโฮสต์เดียวกันมีปัญหาพื้นฐาน: BIRD ไม่ต้องการตั้งค่าการเพียร์ BGP ด้วย localhost (หรืออินเทอร์เฟซภายในเครื่องใดๆ) จากคำว่าเลย Google และการอ่านรายชื่อผู้รับจดหมายไม่ได้ช่วยอะไร พวกเขาอ้างว่านี่เป็นเพราะการออกแบบ บางทีอาจมีวิธีบางอย่าง แต่ฉันไม่พบ

คุณสามารถลองใช้ BGP daemon อื่นได้ แต่ฉันชอบ BIRD และมันถูกใช้ทุกที่โดยฉัน ฉันไม่ต้องการสร้างเอนทิตี

ดังนั้นฉันจึงซ่อน dnstap-bgp ไว้ภายในเนมสเปซเครือข่าย ซึ่งเชื่อมต่อกับรูทผ่านอินเทอร์เฟซ veth: มันเหมือนกับไปป์ ซึ่งส่วนปลายจะยื่นออกมาในเนมสเปซที่ต่างกัน ในแต่ละด้านเหล่านี้ เราจะแขวนที่อยู่ IP p2p ส่วนตัวไว้ซึ่งไม่เกินโฮสต์ เพื่อให้สามารถเป็นอะไรก็ได้ นี่เป็นกลไกเดียวกับที่ใช้ในการเข้าถึงกระบวนการภายใน เป็นที่รักของทุกคน นักเทียบท่าและภาชนะอื่น ๆ

สำหรับสิ่งนี้ถูกเขียนขึ้น สคริปต์ และฟังก์ชันที่อธิบายไว้ข้างต้นสำหรับการลากผมของคุณไปยังเนมสเปซอื่นได้ถูกเพิ่มใน dnstap-bgp ด้วยเหตุนี้จึงต้องรันในฐานะรูทหรือออกให้กับไบนารี CAP_SYS_ADMIN ผ่านคำสั่ง setcap

ตัวอย่างสคริปต์สำหรับการสร้างเนมสเปซ

#!/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",
]

นก.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.รายการ

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

นี่น่าจะเพิ่มเข้าไปใน playbook แน่นอนว่าเป็นการดีที่จะแก้ไขโปรไฟล์และออกสิทธิ์ที่จำเป็น แต่ฉันขี้เกียจเกินไป

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
มันจะดาวน์โหลดรายการ โดยสรุปเป็นคำนำหน้า พีเอฟเอ็กซ์. ใน อย่า_เพิ่ม и อย่า_สรุป คุณสามารถบอก IP และเครือข่ายให้ข้ามหรือไม่สรุปได้ ฉันต้องการมัน ซับเน็ตของ VPS ของฉันอยู่ในรายการบล็อก 🙂

สิ่งที่ตลกคือ RosKomSvoboda API บล็อกคำขอด้วยตัวแทนผู้ใช้ Python เริ่มต้น ดูเหมือนว่า script-kiddy จะเข้าใจแล้ว ดังนั้นเราจึงเปลี่ยนเป็น Ognelis

จนถึงขณะนี้ใช้งานได้กับ IPv4 เท่านั้น ส่วนแบ่งของ IPv6 มีน้อย แต่จะแก้ไขได้ง่าย เว้นแต่คุณจะต้องใช้ bird6 เช่นกัน

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

เขียนโดยไม่ได้คิดอะไรมาก ดังนั้นหากคุณเห็นสิ่งที่สามารถปรับปรุงได้ ก็ลงมือเลย

การตั้งค่าไคลเอนต์

ที่นี่ฉันจะยกตัวอย่างสำหรับเราเตอร์ Linux แต่ในกรณีของ Mikrotik / Cisco มันควรจะง่ายกว่านี้อีก

ขั้นแรก เราตั้งค่า 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

ทุกอย่างยังคงอยู่ในการกำหนดค่า DHCP บนเราเตอร์เพื่อกระจายที่อยู่ IP ของช่องสัญญาณของเซิร์ฟเวอร์เป็น DNS และโครงร่างก็พร้อม

ข้อ จำกัด

ด้วยอัลกอริทึมปัจจุบันสำหรับการสร้างและประมวลผลรายชื่อโดเมน รวมถึงเหนือสิ่งอื่นใด youtube.com และ CDN ของมัน

และสิ่งนี้นำไปสู่ความจริงที่ว่าวิดีโอทั้งหมดจะผ่าน VPN ซึ่งสามารถอุดตันช่องทั้งหมดได้ บางทีมันอาจจะคุ้มค่าที่จะรวบรวมรายการการยกเว้นโดเมนยอดนิยมที่บล็อก RKN ในขณะนี้ แต่ความกล้าก็น้อย และข้ามไปเมื่อทำการแยกวิเคราะห์

ข้อสรุป

วิธีการที่อธิบายไว้ช่วยให้คุณสามารถหลีกเลี่ยงการบล็อกเกือบทั้งหมดที่ผู้ให้บริการใช้งานอยู่ในปัจจุบัน

ในหลักการ DNSTP-BGP สามารถใช้เพื่อวัตถุประสงค์อื่นใดที่จำเป็นต้องมีการควบคุมการรับส่งข้อมูลในระดับหนึ่งตามชื่อโดเมน เพียงจำไว้ว่าในยุคของเรา เว็บไซต์นับพันแห่งสามารถแฮงค์ที่อยู่ IP เดียวกันได้ (เช่น หลัง Cloudflare บางส่วน) ดังนั้นวิธีนี้จึงมีความแม่นยำค่อนข้างต่ำ

แต่สำหรับความต้องการในการเลี่ยงการล็อคก็เพียงพอแล้ว

เพิ่มเติม แก้ไข ดึงคำขอ - ยินดีต้อนรับ!

ที่มา: will.com

เพิ่มความคิดเห็น