Configurarea BGP pentru a ocoli blocarea sau „Cum am încetat să-mi mai fie frică și m-am îndrăgostit de RKN”

Ei bine, despre „iubit” este o exagerare. Mai degrabă, „a fost capabil să coexiste cu”.

După cum știți cu toții, din 16 aprilie 2018, Roskomnadzor blochează accesul la resursele de pe Internet într-un mod extrem de largi, adăugând la „Registrul unificat al numelor de domenii, indexurile de pagini ale site-urilor de pe Internet și adresele de rețea care permit identificarea site-urilor. pe Internet”, care conține informații a căror distribuție este interzisă în Federația Rusă” (în text - doar un registru) până la /10 uneori. Drept urmare, cetățenii Federației Ruse și întreprinderile suferă, pierzând accesul la resursele complet legale de care au nevoie.

După ce am spus în comentariile unuia dintre articolele despre Habré că sunt gata să ajut victimele la înființarea unei scheme de ocolire, mai multe persoane au venit la mine cerându-mi un astfel de ajutor. Când totul a funcționat pentru ei, unul dintre ei a recomandat să descrie tehnica într-un articol. După ce m-am gândit puțin, am decis să rup tăcerea pe site și să încerc o dată să scriu ceva intermediar între un proiect și o postare pe Facebook, adică. habrapost. Rezultatul este în fața ta.

Declinare a responsabilităţii

Deoarece nu este foarte legal să publicați modalități de a ocoli blocarea accesului la informații interzise pe teritoriul Federației Ruse, scopul acestui articol va fi să vorbim despre o metodă care vă permite să automatizați obținerea accesului la resursele care sunt permise pe teritoriul Federației Ruse, dar din cauza acțiunilor altcuiva nu sunt direct accesibile prin furnizorul dvs. Iar accesul la alte resurse obținute ca urmare a acțiunilor din articol este un efect secundar nefericit și nu este în niciun caz scopul articolului.

De asemenea, din moment ce sunt în primul rând un arhitect de rețea prin profesie, vocație și cale de viață, programarea și Linux nu sunt punctele mele forte. Prin urmare, desigur, scripturile pot fi scrise mai bine, problemele de securitate în VPS pot fi rezolvate mai profund etc. Sugestiile dvs. vor fi acceptate cu recunoștință, dacă sunt suficient de detaliate - voi fi bucuros să le adaug la textul articolului.

TL; DR

Automatizăm accesul la resurse prin tunelul dvs. existent folosind o copie a registrului și protocolul BGP. Scopul este de a elimina tot traficul adresat resurselor blocate în tunel. Explicații minime, mai ales instrucțiuni pas cu pas.

De ce ai nevoie pentru asta?

Din păcate, această postare nu este pentru toată lumea. Pentru a utiliza această tehnică, va trebui să combinați mai multe elemente:

  1. Trebuie să aveți un server Linux undeva în afara câmpului de blocare. Sau măcar dorința de a avea un astfel de server – din fericire acum costă de la 9 dolari/an, și eventual mai puțin. Metoda este potrivită și dacă aveți un tunel VPN separat, atunci serverul poate fi localizat în interiorul câmpului de blocare.
  2. Routerul dvs. ar trebui să fie suficient de inteligent pentru a putea
    • orice client VPN care vă place (prefer OpenVPN, dar poate fi PPTP, L2TP, GRE+IPSec sau orice altă opțiune care creează o interfață de tunel);
    • Protocolul BGPv4. Ceea ce înseamnă că pentru SOHO ar putea fi Mikrotik sau orice router cu OpenWRT/LEDE/firmware personalizat similar care îți permite să instalezi Quagga sau Bird. De asemenea, utilizarea unui router pentru computer nu este interzisă. În cazul unei întreprinderi, căutați suport BGP în documentația pentru routerul dvs. de frontieră.
  3. Ar trebui să înțelegeți utilizarea Linux și tehnologiile de rețea, inclusiv protocolul BGP. Sau măcar vrei să-mi faci o astfel de idee. Din moment ce nu sunt pregătit să îmbrățișez imensitatea de data aceasta, va trebui să studiezi pe cont propriu unele aspecte care îți sunt de neînțeles. Cu toate acestea, desigur, voi răspunde la întrebări specifice în comentarii și este puțin probabil să fiu singurul care va răspunde, așa că nu ezitați să întrebați.

Ce este folosit în exemplu

  • O copie a registrului - de la https://github.com/zapret-info/z-i 
  • VPS - Ubuntu 16.04
  • Serviciu de rutare - pasăre 1.6.3   
  • Router - Mikrotik hAP ac
  • Foldere de lucru - deoarece lucrăm ca rădăcină, cele mai multe dintre toate vor fi localizate în folderul principal al rădăcinii. Respectiv:
    • /root/blacklist - folder de lucru cu scriptul de compilare
    • /root/zi - copie a registrului din github
    • /etc/bird - folder standard pentru setările serviciului pentru păsări
  • Adresa IP externă a VPS-ului cu serverul de rutare și punctul de terminare a tunelului este 194.165.22.146, ASN 64998; adresa IP externă a routerului - 81.177.103.94, ASN 64999
  • Adresele IP din interiorul tunelului sunt 172.30.1.1 și, respectiv, 172.30.1.2.

Configurarea BGP pentru a ocoli blocarea sau „Cum am încetat să-mi mai fie frică și m-am îndrăgostit de RKN”

Desigur, puteți utiliza orice alte routere, sisteme de operare și produse software, ajustând soluția la logica lor.

Pe scurt - logica soluției

  1. Activități pregătitoare
    1. Obținerea unui VPS
    2. Ridicarea unui tunel de la router la VPS
  2. Primim și actualizăm în mod regulat o copie a registrului
  3. Instalarea și configurarea serviciului de rutare
  4. Creăm o listă de rute statice pentru serviciul de rutare pe baza registrului
  5. Conectăm routerul la serviciu și configurăm trimiterea întregului trafic prin tunel.

Soluția reală

Activități pregătitoare

Există multe servicii pe Internet care oferă VPS la prețuri extrem de rezonabile. Până acum am găsit și folosesc opțiunea pentru 9 USD/an, dar chiar dacă nu vă deranjați prea mult, există multe opțiuni pentru 1E/lună la fiecare colț. Întrebarea alegerii unui VPS depășește cu mult scopul acestui articol, așa că dacă cineva nu înțelege ceva despre asta, întrebați în comentarii.

Dacă utilizați un VPS nu numai pentru serviciul de rutare, ci și pentru a termina un tunel pe acesta, trebuie să ridicați acest tunel și, aproape sigur, să configurați NAT pentru el. Există un număr mare de instrucțiuni despre aceste acțiuni pe Internet, nu le voi repeta aici. Principala cerință pentru un astfel de tunel este că trebuie să creeze o interfață separată pe router-ul dvs. care să susțină tunelul către VPS. Cele mai utilizate tehnologii VPN îndeplinesc această cerință - de exemplu, OpenVPN în modul tun este perfect.

Obținerea unei copii a registrului

După cum a spus Jabrail: „Cine ne împiedică ne va ajuta”. Deoarece RKN creează un registru al resurselor interzise, ​​ar fi un păcat să nu folosim acest registru pentru a ne rezolva problema. Vom primi o copie a registrului de la github.

Mergem la serverul tău Linux, intrăm în contextul rădăcină (sudo su —) și instalați git dacă nu este deja instalat.

apt install git

Accesați directorul dvs. de acasă și scoateți o copie a registrului.

cd ~ && git clone --depth=1 https://github.com/zapret-info/z-i 

Am configurat o actualizare cron (o fac o dată la 20 de minute, dar poți alege orice interval care te interesează). Pentru a face acest lucru lansăm crontab -e și adăugați următoarea linie la el:

*/20 * * * * cd ~/z-i && git pull && git gc

Conectam un cârlig care va crea fișiere pentru serviciul de rutare după actualizarea registrului. Pentru a face acest lucru, creați un fișier /root/zi/.git/hooks/post-merge cu urmatorul continut:

#!/usr/bin/env bash
changed_files="$(git diff-tree -r --name-only --no-commit-id ORIG_HEAD HEAD)"
check_run() {
    echo "$changed_files" | grep --quiet "$1" && eval "$2"
}
check_run dump.csv "/root/blacklist/makebgp"

și nu uitați să îl faceți executabil

chmod +x /root/z-i/.git/hooks/post-merge

Vom crea scriptul makebgp la care se referă un pic mai târziu.

Instalarea și configurarea unui serviciu de rutare

Instalează pasăre. Din păcate, versiunea de pasăre postată în prezent în depozitele Ubuntu este comparabilă ca prospețime cu fecalele Archaeopteryx, așa că trebuie să adăugăm mai întâi PPA-ul oficial al dezvoltatorilor de software în sistem.

add-apt-repository ppa:cz.nic-labs/bird
apt update
apt install bird

După aceasta, dezactivăm imediat bird pentru IPv6 - nu vom avea nevoie de el în această instalare.

systemctl stop bird6
systemctl disable bird6

Mai jos este un fișier de configurare minimalist al serviciului de păsări (/etc/bird/bird.conf), ceea ce este suficient pentru noi (și vă reamintesc încă o dată că nimeni nu interzice dezvoltarea și reglarea ideii pentru a se potrivi propriilor nevoi)

log syslog all;
router id 172.30.1.1;

protocol kernel {
        scan time 60;
        import none;
#       export all;   # Actually insert routes into the kernel routing table
}

protocol device {
        scan time 60;
}

protocol direct {
        interface "venet*", "tun*"; # Restrict network interfaces it works with
}

protocol static static_bgp {
        import all;
        include "pfxlist.txt";
        #include "iplist.txt";
}

protocol bgp OurRouter {
        description "Our Router";
        neighbor 81.177.103.94 as 64999;
        import none;
        export where proto = "static_bgp";
        local as 64998;
        passive off;
        multihop;
}

ID router - identificatorul routerului, care arată vizual ca o adresă IPv4, dar nu este una. În cazul nostru, poate fi orice număr de 32 de biți în formatul adresei IPv4, dar este o formă bună să indicați exact adresa IPv4 a dispozitivului dvs. (în acest caz, VPS).

protocol direct definește interfețele care vor funcționa cu procesul de rutare. Exemplul oferă câteva exemple de nume, puteți adăuga altele. Puteți șterge pur și simplu linia; în acest caz, serverul va asculta toate interfețele disponibile cu o adresă IPv4.

protocolul static este magia noastră care încarcă liste de prefixe și adrese IP (care sunt de fapt /32 prefixe, desigur) din fișiere pentru anunțul ulterioar. De unde provin aceste liste va fi discutat mai jos. Vă rugăm să rețineți că încărcarea adreselor IP este comentată în mod implicit, motivul pentru care este volumul mare de încărcare. Pentru comparație, la momentul scrierii, există 78 de rânduri în lista de prefixe și 85898 în lista de adrese IP.Recomand insistent să porniți și să depanați numai pe lista de prefixe și dacă să activați sau nu încărcarea IP în viitorul depinde de tine să hotărăști după ce ai experimentat cu routerul tău. Nu fiecare dintre ele poate digera cu ușurință 85 de mii de intrări în tabelul de rutare.

protocol bgp, de fapt, configurează peeringul bgp cu routerul dvs. Adresa IP este adresa interfeței externe a routerului (sau adresa interfeței tunelului de pe partea routerului), 64998 și 64999 sunt numerele sistemelor autonome. În acest caz, ele pot fi alocate sub forma oricăror numere de 16 biți, dar este o practică bună să folosiți numere AS din intervalul privat definit de RFC6996 - 64512-65534 inclusiv (există un format pentru ASN-uri pe 32 de biți, dar în cazul nostru acest lucru este cu siguranță exagerat). Configurația descrisă utilizează eBGP peering, în care numerele sistemelor autonome ale serviciului de rutare și ale routerului trebuie să fie diferite.

După cum puteți vedea, serviciul trebuie să cunoască adresa IP a routerului, așa că, dacă aveți o adresă privată (RFC1918) sau partajată (RFC6598) dinamică sau non-routabilă, nu aveți opțiunea de a ridica peering-ul pe extern. interfață, dar serviciul va funcționa în continuare în interiorul tunelului.

De asemenea, este destul de clar că de la un serviciu puteți furniza rute către mai multe routere diferite - doar duplicați setările pentru ele prin copierea secțiunii protocol bgp și schimbând adresa IP a vecinului. De aceea, exemplul arată setările pentru examinarea în afara tunelului, ca fiind cele mai universale. Este ușor să le eliminați în tunel schimbând adresele IP în setări în consecință.

Procesarea registrului pentru serviciul de rutare

Acum trebuie, de fapt, să creăm liste de prefixe și adrese IP, care au fost menționate în protocolul static la etapa anterioară. Pentru a face acest lucru, luăm fișierul de registry și facem fișierele de care avem nevoie din el folosind următorul script, plasat în /root/blacklist/makebgp

#!/bin/bash
cut -d";" -f1 /root/z-i/dump.csv| tr '|' 'n' |  tr -d ' ' > /root/blacklist/tmpaddr.txt
cat /root/blacklist/tmpaddr.txt | grep / | sed 's_.*_route & reject;_' > /etc/bird/pfxlist.txt
cat /root/blacklist/tmpaddr.txt | sort | uniq | grep -Eo "([0-9]{1,3}[.]){3}[0-9]{1,3}" | sed 's_.*_route &/32 reject;_' > /etc/bird/iplist.txt
/etc/init.d/bird reload
logger 'bgp list compiled'

Nu uitați să îl faceți executabil

chmod +x /root/blacklist/makebgp

Acum îl puteți rula manual și puteți observa aspectul fișierelor din /etc/bird.

Cel mai probabil, bird nu funcționează pentru tine în acest moment, deoarece în etapa anterioară i-ai cerut să caute fișiere care încă nu existau. Prin urmare, îl lansăm și verificăm dacă a pornit:

systemctl start bird
birdc show route

Ieșirea celei de-a doua comenzi ar trebui să arate aproximativ 80 de înregistrări (acest lucru este pentru moment, dar când o configurați, totul va depinde de zelul RKN în blocarea rețelelor) ceva de genul acesta:

54.160.0.0/12      unreachable [static_bgp 2018-04-19] * (200)

Echipă

birdc show protocol

va arăta starea protocoalelor din cadrul serviciului. Până când ați configurat routerul (vezi următorul punct), protocolul OurRouter va fi în starea de pornire (faza Conectare sau Activ), iar după o conexiune reușită va trece în starea de sus (faza stabilită). De exemplu, pe sistemul meu rezultatul acestei comenzi arată astfel:

BIRD 1.6.3 ready.
name     proto    table    state  since       info
kernel1  Kernel   master   up     2018-04-19
device1  Device   master   up     2018-04-19
static_bgp Static   master   up     2018-04-19
direct1  Direct   master   up     2018-04-19
RXXXXXx1 BGP      master   up     13:10:22    Established
RXXXXXx2 BGP      master   up     2018-04-24  Established
RXXXXXx3 BGP      master   start  2018-04-22  Connect       Socket: Connection timed out
RXXXXXx4 BGP      master   up     2018-04-24  Established
RXXXXXx5 BGP      master   start  2018-04-24  Passive

Conectarea unui router

Probabil că toată lumea s-a săturat să citească această cârpă pentru picioare, dar încurajează-te - sfârșitul este aproape. Mai mult, în această secțiune nu voi putea da instrucțiuni pas cu pas - va fi diferit pentru fiecare producător.

Cu toate acestea, vă pot arăta câteva exemple. Logica principală este să ridicăm peering-ul BGP și să atribuim nexthop tuturor prefixelor primite, arătând către tunelul nostru (dacă trebuie să trimitem trafic printr-o interfață p2p) sau adresa IP nexthop dacă traficul va merge către ethernet).

De exemplu, pe Mikrotik în RouterOS, acest lucru este rezolvat după cum urmează

/routing bgp instance set default as=64999 ignore-as-path-len=yes router-id=172.30.1.2
/routing bgp peer add in-filter=dynamic-in multihop=yes name=VPS remote-address=194.165.22.146 remote-as=64998 ttl=default
/routing filter add action=accept chain=dynamic-in protocol=bgp comment="Set nexthop" set-in-nexthop=172.30.1.1

și în Cisco IOS - așa

router bgp 64999
  neighbor 194.165.22.146 remote-as 64998
  neighbor 194.165.22.146 route-map BGP_NEXT_HOP in
  neighbor 194.165.22.146 ebgp-multihop 250
!
route-map BGP_NEXT_HOP permit 10
  set ip next-hop 172.30.1.1

Dacă același tunel este folosit atât pentru peering-ul BGP, cât și pentru transmiterea traficului util, nu este necesar să setați nexthop; acesta va fi setat corect folosind protocolul. Dar dacă îl setați manual, nici nu o va înrăutăți.

Pe alte platforme, va trebui să vă dați seama singur configurația, dar dacă aveți dificultăți, scrieți în comentarii, voi încerca să vă ajut.

După ce sesiunea dvs. BGP a început, rutele către rețele mari au sosit și sunt instalate în tabel, traficul a circulat către adresele de la ele și fericirea este aproape, vă puteți întoarce la serviciul de păsări și puteți încerca să decomentați intrarea de acolo care leagă lista de adrese IP, executați după aceea

systemctl reload bird

și vezi cum a transferat routerul tău aceste 85 de mii de rute. Fii pregătit să deconectați și gândiți-vă ce să faceți cu el :)

În total

Pur teoretic, după parcurgerea pașilor descriși mai sus, aveți acum un serviciu care redirecționează automat traficul către adrese IP interzise în Federația Rusă dincolo de sistemul de filtrare.

Desigur, poate fi îmbunătățit. De exemplu, este destul de ușor să rezumați o listă de adrese IP folosind soluții perl sau python. Un script Perl simplu care face acest lucru folosind Net::CIDR::Lite transformă 85 de mii de prefixe în 60 (nu o mie), dar, desigur, acoperă o gamă mult mai mare de adrese decât este blocată.

Deoarece serviciul funcționează la al treilea nivel al modelului ISO/OSI, nu vă va scuti de blocarea unui site/pagină dacă se rezolvă la adresa greșită, așa cum este înregistrată în registru. Dar, alături de registry, de la github vine și fișierul nxdomain.txt, care cu câteva lovituri de script se transformă cu ușurință într-o sursă de adrese pentru, de exemplu, pluginul SwitchyOmega din Chrome.

De asemenea, este necesar să menționăm că soluția necesită o rafinare suplimentară dacă nu sunteți doar un utilizator de internet, ci și publicați unele resurse pe cont propriu (de exemplu, un site web sau un server de e-mail rulează pe această conexiune). Folosind mijloacele routerului, este necesar să legați strict traficul de ieșire de la acest serviciu la adresa dumneavoastră publică, altfel veți pierde conectivitatea cu acele resurse care sunt acoperite de lista de prefixe primite de router.

Dacă aveți întrebări, întrebați, sunt gata să vă răspund.

UPD. Mulțumesc navion и TerAnYu pentru parametrii pentru git care permit reducerea volumelor de descărcare.

UPD2. Colegi, se pare că am făcut o greșeală neadăugând în articol instrucțiuni pentru amenajarea unui tunel între VPS și router. O mulțime de întrebări sunt ridicate de acest lucru.
Pentru orice eventualitate, voi observa încă o dată că înainte de a începe acest ghid, ați configurat deja un tunel VPN în direcția de care aveți nevoie și ați verificat funcționalitatea acestuia (de exemplu, transformând traficul acolo în mod implicit sau static). Dacă nu ați finalizat încă această fază, nu prea are sens să urmați pașii din articol. Încă nu am propriul meu text despre asta, dar dacă căutați pe Google „configurarea unui server OpenVPN” împreună cu numele sistemului de operare instalat pe VPS și „configurarea unui client OpenVPN” cu numele routerului dvs. , cel mai probabil veți găsi o serie de articole pe acest subiect , inclusiv despre Habré.

UPD3. Nesacrificat Am scris un cod care transformă dump.csv într-un fișier rezultat pentru bird cu rezumat opțional al adreselor IP. Prin urmare, secțiunea „Procesarea registrului pentru serviciul de rutare” poate fi înlocuită prin apelarea programului său. https://habr.com/post/354282/#comment_10782712

UPD4. Puțină muncă asupra erorilor (nu le-am adăugat la text):
1) în schimb systemctl reload bird are sens să folosești comanda birdc configura.
2) în routerul Mikrotik, în loc să schimbați nexthop-ul la IP-ul celei de-a doua părți a tunelului /routing filter add action=accept chain=dynamic-in protocol=bgp comment=»Set nexthop» set-in-nexthop=172.30.1.1 are sens să specificați ruta direct către interfața tunelului, fără o adresă /routing filter add action=accept chain=dynamic-in protocol=bgp comment=»Setați nexthop» set-in-nexthop-direct=<numele interfeței>

UPD5. A apărut un nou serviciu https://antifilter.download, de unde puteți ridica liste gata făcute de adrese IP. Actualizat la fiecare jumătate de oră. Din partea clientului, tot ce rămâne este să încadrezi înregistrările cu „ruta... respingere”.
Și în acest moment, probabil, este suficient să-ți zdrențuiești bunica și să actualizezi articolul.

UPD6. O versiune revizuită a articolului pentru cei care nu vor să-și dea seama, dar vor să înceapă - aici.

Sursa: www.habr.com

Adauga un comentariu