Is-suġġett huwa pjuttost imsawta, naf. Per eżempju, hemm kbir artikolu, iżda l-parti tal-IP biss tal-lista ta 'blokk hija kkunsidrata hemmhekk. Se nżidu wkoll domains.
Minħabba l-fatt li l-qrati u l-RKN jimblukkaw kollox fuq il-lemin u x-xellug, u l-fornituri qed jagħmlu ħilithom biex ma jaqgħux taħt il-multi maħruġa minn Revizorro, it-telf assoċjat mill-imblukkar huwa pjuttost kbir. U fost is-siti imblukkati "legalment" hemm ħafna dawk utli (bonjour, rutracker)
Jien noqgħod barra mill-ġurisdizzjoni tal-RKN, iżda l-ġenituri, il-qraba u l-ħbieb tiegħi baqgħu d-dar. Għalhekk ġie deċiż li jinħoloq mod faċli għan-nies 'il bogħod mill-IT biex jaqbżu l-imblukkar, preferibbilment mingħajr il-parteċipazzjoni tagħhom.
F'din in-nota, mhux se niddeskrivi l-affarijiet bażiċi tan-netwerk f'passi, iżda ser niddeskrivi l-prinċipji ġenerali ta 'kif din l-iskema tista' tiġi implimentata. Allura l-għarfien ta 'kif jaħdem in-netwerk b'mod ġenerali u fil-Linux b'mod partikolari huwa indispensabbli.
Tipi ta' serraturi
L-ewwel, ejja jġedded il-memorja tagħna ta 'dak li qed jiġi mblukkat.
Hemm diversi tipi ta' serraturi fl-XML mhux mgħobbi mill-RKN:
IP
Домен
URL
Għas-sempliċità, aħna se nnaqqsuhom għal tnejn: IP u dominju, u aħna sempliċement se niġbdu d-dominju mill-imblukkar permezz tal-URL (b'mod aktar preċiż, diġà għamlu dan għalina).
nies tajbin minn Roskomsvoboda induna mill-isbaħ API, li permezz tagħha nistgħu niksbu dak li neħtieġu:
Biex nagħmlu dan, għandna bżonn xi VPS barranin żgħar, preferibbilment bi traffiku illimitat - hemm ħafna minn dawn għal bucks 3-5. Trid teħodha fil-qrib barra sabiex il-ping ma jkunx kbir ħafna, iżda għal darb'oħra, ikkunsidra li l-Internet u l-ġeografija mhux dejjem jikkoinċidu. U peress li m'hemm l-ebda SLA għal bucks 5, huwa aħjar li tieħu biċċiet 2+ minn fornituri differenti għat-tolleranza tal-ħsarat.
Sussegwentement, irridu nwaqqfu mina kriptata mir-router tal-klijent sal-VPS. Jien nuża Wireguard bħala l-aktar veloċi u faċli biex titwaqqaf. Għandi wkoll client routers ibbażati fuq Linux (APU2 jew xi ħaġa fl-OpenWRT). Fil-każ ta 'xi Mikrotik / Cisco, tista' tuża l-protokolli disponibbli fuqhom bħal OpenVPN u GRE-over-IPSEC.
Identifikazzjoni u direzzjoni mill-ġdid ta' traffiku ta' interess
Tista', ovvjament, itfi t-traffiku kollu tal-Internet minn pajjiżi barranin. Iżda, x'aktarx, il-veloċità tal-ħidma b'kontenut lokali se tbati ħafna minn dan. Barra minn hekk, ir-rekwiżiti tal-bandwidth fuq VPS se jkunu ħafna ogħla.
Għalhekk, ser ikollna b'xi mod nallokaw it-traffiku għal siti imblukkati u nidderiewh b'mod selettiv lejn il-mina. Anke jekk xi ftit mit-traffiku “żejjed” jasal hemm, xorta huwa ferm aħjar milli jsuq kollox mill-mina.
Biex niġġestixxu t-traffiku, se nużaw il-protokoll BGP u nħabbru rotot għan-netwerks meħtieġa mill-VPS tagħna lill-klijenti. Ejja nieħdu BIRD bħala wieħed mill-aktar demons BGP funzjonali u konvenjenti.
IP
Bl-imblukkar bl-IP, kollox huwa ċar: aħna sempliċement inħabbru l-IPs imblukkati kollha b'VPS. Il-problema hija li hemm madwar 600 elf subnets fil-lista li l-API jirritorna, u l-maġġoranza l-kbira tagħhom huma /32 hosts. Dan in-numru ta 'rotot jista' jħawdu routers klijenti dgħajfa.
Għalhekk, meta tiġi pproċessata l-lista, ġie deċiż li tiġbor fil-qosor għan-netwerk / 24 jekk ikollu 2 hosts jew aktar. Għalhekk, in-numru ta 'rotot tnaqqas għal ~ 100 elf. L-iskript għal dan se jsegwi.
Dominji
Huwa aktar ikkumplikat u hemm diversi modi. Pereżempju, tista 'tinstalla Squid trasparenti fuq kull router tal-klijent u tagħmel interċettazzjoni HTTP hemmhekk u tgħarraf fil-handshake TLS sabiex tikseb l-URL mitluba fl-ewwel każ u d-dominju minn SNI fit-tieni.
Iżda minħabba kull xorta ta 'TLS1.3 + eSNI newfangled, l-analiżi HTTPS qed issir dejjem inqas reali kuljum. Iva, u l-infrastruttura fuq in-naħa tal-klijent qed issir aktar ikkumplikata - ser ikollok tuża mill-inqas OpenWRT.
Għalhekk, iddeċidejt li nieħu t-triq tal-interċettazzjoni tat-tweġibiet għal mistoqsijiet DNS. Hawnhekk ukoll, kwalunkwe DNS-over-TLS / HTTPS jibda jdur fuq rasek, iżda nistgħu (għalissa) nikkontrollaw din il-parti fuq il-klijent - jew tiddiżattivaha jew tuża s-server tiegħek stess għal DoT / DoH.
Kif tinterċetta d-DNS?
Hawnhekk ukoll, jista 'jkun hemm diversi approċċi.
Interċettazzjoni tat-traffiku DNS permezz tal-PCAP jew NFLOG
Dawn iż-żewġ metodi ta 'interċettazzjoni huma implimentati fl-utilità sidmat. Iżda ma ġiex appoġġjat għal żmien twil u l-funzjonalità hija primittiva ħafna, għalhekk xorta trid tikteb xedd għaliha.
Analiżi ta 'logs server DNS
Sfortunatament, ir-resorsi magħrufa lili ma jistgħux jirreġistraw tweġibiet, iżda biss talbiet. Fil-prinċipju, dan huwa loġiku, peress li, b'differenza mit-talbiet, it-tweġibiet għandhom struttura kumplessa u huwa diffiċli li tiktebhom f'forma ta 'test.
DNSTap
Fortunatament, ħafna minnhom diġà jappoġġjaw DNSTap għal dan il-għan.
X'inhu DNSTap?
Huwa protokoll klijent-server ibbażat fuq Protocol Buffers u Frame Streams għat-trasferiment minn server DNS għal kollettur ta 'mistoqsijiet u tweġibiet strutturati tad-DNS. Essenzjalment, is-server DNS jittrasmetti metadata ta' mistoqsija u rispons (tip ta' messaġġ, IP klijent/server, eċċ.) flimkien ma' messaġġi DNS kompluti fil-forma (binarja) li fiha jaħdem magħhom fuq in-netwerk.
Huwa importanti li wieħed jifhem li fil-paradigma DNSTap, is-server DNS jaġixxi bħala klijent u l-kollettur jaġixxi bħala server. Jiġifieri, is-server DNS jgħaqqad mal-kollettur, u mhux viċi versa.
Illum DNSTap huwa appoġġjat fis-servers DNS popolari kollha. Iżda, pereżempju, BIND f'ħafna distribuzzjonijiet (bħal Ubuntu LTS) spiss jinbena għal xi raġuni mingħajr l-appoġġ tiegħu. Mela ejja ma niddejqux bl-assemblaġġ mill-ġdid, imma ħu recursor eħfef u aktar mgħaġġel - Unbound.
Kif taqbad DNSTap?
Hemm xi wħudNumru Utilitajiet CLI biex jaħdmu ma 'fluss ta' avvenimenti DNSTap, iżda mhumiex adattati biex issolvi l-problema tagħna. Għalhekk, iddeċidejt li nivvinta r-rota tiegħi stess li se tagħmel dak kollu li huwa meħtieġ: dnstap-bgp
Algoritmu tax-xogħol:
Meta titnieda, jgħabbi lista ta’ oqsma minn fajl test, jaqlebhom (habr.com -> com.habr), teskludi linji miksura, duplikati u sottodominji (jiġifieri jekk il-lista jkun fiha habr.com u www.habr.com, se jitgħabba l-ewwel waħda biss) u tibni siġra tal-prefiss għal tiftix mgħaġġel permezz ta 'din il-lista
Filwaqt li jaġixxi bħala server DNSTap, jistenna konnessjoni minn server DNS. Fil-prinċipju, jappoġġja kemm sockets UNIX kif ukoll TCP, iżda s-servers DNS li naf jistgħu jużaw biss sockets UNIX
Pakketti DNSTap deħlin huma l-ewwel deserialized fi struttura Protobuf, u mbagħad il-messaġġ binarju DNS innifsu, li jinsab f'wieħed mill-oqsma Protobuf, jiġi parsed għal-livell ta 'rekords DNS RR.
Huwa ċċekkjat jekk il-host mitluba (jew id-dominju ġenitur tiegħu) huwiex fil-lista mgħobbija, jekk le, ir-rispons jiġi injorat
A/AAAA/CNAME RRs biss jintgħażlu mir-rispons u l-indirizzi IPv4/IPv6 korrispondenti huma estratti minnhom
L-indirizzi IP huma miżmuma fil-cache b'TTL konfigurabbli u reklamati lill-pari BGP konfigurati kollha
Meta tirċievi tweġiba li tipponta lejn IP diġà fil-cache, it-TTL tiegħu jiġi aġġornat
Wara li jiskadi t-TTL, id-dħul titneħħa mill-cache u mill-avviżi tal-BGP
Funzjonalità addizzjonali:
Qari mill-ġdid tal-lista ta 'dominji minn SIGHUP
Żamma tal-cache sinkronizzata ma 'każijiet oħra dnstap-bgp permezz HTTP/JSON
Idduplika l-cache fuq id-diska (fid-database BoltDB) biex tirrestawra l-kontenut tagħha wara bidu mill-ġdid
Appoġġ għall-bidla għal spazju tal-isem tan-netwerk differenti (għaliex dan huwa meħtieġ se jiġi deskritt hawn taħt)
Appoġġ IPv6
Limitazzjonijiet:
Id-dominji tal-IDN għadhom mhumiex appoġġjati
Ftit settings tal-BGP
I ġabar RPM u DEB pakketti għal installazzjoni faċli. Għandu jaħdem fuq l-OS kollha relattivament reċenti b'systemd. m'għandhom l-ebda dipendenzi.
L-iskema
Allura, ejja nibdew assemblaġġ il-komponenti kollha flimkien. Bħala riżultat, għandna nġibu xi ħaġa bħal din it-topoloġija tan-netwerk:
Il-loġika tax-xogħol, naħseb, hija ċara mid-dijagramma:
Il-klijent għandu s-server tagħna kkonfigurat bħala DNS, u l-mistoqsijiet tad-DNS għandhom ukoll imorru fuq il-VPN. Dan huwa meħtieġ sabiex il-fornitur ma jistax juża l-interċettazzjoni tad-DNS biex jimblokka.
Meta tiftaħ is-sit, il-klijent jibgħat mistoqsija DNS bħal "x'inhuma l-IPs ta 'xxx.org"
M'hemmx obbligi isolvi xxx.org (jew jeħodha mill-cache) u tibgħat tweġiba lill-klijent "xxx.org għandha tali IP jew tali", u tidduplikaha b'mod parallel permezz ta' DNSTap
dnstap-bgp iħabbar dawn l-indirizzi fi GĦASAFAR permezz ta' BGP jekk id-dominju jinsab fil-lista imblukkata
GĦASAFAR tirreklama rotta għal dawn l-IPs bi next-hop self klijent router
Pakketti sussegwenti mill-klijent għal dawn l-IPs jgħaddu mill-mina
Fuq is-server, għal rotot lejn siti imblukkati, nuża tabella separata ġewwa BIRD u ma taqsam ma 'l-OS bl-ebda mod.
Din l-iskema għandha żvantaġġ: l-ewwel pakkett SYN mill-klijent, x'aktarx, ikollu ħin biex jitlaq permezz tal-fornitur domestiku. ir-rotta ma titħabbarx immedjatament. U hawn għażliet huma possibbli skont kif il-fornitur jagħmel l-imblukkar. Jekk huwa biss qtar tat-traffiku, allura m'hemm l-ebda problema. U jekk jidderieġih għal xi DPI, allura (teoretikament) effetti speċjali huma possibbli.
Huwa wkoll possibbli li l-klijenti ma jirrispettawx il-mirakli DNS TTL, li jistgħu jikkawżaw lill-klijent juża xi entrati skaduti mill-cache immuffat tiegħu minflok ma jistaqsi Unbound.
Fil-prattika, la l-ewwel u lanqas it-tieni ma kkawżawli problemi, iżda l-mili tiegħek jista 'jvarja.
Irfinar tas-Server
Għall-faċilità ta 'rolling, ktibt rwol għal Ansible. Jista 'jikkonfigura kemm servers kif ukoll klijenti bbażati fuq Linux (iddisinjati għal distribuzzjonijiet ibbażati fuq deb). Is-settings kollha huma pjuttost ovvji u huma stabbiliti inventarju.yml. Dan ir-rwol huwa maqtugħ mill-playbook kbir tiegħi, għalhekk jista 'jkun fih żbalji - tiġbed talbiet merħba 🙂
Ejja ngħaddu mill-komponenti ewlenin.
bgp
It-tħaddim ta' żewġ daemons BGP fuq l-istess host għandu problema fundamentali: BIRD ma tridx twaqqaf BGP peering mal-localhost (jew kwalunkwe interface lokali). Mill-kelma fil-livelli kollha. Il-googling u l-qari tal-listi tal-posta ma għenux, huma jsostnu li dan huwa skont id-disinn. Forsi hemm xi mod, imma ma sibtx.
Tista 'tipprova daemon BGP ieħor, imma jien inħobb BIRD u jintuża kullimkien minni, ma rridx nipproduċi entitajiet.
Għalhekk, ħbejt dnstap-bgp ġewwa l-ispazju tal-isem tan-netwerk, li huwa konness mal-għerq permezz tal-interface veth: huwa bħal pajp, li t-truf tiegħu joħorġu fi spazji tal-isem differenti. Fuq kull wieħed minn dawn it-truf, aħna hang indirizzi IP p2p privati li ma jmorrux lil hinn mill-host, sabiex ikunu jistgħu jkunu xi ħaġa. Dan huwa l-istess mekkaniżmu użat għall-aċċess għall-proċessi ġewwa maħbub minn kulħadd Docker u kontenituri oħra.
Għal dan inkiteb iskrittura u l-funzjonalità diġà deskritta hawn fuq biex tkaxkar lilek innifsek mix-xagħar għal namespace ieħor ġiet miżjuda ma 'dnstap-bgp. Minħabba dan, għandu jitħaddem bħala root jew jinħareġ lill-binarju CAP_SYS_ADMIN permezz tal-kmand setcap.
Eżempju ta' skript għall-ħolqien ta' namespace
#!/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
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
B'mod awtomatiku, f'Ubuntu, il-binarju Unbound huwa kklampjat mill-profil AppArmor, li jipprojbixxih milli jgħaqqad ma 'kull xorta ta' sokits DNSTap. Tista' jew tħassar dan il-profil, jew tiddiżattivah:
Dan probabbilment għandu jiżdied mal-playbook. Huwa ideali, ovvjament, li tikkoreġi l-profil u toħroġ id-drittijiet meħtieġa, imma kont għażżien wisq.
mhux marbut.konf
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
Tniżżil u pproċessar ta' listi
Skript għat-tniżżil u l-ipproċessar ta' lista ta' indirizzi IP
Huwa jniżżel il-lista, tiġbor sal-prefiss pfx. Fil dont_add и dont_summarize tista 'tgħid lill-IPs u n-netwerks biex jaqbżu jew ma jiġbrux fil-qosor. kelli bżonnha. is-subnet tal-VPS tiegħi kien fil-lista tal-blokk 🙂
Il-ħaġa umoristiċi hija li l-API RosKomSvoboda timblokka t-talbiet bl-aġent tal-utent Python default. Jidher li l-iskript-kiddy ltqajna. Għalhekk, nibdluh għal Ognelis.
S'issa, jaħdem biss bl-IPv4. is-sehem tal-IPv6 huwa żgħir, iżda se jkun faċli biex jiġi ffissat. Sakemm ma jkollokx tuża bird6 ukoll.
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)
Script biex taġġorna
I run fuq il-kuruna darba kuljum, forsi ta 'min jiġbduha kull 4 sigħat. dan, fl-opinjoni tiegħi, huwa l-perjodu ta’ tiġdid li l-RKN teħtieġ mingħand il-fornituri. Barra minn hekk, għandhom xi imblukkar super-urġenti ieħor, li jista 'jasal aktar malajr.
Jagħmel dan li ġej:
Imexxi l-ewwel skript u jaġġorna l-lista tar-rotot (rkn_routes.list) għal BIRD
Reload BIRD
Jaġġorna u jnaddaf il-lista ta 'dominji għal dnstap-bgp
Reload 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
Inkitbu mingħajr ħafna ħsieb, allura jekk tara xi ħaġa li tista 'titjieb - mur għaliha.
Setup tal-klijent
Hawnhekk se nagħti eżempji għal routers Linux, iżda fil-każ ta 'Mikrotik / Cisco għandu jkun saħansitra aktar faċli.
L-ewwel, waqqafna BIRD:
għasfur.konf
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;
}
Għalhekk, se nissinkronizzaw ir-rotot riċevuti minn BGP mat-tabella tar-routing tal-kernel numru 222.
Wara dan, huwa biżżejjed li titlob lill-qalba biex tħares lejn din il-pjanċa qabel ma tħares lejn dik default:
# 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
Kollox, għad irid jiġi kkonfigurat DHCP fuq ir-router biex iqassam l-indirizz IP tal-mina tas-server bħala DNS, u l-iskema hija lesta.
Limitazzjonijiet
Bl-algoritmu attwali għall-ġenerazzjoni u l-ipproċessar tal-lista ta 'dominji, jinkludi, fost affarijiet oħra, youtube.com u s-CDNs tagħha.
U dan iwassal għall-fatt li l-vidjows kollha se jgħaddu mill-VPN, li jista 'jmiss il-kanal kollu. Forsi ta 'min jikkompila lista ta' oqsma popolari-esklużjonijiet li jimblukkaw l-RKN għalissa, l-imsaren huma rqaq. U aqbeżhom meta taqbadhom.
Konklużjoni
Il-metodu deskritt jippermettilek tevita kważi kull imblukkar li l-fornituri bħalissa jimplimentaw.
Bażikament, dnstap-bgp jista' jintuża għal kwalunkwe skop ieħor fejn ikun meħtieġ xi livell ta' kontroll tat-traffiku abbażi tal-isem tad-dominju. Żomm f'moħħok li fi żmienna, elf sit jistgħu jiddendlu fuq l-istess indirizz IP (wara xi Cloudflare, pereżempju), għalhekk dan il-metodu għandu preċiżjoni pjuttost baxxa.
Iżda għall-ħtiġijiet ta 'bypassing serraturi, dan huwa pjuttost biżżejjed.