ฉันรู้ว่าหัวข้อนี้ค่อนข้างถูกโจมตี ยกตัวอย่างมีเรื่องใหญ่
เนื่องจากศาลและ RKN ปิดกั้นทุกอย่างทั้งซ้ายและขวา และผู้ให้บริการพยายามอย่างหนักที่จะไม่ตกอยู่ภายใต้ค่าปรับที่ออกโดย Revizorro ความสูญเสียที่เกี่ยวข้องจากการบล็อกนั้นค่อนข้างมาก และในบรรดาไซต์ที่ถูกบล็อก "ถูกกฎหมาย" ก็ยังมีไซต์ที่มีประโยชน์มากมาย (สวัสดี rutracker)
ฉันอาศัยอยู่นอกเขตอำนาจศาลของ RKN แต่พ่อแม่ ญาติ และเพื่อนของฉันยังคงอยู่ที่บ้าน ดังนั้นจึงตัดสินใจหาวิธีง่ายๆ สำหรับผู้ที่อยู่ห่างไกลจากฝ่ายไอทีในการหลีกเลี่ยงการบล็อก โดยไม่จำเป็นต้องมีส่วนร่วมเลย
ในบันทึกนี้ ฉันจะไม่อธิบายสิ่งพื้นฐานเกี่ยวกับเครือข่ายเป็นขั้นตอน แต่จะอธิบายถึงหลักการทั่วไปของการนำโครงร่างนี้ไปใช้ ดังนั้นความรู้เกี่ยวกับวิธีการทำงานของเครือข่ายโดยทั่วไปและโดยเฉพาะอย่างยิ่งใน Linux จึงเป็นสิ่งที่ต้องมี
ประเภทของล็อค
ก่อนอื่น มารีเฟรชความทรงจำของเราเกี่ยวกับสิ่งที่ถูกบล็อกกันก่อน
มีการล็อกหลายประเภทใน XML ที่ไม่ได้โหลดจาก RKN:
- IP
- Домен
- URL
เพื่อความง่าย เราจะลดให้เหลือสอง: IP และโดเมน และเราจะดึงโดเมนออกจากการบล็อกด้วย URL (หรือเจาะจงกว่านั้นคือ พวกเขาได้ทำสิ่งนี้ให้เราแล้ว)
คนดีจาก
- IP:
https://api.reserve-rbl.ru/api/v2/ips/json - โดเมน:
https://api.reserve-rbl.ru/api/v2/domains/json
การเข้าถึงไซต์ที่ถูกบล็อก
ในการดำเนินการนี้ เราจำเป็นต้องมี VPS ต่างประเทศขนาดเล็ก โดยควรมีปริมาณการรับส่งข้อมูลไม่จำกัด - มีหลาย VPS ในราคา 3-5 ดอลลาร์ คุณต้องดำเนินการในต่างประเทศใกล้ ๆ เพื่อให้ ping ไม่ใหญ่มาก แต่โปรดคำนึงอีกครั้งว่าอินเทอร์เน็ตและภูมิศาสตร์ไม่ตรงกันเสมอไป และเนื่องจากไม่มี SLA ในราคา 5 เหรียญ จึงควรรับชิ้นส่วนมากกว่า 2 ชิ้นจากผู้ให้บริการหลายรายเพื่อความทนทานต่อข้อผิดพลาด
ต่อไป เราต้องตั้งค่าอุโมงค์เข้ารหัสจากเราเตอร์ไคลเอ็นต์ไปยัง VPS ฉันใช้ Wireguard เป็นการตั้งค่าที่เร็วและง่ายที่สุด ฉันยังมีเราเตอร์ไคลเอนต์ที่ใช้ Linux (
การระบุและการเปลี่ยนเส้นทางการรับส่งข้อมูลที่น่าสนใจ
แน่นอนคุณสามารถปิดการรับส่งข้อมูลอินเทอร์เน็ตทั้งหมดผ่านต่างประเทศได้ แต่เป็นไปได้มากว่าความเร็วในการทำงานกับเนื้อหาในท้องถิ่นจะต้องทนทุกข์ทรมานอย่างมากจากสิ่งนี้ นอกจากนี้ความต้องการแบนด์วิธบน 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 คืออะไร
เป็นโปรโตคอลไคลเอนต์เซิร์ฟเวอร์ที่ใช้โปรโตคอลบัฟเฟอร์และเฟรมสตรีมสำหรับการถ่ายโอนจากเซิร์ฟเวอร์ DNS ไปยังตัวรวบรวมการสืบค้นและการตอบสนอง DNS ที่มีโครงสร้าง โดยพื้นฐานแล้ว เซิร์ฟเวอร์ DNS จะส่งข้อมูลเมตาของแบบสอบถามและการตอบสนอง (ประเภทของข้อความ, IP ของไคลเอ็นต์/เซิร์ฟเวอร์ ฯลฯ) รวมถึงข้อความ DNS ที่สมบูรณ์ในรูปแบบ (ไบนารี) ซึ่งทำงานร่วมกับพวกเขาผ่านเครือข่าย
สิ่งสำคัญคือต้องเข้าใจว่าในกระบวนทัศน์ DNSTap เซิร์ฟเวอร์ DNS ทำหน้าที่เป็นไคลเอนต์ และตัวรวบรวมทำหน้าที่เป็นเซิร์ฟเวอร์ นั่นคือเซิร์ฟเวอร์ DNS เชื่อมต่อกับตัวรวบรวมและไม่ใช่ในทางกลับกัน
วันนี้ DNSTap ได้รับการสนับสนุนในเซิร์ฟเวอร์ DNS ยอดนิยมทั้งหมด แต่ตัวอย่างเช่น BIND ในหลาย ๆ ดิสทริบิวชัน (เช่น Ubuntu LTS) มักจะสร้างขึ้นด้วยเหตุผลบางประการโดยไม่ได้รับการสนับสนุน ดังนั้นอย่ากังวลกับการประกอบซ้ำ แต่ใช้ recursor ที่เบากว่าและเร็วกว่า - Unbound
จะจับ DNSTap ได้อย่างไร?
มี
ขั้นตอนวิธีการทำงาน:
- เมื่อเปิดใช้งาน จะโหลดรายการโดเมนจากไฟล์ข้อความ สลับกลับ (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 เล็กน้อย
ฉันรวบรวม
โครงการนี้
เรามาเริ่มประกอบส่วนประกอบทั้งหมดเข้าด้วยกัน ด้วยเหตุนี้ เราควรได้รับโทโพโลยีเครือข่ายนี้:
ฉันคิดว่าตรรกะของการทำงานชัดเจนจากแผนภาพ:
- ไคลเอนต์ได้กำหนดค่าเซิร์ฟเวอร์ของเราเป็น 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
ในทางปฏิบัติ ทั้งครั้งแรกและครั้งที่สองทำให้เกิดปัญหาสำหรับฉัน แต่ระยะทางของคุณอาจแตกต่างกันไป
การปรับแต่งเซิร์ฟเวอร์
เพื่อความสะดวกในการกลิ้งฉันเขียน
มาดูส่วนประกอบหลักกัน
BGP
การเรียกใช้ BGP daemons สองตัวบนโฮสต์เดียวกันมีปัญหาพื้นฐาน: BIRD ไม่ต้องการตั้งค่าการเพียร์ BGP ด้วย localhost (หรืออินเทอร์เฟซภายในเครื่องใดๆ) จากคำว่าเลย Google และการอ่านรายชื่อผู้รับจดหมายไม่ได้ช่วยอะไร พวกเขาอ้างว่านี่เป็นเพราะการออกแบบ บางทีอาจมีวิธีบางอย่าง แต่ฉันไม่พบ
คุณสามารถลองใช้ BGP daemon อื่นได้ แต่ฉันชอบ BIRD และมันถูกใช้ทุกที่โดยฉัน ฉันไม่ต้องการสร้างเอนทิตี
ดังนั้นฉันจึงซ่อน dnstap-bgp ไว้ภายในเนมสเปซเครือข่าย ซึ่งเชื่อมต่อกับรูทผ่านอินเทอร์เฟซ veth: มันเหมือนกับไปป์ ซึ่งส่วนปลายจะยื่นออกมาในเนมสเปซที่ต่างกัน ในแต่ละด้านเหล่านี้ เราจะแขวนที่อยู่ IP p2p ส่วนตัวไว้ซึ่งไม่เกินโฮสต์ เพื่อให้สามารถเป็นอะไรก็ได้ นี่เป็นกลไกเดียวกับที่ใช้ในการเข้าถึงกระบวนการภายใน เป็นที่รักของทุกคน นักเทียบท่าและภาชนะอื่น ๆ
สำหรับสิ่งนี้ถูกเขียนขึ้น
ตัวอย่างสคริปต์สำหรับการสร้างเนมสเปซ
#!/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 และเครือข่ายให้ข้ามหรือไม่สรุปได้ ฉันต้องการมัน ซับเน็ตของ 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