د RKN څخه نه پورته شوي XML کې ډیری ډولونه شتون لري:
IP
دنده
URL
د سادگي لپاره، موږ به دوی دوه ته راټیټ کړو: IP او ډومین، او موږ به په ساده ډول د URL لخوا د بلاک کولو څخه ډومین وباسو (په دقیق ډول، دوی لا دمخه زموږ لپاره دا کار کړی دی).
د دې کولو لپاره، موږ ځینې کوچني بهرني VPS ته اړتیا لرو، په غوره توګه د لامحدود ټرافیک سره - د 3-5 پیسو لپاره ډیری یې شتون لري. تاسو اړتیا لرئ دا په نږدې بهر کې واخلئ ترڅو پینګ خورا لوی نه وي ، مګر بیا په پام کې ونیسئ چې انټرنیټ او جغرافیه تل سره نه وي. او له هغه ځایه چې د 5 ډالرو لپاره هیڅ SLA شتون نلري ، نو دا به غوره وي چې د غلطۍ زغم لپاره د مختلف چمتو کونکو څخه 2+ ټوټې واخلئ.
بل ، موږ اړتیا لرو د پیرودونکي روټر څخه VPS ته یو کوډ شوی تونل تنظیم کړو. زه وایرګارډ د تنظیم کولو ترټولو ګړندی او اسانه په توګه کاروم. زه د لینوکس پر بنسټ د پیرودونکي روټرونه هم لرم (APU2 یا په OpenWRT کې یو څه). د ځینې مایکروټیک / سیسکو په حالت کې ، تاسو کولی شئ په دوی کې موجود پروتوکولونه وکاروئ لکه OpenVPN او GRE-over-IPSEC.
د ګټو ټرافیک پیژندنه او بیرته راستنول
تاسو کولی شئ، البته، د بهرنیو هیوادونو له لارې ټول انټرنیټ ټرافیک بند کړئ. مګر، ډیری احتمال، د محلي منځپانګې سره د کار سرعت به له دې څخه ډیر زیانمن شي. برسیره پردې، په VPS کې د بینډ ویت اړتیاوې به خورا لوړې وي.
له همدې امله، موږ به اړتیا ولرو چې په یو ډول بلاک شوي سایټونو ته ترافیک تخصیص کړو او په غوره توګه یې تونل ته لارښود کړو. حتی که ځینې "اضافي" ترافیک هلته راشي، دا لاهم د تونل له لارې د هرڅه چلولو څخه خورا ښه دی.
د ترافیک اداره کولو لپاره ، موږ به د BGP پروتوکول وکاروو او زموږ د VPS څخه پیرودونکو ته اړین شبکې ته لارې اعلان کړو. راځئ چې BIRD یو له خورا فعال او مناسب BGP ډیمونونو څخه واخلو.
IP
د IP لخوا بلاک کولو سره ، هرڅه روښانه دي: موږ په ساده ډول د VPS سره ټول بلاک شوي IPs اعلان کوو. ستونزه دا ده چې په لیست کې شاوخوا 600 زره فرعي سایټونه شتون لري چې API بیرته راګرځي، او ډیری یې /32 کوربه دي. دا شمیر لارې کولی شي ضعیف پیرودونکي راوټرونه ګډوډ کړي.
له همدې امله، کله چې د لیست پروسس کول، پریکړه وشوه چې د شبکې / 24 ته لنډیز ورکړئ که چیرې دا 2 یا ډیر کوربه ولري. په دې توګه، د لارو شمیر ~ 100 زره ته راټیټ شو. د دې لپاره سکریپټ به تعقیب شي.
ډومینونه
دا ډیر پیچلی دی او ډیری لارې شتون لري. د مثال په توګه، تاسو کولی شئ په هر پیرودونکي روټر کې یو شفاف سکویډ نصب کړئ او هلته HTTP مداخله وکړئ او په لومړي قضیه کې غوښتل شوي یو آر ایل او په دویمه کې د SNI څخه ډومین ترلاسه کولو لپاره د TLS هینډشیک ته وګورئ.
مګر د هر ډول نوي شوي TLS1.3 + eSNI له امله، د HTTPS تحلیل هره ورځ لږ او لږ واقع کیږي. هو، او د پیرودونکي اړخ زیربنا خورا پیچلې کیږي - تاسو باید لږترلږه OpenWRT وکاروئ.
له همدې امله ما پریکړه وکړه چې د DNS غوښتنو ته د ځوابونو مداخلې لاره غوره کړم. دلته هم، هر ډول DNS-over-TLS/HTTPS ستاسو په سر باندې ځړول پیل کوي، مګر موږ کولی شو (اوس لپاره) دا برخه په پیرودونکي کنټرول کړو - یا یې غیر فعال کړو یا د DoT / DoH لپاره خپل سرور وکاروو.
د DNS مخنیوی څنګه؟
دلته هم کېدای شي څو لارې وي.
د PCAP یا NFLOG له لارې د DNS ترافیک مداخله
د مداخلې دا دواړه میتودونه په افادیت کې پلي کیږي sidmat. مګر دا د اوږدې مودې لپاره نه دی ملاتړ شوی او فعالیت خورا ابتدايي دی ، نو تاسو لاهم اړتیا لرئ د دې لپاره یو لاسی ولیکئ.
د DNS سرور لاګونو تحلیل
له بده مرغه، ما ته پیژندل شوي تکرارونکي د ځوابونو د ننوتلو توان نلري، مګر یوازې غوښتنې. په اصل کې، دا منطقي ده، ځکه چې د غوښتنو برعکس، ځوابونه پیچلي جوړښت لري او د متن په بڼه یې لیکل ستونزمن دي.
دا د DNS سرور څخه د جوړښت شوي DNS پوښتنو او ځوابونو راټولونکي ته د لیږد لپاره د پروتوکول بفرونو او چوکاټ سټریمونو پراساس د پیرودونکي - سرور پروتوکول دی. په لازمي ډول، د DNS سرور د پوښتنې او ځواب میټاډاټا (د پیغام ډول، د پیرودونکي/سرور IP، او نور) او د (بائنری) بڼه کې د DNS بشپړ پیغامونه لیږدوي په کوم کې چې دا په شبکه کې د دوی سره کار کوي.
دا مهمه ده چې پوه شئ چې د DNSTap تمثیل کې، د DNS سرور د پیرودونکي په توګه کار کوي او راټولونکی د سرور په توګه کار کوي. دا دی، د DNS سرور د راټولونکي سره نښلوي، او برعکس نه.
موجود دي ځینېد د DNSTap پیښو جریان سره کار کولو لپاره د CLI اسانتیاوې ، مګر دا زموږ د ستونزې حل کولو لپاره مناسب ندي. له همدې امله، ما پریکړه وکړه چې خپل بایسکل اختراع کړم چې هر څه به اړین وي: dnstap-bgp
د کار الګوریتم:
کله چې پیل شي، دا د متن فایل څخه د ډومینونو لیست پورته کوي، دوی یې بدلوي (habr.com -> com.habr)، مات شوي لینونه، نقلونه او فرعي ډومینونه خارجوي (د مثال په توګه که لیست habr.com او www.habr.com ولري، دا به یوازې لومړی پورته شي) او د دې لیست له لارې د ګړندي لټون لپاره یو مخکینۍ ونه جوړوي
د DNSTap سرور په توګه عمل کول، دا د DNS سرور څخه پیوستون ته انتظار کوي. په اصل کې، دا د UNIX او TCP ساکټ دواړه ملاتړ کوي، مګر د DNS سرورونه چې زه پوهیږم یوازې د UNIX ساکټونه کارولی شي
پیرودونکي زموږ سرور د DNS په توګه تنظیم کړی دی، او د DNS پوښتنې باید په VPN کې هم لاړ شي. دا اړینه ده چې چمتو کونکي نشي کولی د بلاک کولو لپاره د DNS مداخله وکاروي.
دا باید د لوبې کتاب کې اضافه شي. دا مثالی دی، البته، د پروفایل سمولو او اړین حقونه صادرول، مګر زه ډیر سست وم.
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 پتې لیست ډاونلوډ او پروسس کولو لپاره سکریپټ
دا لیست ډاونلوډ کوي، مخکینۍ ته راټولوي pfx. د شامل نه کړئ и لنډیز مه کوئ تاسو کولی شئ IPs او شبکو ته ووایاست چې پریږدئ یا لنډیز ونه کړئ. ما ورته اړتیا درلوده. زما د VPS فرعي شبکه په بلاک لیست کې وه 🙂
په زړه پورې خبره دا ده چې د RosKomSvoboda API د ډیفالټ Python کارونکي اجنټ سره غوښتنې بندوي. داسې ښکاري چې سکریپټ - ماشوم یې ترلاسه کړ. له همدې امله، موږ دا اوګنلیس ته بدلوو.
تر اوسه پورې، دا یوازې د 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)
له هغې وروسته، دا بسیا ده چې د کرنل څخه وغواړئ چې دا پلیټ وګورئ مخکې له دې چې ډیفالټ وګورئ:
# 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 او د هغې CDNs.
او دا د دې حقیقت لامل کیږي چې ټولې ویډیوګانې به د VPN له لارې تیریږي ، کوم چې کولی شي ټول چینل بند کړي. شاید دا د مشهور ډومینونو لیست ترتیبولو ارزښت لري - د وتلو لپاره چې RKN د اوس وخت لپاره بلاک کوي ، زړونه پتلي دي. او د پارس کولو پر مهال یې پریږدئ.
پایلې
تشریح شوی میتود تاسو ته اجازه درکوي نږدې هر ډول بلاک کول چې چمتو کونکي اوس مهال پلي کوي.