Nastavitev BGP za obhod blokade ali "Kako sem se nehal bati in sem se zaljubil v RKN"

No, v redu, o "ljubil" je pretiravanje. Namesto tega "je lahko sobival z."

Kot vsi veste, od 16. aprila 2018 Roskomnadzor blokira dostop do virov na internetu v izjemno širokem obsegu in dodaja »Enotni register domenskih imen, indekse strani spletnih mest na internetu in omrežne naslove, ki omogočajo identifikacijo spletnih mest. na internetu,« ki vsebuje informacije, katerih distribucija je v Ruski federaciji prepovedana« (v besedilu - samo register) z /10 včasih. Zaradi tega trpijo državljani Ruske federacije in podjetja, ki so izgubili dostop do popolnoma zakonitih virov, ki jih potrebujejo.

Potem ko sem v komentarjih k enemu od člankov na Habréju rekel, da sem pripravljen pomagati žrtvam pri vzpostavitvi obvodne sheme, je k meni prišlo več ljudi s prošnjo za takšno pomoč. Ko jim je vse uspelo, je eden od njih priporočil opis tehnike v članku. Po premisleku sem se odločil, da prekinem molk na strani in poskusim enkrat napisati nekaj vmesnega med projektom in Facebook objavo, tj. habrapost. Rezultat je pred vami.

Zavrnitev odgovornosti

Ker ni zelo zakonito objavljati načinov za izogibanje blokiranju dostopa do informacij, prepovedanih na ozemlju Ruske federacije, bo namen tega članka govoriti o metodi, ki vam omogoča avtomatizirano pridobivanje dostopa do virov, ki so dovoljeni na ozemlju Ruske federacije, vendar zaradi dejanj nekoga drugega niso neposredno dostopni prek vašega ponudnika. In dostop do drugih virov, pridobljen kot posledica dejanj iz članka, je žalosten stranski učinek in nikakor ni namen članka.

Tudi, ker sem po poklicu, poklicu in življenjski poti predvsem mrežni arhitekt, programiranje in Linux nista moja močna točka. Zato je seveda mogoče bolje napisati skripte, globlje obdelati varnostna vprašanja v VPS itd. Vaše predloge bomo sprejeli s hvaležnostjo, če bodo dovolj podrobni - z veseljem jih bom dodal besedilu članka.

TL; DR

Avtomatiziramo dostop do virov prek vašega obstoječega tunela z uporabo kopije registra in protokola BGP. Cilj je odstraniti ves promet, naslovljen na blokirane vire, v tunel. Minimum razlag, večinoma navodila po korakih.

Kaj potrebujete za to?

Žal ta objava ni za vsakogar. Če želite uporabiti to tehniko, boste morali združiti več elementov:

  1. Strežnik linux morate imeti nekje zunaj polja za blokiranje. Ali pa vsaj želja po takem strežniku - na srečo zdaj stane že od 9 $/leto, lahko pa še manj. Metoda je primerna tudi, če imate ločen tunel VPN, potem se lahko strežnik nahaja znotraj blokirnega polja.
  2. Vaš usmerjevalnik bi moral biti dovolj pameten, da bi lahko
    • kateri koli odjemalec VPN, ki vam je všeč (raje imam OpenVPN, lahko pa je PPTP, L2TP, GRE+IPSec ali katera koli druga možnost, ki ustvari tunelski vmesnik);
    • protokol BGPv4. Kar pomeni, da je za SOHO lahko Mikrotik ali kateri koli router z OpenWRT/LEDE/podobnim custom firmwareom, ki omogoča namestitev Quagge ali Birda. Tudi uporaba usmerjevalnika za osebni računalnik ni prepovedana. V primeru podjetja poiščite podporo za BGP v dokumentaciji za vaš mejni usmerjevalnik.
  3. Morali bi razumeti uporabo Linuxa in omrežne tehnologije, vključno s protokolom BGP. Ali vsaj želite dobiti takšno idejo. Ker tokrat nisem pripravljen objeti neizmernosti, boste morali nekatere vidike, ki so vam nerazumljivi, preučiti sami. Vendar bom seveda odgovoril na konkretna vprašanja v komentarjih in verjetno ne bom edini, ki bom odgovarjal, zato ne oklevajte in vprašajte.

Kaj je uporabljeno v primeru

  • Kopija registra - od https://github.com/zapret-info/z-i 
  • VPS - Ubuntu 16.04
  • Storitev usmerjanja - ptica 1.6.3   
  • Usmerjevalnik - Mikrotik hAP ac
  • Delovne mape - ker delamo kot root, bo večina vsega v domači mapi root. Oziroma:
    • /root/blacklist - delovna mapa s skriptom za prevajanje
    • /root/zi - kopija registra iz githuba
    • /etc/bird - standardna mapa za nastavitve storitve ptic
  • Zunanji naslov IP VPS z usmerjevalnim strežnikom in zaključno točko tunela je 194.165.22.146, ASN 64998; zunanji IP naslov usmerjevalnika - 81.177.103.94, ASN 64999
  • Naslova IP znotraj tunela sta 172.30.1.1 oziroma 172.30.1.2.

Nastavitev BGP za obhod blokade ali "Kako sem se nehal bati in sem se zaljubil v RKN"

Seveda lahko uporabite tudi druge usmerjevalnike, operacijske sisteme in programske izdelke ter prilagodite rešitev njihovi logiki.

Na kratko - logika rešitve

  1. Pripravljalne dejavnosti
    1. Pridobivanje VPS
    2. Dvig tunela od usmerjevalnika do VPS
  2. Prejmemo in redno posodabljamo kopijo registra
  3. Namestitev in konfiguracija storitve usmerjanja
  4. Ustvarimo seznam statičnih poti za storitev usmerjanja na podlagi registra
  5. Usmerjevalnik povežemo s storitvijo in konfiguriramo pošiljanje celotnega prometa skozi tunel.

Dejanska rešitev

Pripravljalne dejavnosti

Na internetu je veliko storitev, ki nudijo VPS po izjemno ugodnih cenah. Doslej sem našel in uporabljam možnost za 9 $/leto, a tudi če se ne trudite preveč, je na vsakem vogalu veliko možnosti za 1E/mesec. Vprašanje izbire VPS je daleč zunaj obsega tega članka, zato, če kdo ne razume česa o tem, vprašajte v komentarjih.

Če uporabljate VPS ne samo za storitev usmerjanja, ampak tudi za zaključek tunela na njem, morate dvigniti ta predor in skoraj zagotovo zanj konfigurirati NAT. Na internetu je veliko navodil za ta dejanja, tukaj jih ne bom ponavljal. Glavna zahteva za tak predor je, da mora ustvariti ločen vmesnik na vašem usmerjevalniku, ki podpira predor proti VPS. Večina uporabljenih tehnologij VPN izpolnjuje to zahtevo - na primer OpenVPN v načinu tun je popoln.

Pridobivanje kopije registra

Kot je rekel Jabrail: "Tisti, ki nas ovira, nam bo pomagal." Ker RKN ustvarja register prepovedanih virov, bi bil greh, če tega registra ne bi uporabili za rešitev našega problema. Od githuba bomo prejeli kopijo registra.

Gremo na vaš strežnik Linux, pademo v korenski kontekst (sudo su —) in namestite git, če še ni nameščen.

apt install git

Pojdite v domači imenik in izvlecite kopijo registra.

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

Nastavili smo posodobitev crona (jaz jo naredim enkrat na 20 minut, lahko pa izberete poljuben interval, ki vas zanima). Da bi to naredili, zaženemo crontab -e in ji dodajte naslednjo vrstico:

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

Povezujemo kljuko, ki bo po posodobitvi registra ustvarila datoteke za storitev usmerjanja. Če želite to narediti, ustvarite datoteko /root/zi/.git/hooks/post-merge z naslednjo vsebino:

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

in ne pozabite ga narediti izvršljivega

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

Malo kasneje bomo ustvarili skript makebgp, na katerega se kavelj nanaša.

Namestitev in konfiguracija storitve usmerjanja

Namestite ptico. Na žalost je različica bird, ki je trenutno objavljena v repozitorijih Ubuntu, po svežini primerljiva z iztrebki Archeopteryxa, zato moramo v sistem najprej dodati uradni PPA razvijalcev programske opreme.

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

Po tem takoj onemogočimo ptico za IPv6 - v tej namestitvi je ne bomo potrebovali.

systemctl stop bird6
systemctl disable bird6

Spodaj je minimalistična konfiguracijska datoteka storitve za ptice (/etc/bird/bird.conf), kar je za nas povsem dovolj (in še enkrat vas spomnim, da nihče ne prepoveduje razvijanja in prilagajanja ideje svojim potrebam)

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 usmerjevalnika - identifikator usmerjevalnika, ki je vizualno videti kot naslov IPv4, vendar ni eden. V našem primeru je to lahko katera koli 32-bitna številka v formatu naslova IPv4, vendar je dobro, da navedete točno naslov IPv4 vaše naprave (v tem primeru VPS).

protocol direct določa, kateri vmesniki bodo delovali s postopkom usmerjanja. Primer podaja nekaj primerov imen, lahko dodate še druga. Vrstico lahko preprosto izbrišete; v tem primeru bo strežnik poslušal vse razpoložljive vmesnike z naslovom IPv4.

protocol static je naša čarovnija, ki naloži sezname predpon in naslovov IP (ki so dejansko predpone /32, seveda) iz datotek za naknadno objavo. Od kod izvirajo ti seznami, bomo razpravljali v nadaljevanju. Upoštevajte, da je nalaganje naslovov IP privzeto komentirano, razlog za to je velik obseg nalaganja. Za primerjavo, v času pisanja je na seznamu predpon 78 vrstic, na seznamu naslovov IP pa 85898. Močno priporočam, da začnete in odpravljate napake samo na seznamu predpon in ali omogočite nalaganje IP v prihodnost je na vas, da se odločite po eksperimentiranju z usmerjevalnikom. Vsak od njih ne more zlahka prebaviti 85 tisoč vnosov v usmerjevalni tabeli.

Protocol bgp dejansko vzpostavi bgp peering z vašim usmerjevalnikom. IP naslov je naslov zunanjega vmesnika usmerjevalnika (oz. naslov tunelskega vmesnika na strani usmerjevalnika), 64998 in 64999 sta številki avtonomnih sistemov. V tem primeru jih je mogoče dodeliti v obliki poljubnih 16-bitnih številk, vendar je dobra praksa, da uporabite številke AS iz zasebnega obsega, ki ga določa RFC6996 – vključno z 64512-65534 (obstaja oblika za 32-bitne ASN, ampak v našem primeru je to vsekakor pretirano). Opisana konfiguracija uporablja peering eBGP, pri katerem morata biti številki avtonomnih sistemov storitve usmerjanja in usmerjevalnika različni.

Kot lahko vidite, mora storitev poznati naslov IP usmerjevalnika, tako da, če imate dinamičen ali nepreusmerljiv zasebni (RFC1918) ali skupni (RFC6598) naslov, nimate možnosti dvigniti peering na zunanjem vmesnik, vendar bo storitev še vedno delovala znotraj tunela.

Prav tako je povsem jasno, da lahko iz ene storitve zagotovite poti do več različnih usmerjevalnikov - samo podvojite nastavitve zanje tako, da kopirate razdelek protokola bgp in spremenite sosedov IP naslov. Zato so v primeru prikazane nastavitve za kukanje izven tunela, kot najbolj univerzalne. Enostavno jih je odstraniti v tunel tako, da ustrezno spremenite naslove IP v nastavitvah.

Obdelava registra za storitev usmerjanja

Zdaj moramo dejansko ustvariti sezname predpon in naslovov IP, ki so bili omenjeni v statiki protokola v prejšnji fazi. Če želite to narediti, vzamemo datoteko registra in iz nje naredimo datoteke, ki jih potrebujemo, z uporabo naslednjega skripta, ki je vstavljen /root/črni seznam/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'

Ne pozabite ga narediti izvršljivega

chmod +x /root/blacklist/makebgp

Zdaj ga lahko zaženete ročno in opazujete videz datotek v /etc/bird.

Najverjetneje vam ptica v tem trenutku ne dela, ker ste jo v prejšnji fazi pozvali, naj poišče datoteke, ki še ne obstajajo. Zato ga zaženemo in preverimo, ali se je začel:

systemctl start bird
birdc show route

Izhod drugega ukaza bi moral pokazati približno 80 zapisov (to je zaenkrat, ko pa nastavite, bo vse odvisno od vneme RKN pri blokiranju omrežij) približno takole:

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

Ekipa

birdc show protocol

bo prikazal status protokolov znotraj storitve. Dokler usmerjevalnika ne konfigurirate (glej naslednjo točko), bo protokol OurRouter v začetnem stanju (Connect ali Active phase), po uspešni povezavi pa preide v stanje up (Established phase). Na primer, v mojem sistemu je rezultat tega ukaza videti takole:

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

Povezovanje usmerjevalnika

Verjetno so vsi že naveličani branja te krpice, a bodite pogumni – konec je blizu. Poleg tega v tem razdelku ne bom mogel dati navodil po korakih - za vsakega proizvajalca bo drugače.

Lahko pa vam pokažem nekaj primerov. Glavna logika je dvigniti BGP peering in dodeliti nexthop vsem prejetim predponam, ki kažejo na naš tunel (če moramo poslati promet prek vmesnika p2p) ali IP naslov nexthop, če bo promet šel v ethernet).

Na primer na Mikrotiku v RouterOS je to rešeno takole

/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

in v Cisco IOS - takole

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

Če se isti tunel uporablja za enakovredno BGP in za prenos koristnega prometa, ni treba nastaviti nexthop; pravilno bo nastavljen z uporabo protokola. Toda če ga nastavite ročno, tudi to ne bo poslabšalo.

Na drugih platformah boste morali sami ugotoviti konfiguracijo, če pa imate kakršne koli težave, napišite v komentarje, poskušal vam bom pomagati.

Ko se je vaša seja BGP začela, so poti do velikih omrežij prispele in nameščene v tabeli, je promet stekel do naslovov z njih in je sreča blizu, se lahko vrnete v storitev ptic in poskusite odkomentirati tamkajšnji vnos, ki povezuje seznam naslovov IP, izvedite za tem

systemctl reload bird

in poglejte, kako je vaš usmerjevalnik prenesel teh 85 tisoč poti. Bodite pripravljeni, da se odklopite in razmislite, kaj storiti s tem :)

Skupno

Čisto teoretično, po zaključku zgoraj opisanih korakov, imate zdaj storitev, ki samodejno preusmeri promet na naslove IP, prepovedane v Ruski federaciji, mimo sistema filtriranja.

Seveda se da izboljšati. Na primer, z rešitvami perl ali python je zelo enostavno povzeti seznam naslovov IP. Preprost skript Perl, ki to naredi z uporabo Net::CIDR::Lite, spremeni 85 tisoč predpon v 60 (ne tisoč), vendar seveda pokriva veliko večji obseg naslovov, kot je blokiran.

Ker storitev deluje na tretji ravni modela ISO/OSI, vas ne bo rešila pred blokiranjem spletnega mesta/strani, če se odpravi na napačen naslov, kot je zapisan v registru. Toda skupaj z registrom iz githuba prispe datoteka nxdomain.txt, ki se z nekaj potezami skripte zlahka spremeni v vir naslovov za na primer vtičnik SwitchyOmega v Chromu.

Omeniti je treba tudi, da rešitev zahteva dodatno dodelavo, če niste le uporabnik interneta, ampak tudi sami objavljate nekatere vire (na tej povezavi teče npr. spletna stran ali poštni strežnik). S sredstvi usmerjevalnika je potrebno strogo vezati odhodni promet te storitve na vaš javni naslov, sicer boste izgubili povezljivost s tistimi viri, ki jih pokriva seznam predpon, ki jih prejme usmerjevalnik.

Če imate kakršna koli vprašanja, vprašajte, pripravljen sem odgovoriti.

UPD. Hvala vam navion и TerAnYu za parametre za git, ki omogočajo zmanjšanje količine prenosov.

UPD2. Kolegi, očitno sem naredil napako, ker v članek nisem dodal navodil za nastavitev tunela med VPS in routerjem. Ob tem se odpira veliko vprašanj.
Za vsak slučaj bom še enkrat omenil, da ste pred začetkom tega vodnika že konfigurirali tunel VPN v smeri, ki jo potrebujete, in preverili njegovo funkcionalnost (na primer tako, da ste tja preusmerili promet privzeto ali statično). Če te faze še niste zaključili, ni smiselno slediti korakom v članku. O tem še nimam svojega besedila, toda če v Googlu vnesete »nastavitev strežnika OpenVPN« skupaj z imenom operacijskega sistema, nameščenega na VPS, in »nastavitev odjemalca OpenVPN« z imenom vašega usmerjevalnika , boste najverjetneje našli številne članke o tej temi, tudi na Habréju.

UPD3. Nežrtvovan Napisal sem kodo, ki spremeni dump.csv v nastalo datoteko za ptico z neobveznim povzemanjem naslovov IP. Zato lahko razdelek »Obdelava registra za storitev usmerjanja« nadomestite s klicem njegovega programa. https://habr.com/post/354282/#comment_10782712

UPD4. Malo dela na napakah (nisem jih dodal v besedilo):
1) namesto tega systemctl znova naloži ptico je smiselno uporabiti ukaz konfiguracija birdc.
2) v usmerjevalniku Mikrotik, namesto da bi nexthop spremenili v IP druge strani tunela /routing filter add action=accept chain=dynamic-in protocol=bgp comment=»Set nexthop» set-in-nexthop=172.30.1.1 smiselno je določiti pot neposredno do vmesnika tunela, brez naslova /routing filter add action=accept chain=dynamic-in protocol=bgp comment=»Set nexthop» set-in-nexthop-direct=<ime vmesnika>

UPD5. Pojavila se je nova storitev https://antifilter.download, kjer lahko vzamete že pripravljene sezname naslovov IP. Posodobljeno vsake pol ure. Na strani odjemalca ostane le, da zapise uokvirimo z ustrezno »route... reject«.
In na tej točki je verjetno dovolj, da raztrgate svojo babico in posodobite članek.

UPD6. Prenovljena različica članka za tiste, ki tega ne želijo ugotoviti, vendar želijo začeti - tukaj.

Vir: www.habr.com

Dodaj komentar