Nastavenie BGP na obídenie blokovania alebo „Ako som sa prestal báť a zamiloval som sa do RKN“

Dobre, slovo „milovaný“ je prehnané. Skôr „bol schopný koexistovať s“.

Ako všetci viete, od 16. apríla 2018 Roskomnadzor extrémne širokými ťahmi blokuje prístup k zdrojom na internete a pridáva do „Jednotného registra názvov domén, indexov stránok stránok na internete a sieťových adries, ktoré umožňujú identifikáciu stránok na internete,“ obsahujúci informácie, ktorých šírenie je v Ruskej federácii zakázané“ (v texte - len register) od /10 niekedy. V dôsledku toho trpia občania Ruskej federácie a podniky, pretože stratili prístup k úplne legálnym zdrojom, ktoré potrebujú.

Po tom, čo som v komentároch k jednému z článkov o Habré povedal, že som pripravený pomôcť obetiam s nastavením obchvatu, prišlo za mnou niekoľko ľudí s prosbou o takúto pomoc. Keď im všetko fungovalo, jeden z nich odporučil opísať techniku ​​v článku. Po premýšľaní som sa rozhodol prelomiť mlčanie na stránke a skúsiť raz napísať niečo medzi projektom a príspevkom na Facebooku, t.j. habrapost. Výsledok je pred vami.

Vylúčenie zodpovednosti

Keďže nie je veľmi legálne zverejňovať spôsoby, ako obísť blokovanie prístupu k informáciám zakázaným na území Ruskej federácie, účelom tohto článku bude hovoriť o metóde, ktorá vám umožní automatizovať získanie prístupu k zdrojom povoleným na území Ruskej federácie. území Ruskej federácie, ale v dôsledku konania niekoho nie sú priamo prístupné prostredníctvom vášho poskytovateľa. A prístup k ďalším zdrojom získaným v dôsledku činností z článku je nešťastným vedľajším účinkom a v žiadnom prípade nie je účelom článku.

Taktiež, keďže som povolaním, povolaním a životnou cestou predovšetkým sieťový architekt, programovanie a Linux nie sú moje silné stránky. Preto sa samozrejme dajú lepšie písať skripty, hlbšie rozpracovať bezpečnostné problémy vo VPS atď. Vaše návrhy budú prijaté s vďakou, ak budú dostatočne podrobné - rád ich doplním do textu článku.

TL; DR

Automatizujeme prístup k zdrojom cez váš existujúci tunel pomocou kópie registra a protokolu BGP. Cieľom je odstrániť všetku komunikáciu adresovanú zablokovaným zdrojom do tunela. Minimálne vysvetlenia, väčšinou pokyny krok za krokom.

Čo k tomu potrebujete?

Bohužiaľ, tento príspevok nie je pre každého. Ak chcete použiť túto techniku, budete musieť spojiť niekoľko prvkov:

  1. Musíte mať linuxový server niekde mimo blokovacieho poľa. Alebo aspoň túžba mať takýto server - našťastie to teraz stojí od 9 dolárov ročne a možno aj menej. Metóda je tiež vhodná, ak máte samostatný tunel VPN, potom môže byť server umiestnený v blokovacom poli.
  2. Váš router by mal byť dostatočne inteligentný, aby to dokázal
    • akýkoľvek klient VPN, ktorý sa vám páči (preferujem OpenVPN, ale môže to byť PPTP, L2TP, GRE + IPSec alebo akákoľvek iná možnosť, ktorá vytvára rozhranie tunela);
    • protokol BGPv4. Čo znamená, že pre SOHO to môže byť Mikrotik alebo akýkoľvek router s vlastným firmvérom OpenWRT/LEDE/podobným, ktorý vám umožní nainštalovať Quagga alebo Bird. Používanie PC routera tiež nie je zakázané. V prípade podniku vyhľadajte podporu BGP v dokumentácii k vášmu hraničnému smerovaču.
  3. Mali by ste rozumieť používaniu Linuxu a sieťovým technológiám vrátane protokolu BGP. Alebo aspoň chcete získať takýto nápad. Keďže tentoraz nie som pripravený prijať tú nesmiernosť, niektoré aspekty, ktoré sú pre vás nepochopiteľné, si budete musieť naštudovať sami. Na konkrétne otázky však, samozrejme, odpoviem v komentároch a je nepravdepodobné, že odpoviem iba ja, takže sa neváhajte opýtať.

Čo je použité v príklade

  • Kópia registra - od https://github.com/zapret-info/z-i 
  • VPS - Ubuntu 16.04
  • Smerovacia služba - vták 1.6.3   
  • Router - Mikrotik hAP ac
  • Pracovné priečinky – keďže pracujeme ako root, väčšina všetkého sa bude nachádzať v domovskom priečinku roota. Respektíve:
    • /root/blacklist - pracovný priečinok s kompilačným skriptom
    • /root/zi - kópia registra z githubu
    • /etc/bird - štandardný priečinok pre nastavenia služby bird
  • Externá IP adresa VPS so smerovacím serverom a koncovým bodom tunela je 194.165.22.146, ASN 64998; externá IP adresa smerovača - 81.177.103.94, ASN 64999
  • IP adresy vo vnútri tunela sú 172.30.1.1 a 172.30.1.2.

Nastavenie BGP na obídenie blokovania alebo „Ako som sa prestal báť a zamiloval som sa do RKN“

Samozrejme môžete použiť akékoľvek iné smerovače, operačné systémy a softvérové ​​produkty, pričom riešenie prispôsobíte ich logike.

Stručne - logika riešenia

  1. Prípravné akcie
    1. Získanie VPS
    2. Vybudovanie tunela zo smerovača do VPS
  2. Dostávame a pravidelne aktualizujeme kópiu registra
  3. Inštalácia a konfigurácia smerovacej služby
  4. Na základe registra vytvoríme zoznam statických trás pre smerovaciu službu
  5. Pripojíme smerovač k službe a nakonfigurujeme odosielanie všetkej prevádzky cez tunel.

Skutočné riešenie

Prípravné akcie

Na internete je množstvo služieb, ktoré poskytujú VPS za mimoriadne priaznivé ceny. Zatiaľ som našiel a využívam možnosť za 9 $/rok, ale aj keď sa príliš neobťažujete, na každom rohu je veľa možností za 1E/mesiac. Otázka výberu VPS ďaleko presahuje rámec tohto článku, takže ak niekto niečomu nerozumie, opýtajte sa v komentároch.

Ak používate VPS nielen na smerovaciu službu, ale aj na ukončenie tunela na nej, musíte tento tunel zvýšiť a takmer určite preň nakonfigurovať NAT. Návodov na tieto úkony je na internete veľké množstvo, nebudem ich tu opakovať. Hlavnou požiadavkou na takýto tunel je, že musí na vašom routeri vytvoriť samostatné rozhranie, ktoré podporuje tunel smerom k VPS. Väčšina používaných technológií VPN túto požiadavku spĺňa – perfektná je napríklad OpenVPN v režime tun.

Získanie kópie registra

Ako povedal Jabrail: "Ten, kto nám bráni, nám pomôže." Keďže RKN vytvára register zakázaných zdrojov, bolo by hriechom tento register nevyužiť na riešenie nášho problému. Z githubu dostaneme kópiu registra.

Ideme na váš server Linux, spadneme do koreňového kontextu (sudo su —) a nainštalujte git, ak ešte nie je nainštalovaný.

apt install git

Prejdite do svojho domovského adresára a vytiahnite kópiu registra.

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

Nastavili sme aktualizáciu cronu (robím to raz za 20 minút, ale môžete si vybrať ľubovoľný interval, ktorý vás zaujíma). Aby sme to dosiahli, spustíme crontab -e a pridajte k nemu nasledujúci riadok:

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

Pripojíme háčik, ktorý po aktualizácii registra vytvorí súbory pre smerovaciu službu. Ak to chcete urobiť, vytvorte súbor /root/zi/.git/hooks/post-merge s nasledujúcim obsahom:

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

a nezabudnite ho urobiť spustiteľným

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

Skript makebgp, na ktorý háčik odkazuje, vytvoríme o niečo neskôr.

Inštalácia a konfigurácia smerovacej služby

Nainštalujte vtáka. Verzia vtáka, ktorá je momentálne zverejnená v repozitároch Ubuntu, je, žiaľ, porovnateľná s čerstvosťou s výkalmi Archeopteryx, takže do systému musíme najprv pridať oficiálnu PPA vývojárov softvéru.

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

Potom okamžite deaktivujeme vták pre IPv6 - v tejto inštalácii ho nebudeme potrebovať.

systemctl stop bird6
systemctl disable bird6

Nižšie je uvedený minimalistický konfiguračný súbor služby Bird (/etc/bird/bird.conf), čo nám úplne stačí (a ešte raz pripomínam, že nikto nezakazuje rozvíjať a ladiť nápad podľa vlastných potrieb)

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;
}

router id - identifikátor smerovača, ktorý vizuálne vyzerá ako adresa IPv4, ale nie je ňou. V našom prípade to môže byť akékoľvek 32-bitové číslo vo formáte adresy IPv4, ale je vhodné uviesť presne IPv4 adresu vášho zariadenia (v tomto prípade VPS).

protokol priamo definuje, ktoré rozhrania budú pracovať s procesom smerovania. Príklad uvádza niekoľko príkladov mien, môžete pridať ďalšie. Linku môžete jednoducho vymazať, v tomto prípade bude server počúvať všetky dostupné rozhrania s IPv4 adresou.

protokol statický je naše kúzlo, ktoré načíta zoznamy prefixov a IP adries (čo sú v skutočnosti /32 prefixy, samozrejme) zo súborov pre následné oznámenie. Odkiaľ tieto zoznamy pochádzajú, bude popísané nižšie. Upozorňujeme, že načítanie adries IP je predvolene zakomentované, dôvodom je veľký objem nahrávania. Pre porovnanie, v čase písania tohto článku je v zozname prefixov 78 riadkov, v zozname IP adries 85898. Dôrazne odporúčam začať a ladiť iba na zozname prefixov a či povoliť alebo nepovoliť načítanie IP v budúcnosť je na vás, aby ste sa rozhodli po vyskúšaní vášho smerovača. Nie každý z nich dokáže bez problémov stráviť 85 tisíc záznamov v smerovacej tabuľke.

protokol bgp v skutočnosti nastavuje partnerstvo bgp s vaším smerovačom. IP adresa je adresa externého rozhrania smerovača (alebo adresa tunelového rozhrania na strane smerovača), 64998 a 64999 sú čísla autonómnych systémov. V tomto prípade môžu byť priradené vo forme ľubovoľných 16-bitových čísel, ale je dobrou praxou používať čísla AS zo súkromného rozsahu definovaného v RFC6996 - 64512-65534 vrátane (existuje formát pre 32-bitové ASN, ale v našom prípade je to určite prehnané). Opísaná konfigurácia využíva peering eBGP, v ktorom musia byť čísla autonómnych systémov smerovacej služby a smerovača odlišné.

Ako vidíte, služba potrebuje poznať IP adresu smerovača, takže ak máte dynamickú alebo nesmerovateľnú súkromnú (RFC1918) alebo zdieľanú (RFC6598) adresu, nemáte možnosť zvýšiť partnerský vzťah na externom rozhranie, ale služba bude stále fungovať vo vnútri tunela.

Je tiež celkom jasné, že z jednej služby môžete poskytnúť trasy k niekoľkým rôznym smerovačom - stačí pre ne duplikovať nastavenia skopírovaním časti protokolu bgp a zmenou adresy IP suseda. Preto príklad ukazuje nastavenia pre peering mimo tunela, ako najuniverzálnejšie. Je ľahké ich odstrániť do tunela príslušnou zmenou IP adries v nastaveniach.

Spracovanie registra pre službu smerovania

Teraz v skutočnosti potrebujeme vytvoriť zoznamy prefixov a IP adries, ktoré boli uvedené v statickom protokole v predchádzajúcej fáze. Aby sme to dosiahli, vezmeme súbor databázy Registry a vytvoríme z neho potrebné súbory pomocou nasledujúceho skriptu umiestneného v /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'

Nezabudnite ho urobiť spustiteľným

chmod +x /root/blacklist/makebgp

Teraz ho môžete spustiť manuálne a sledovať vzhľad súborov v /etc/bird.

S najväčšou pravdepodobnosťou pre vás bird momentálne nepracuje, pretože v predchádzajúcej fáze ste ho požiadali, aby vyhľadal súbory, ktoré ešte neexistujú. Preto ho spustíme a skontrolujeme, či sa spustil:

systemctl start bird
birdc show route

Výstup druhého príkazu by mal ukazovať asi 80 záznamov (toto je zatiaľ, ale keď to nastavíte, všetko bude závisieť od horlivosti RKN v blokovaní sietí) asi takto:

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

Tím

birdc show protocol

zobrazí stav protokolov v rámci služby. Kým nenakonfigurujete smerovač (pozri nasledujúci bod), protokol OurRouter bude v počiatočnom stave (fáza pripojenia alebo aktívneho pripojenia) a po úspešnom pripojení prejde do stavu zapnutia (fáza zavedená). Napríklad v mojom systéme výstup tohto príkazu vyzerá takto:

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

Pripojenie smerovača

Každý je pravdepodobne unavený z čítania tejto obrúsky, ale buďte opatrní - koniec sa blíži. Navyše v tejto časti nebudem môcť poskytnúť podrobné pokyny - pre každého výrobcu to bude iné.

Môžem vám však ukázať niekoľko príkladov. Hlavnou logikou je zvýšiť partnerský vzťah BGP a priradiť nexthop všetkým prijatým prefixom, ktoré ukazujú na náš tunel (ak potrebujeme posielať prenos cez rozhranie p2p) alebo na IP adresu nexthop, ak bude prenos smerovať na ethernet).

Napríklad na Mikrotiku v RouterOS je to vyriešené nasledovne

/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

a v Cisco IOS - takto

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

Ak sa rovnaký tunel používa na peering BGP aj na prenos užitočnej prevádzky, nie je potrebné nastavovať nexthop, ten sa nastaví správne pomocou protokolu. Ale ak to nastavíte manuálne, nezhorší to ani to.

Na iných platformách budete musieť konfiguráciu zistiť sami, ale ak máte nejaké problémy, napíšte do komentárov, pokúsim sa pomôcť.

Potom, čo sa vaša relácia BGP začala, trasy do veľkých sietí dorazili a nainštalovali sa do tabuľky, prevádzka prúdila na adresy z nich a šťastie je blízko, môžete sa vrátiť do služby Bird a pokúsiť sa odkomentovať tam položku, ktorá spája zoznam IP adries, spustite potom

systemctl reload bird

a uvidíte, ako váš router preniesol týchto 85 tisíc trás. Pripravte sa na odpojenie a premýšľajte, čo s tým :)

Celkom

Čisto teoreticky, po dokončení vyššie popísaných krokov, máte teraz službu, ktorá automaticky presmeruje prevádzku na IP adresy zakázané v Ruskej federácii mimo systém filtrovania.

Dá sa to, samozrejme, zlepšiť. Napríklad je celkom jednoduché zhrnúť zoznam IP adries pomocou riešení perl alebo python. Jednoduchý skript v jazyku Perl, ktorý to robí pomocou Net::CIDR::Lite, premení 85 tisíc prefixov na 60 (nie tisíc), ale, samozrejme, pokrýva oveľa väčší rozsah adries, než je blokovaný.

Keďže služba funguje na tretej úrovni modelu ISO/OSI, nezachráni vás pred zablokovaním stránky/stránky, ak sa prenesie na nesprávnu adresu zaznamenanú v registri. No spolu s registrom prichádza z githubu aj súbor nxdomain.txt, ktorý sa pár ťahmi skriptu ľahko zmení na zdroj adries napríklad pre plugin SwitchyOmega v Chrome.

Je tiež potrebné spomenúť, že riešenie si vyžaduje ďalšie dolaďovanie, ak nie ste len používateľom internetu, ale niektoré zdroje publikujete aj svojpomocne (na tomto pripojení beží napríklad webová stránka alebo poštový server). Pomocou prostriedkov smerovača je potrebné striktne viazať odchádzajúce prenosy z tejto služby na vašu verejnú adresu, inak stratíte konektivitu s tými zdrojmi, ktoré sú pokryté zoznamom prefixov prijatých smerovačom.

Ak máte nejaké otázky, pýtajte sa, som pripravený odpovedať.

UPD. Ďakujem navion и TerAnYu pre parametre pre git, ktoré umožňujú znížiť objemy sťahovania.

UPD2. Kolegovia, vyzerá to tak, že som sa pomýlil, keď som do článku nepridal návod na nastavenie tunela medzi VPS a routerom. Z toho vyplýva veľa otázok.
Pre každý prípad si ešte raz všimnem, že pred spustením tejto príručky ste už nakonfigurovali tunel VPN v smere, ktorý potrebujete, a skontrolovali ste jeho funkčnosť (napríklad tak, že ste tam predvolene alebo staticky otočili prevádzku). Ak ste túto fázu ešte nedokončili, nemá veľký zmysel postupovať podľa krokov v článku. Zatiaľ k tomu nemám vlastný text, ale ak zadáte do googlu „nastavenie servera OpenVPN“ spolu s názvom operačného systému nainštalovaného na VPS a „nastavenie klienta OpenVPN“ s názvom vášho smerovača , s najväčšou pravdepodobnosťou nájdete množstvo článkov na túto tému, vrátane Habrého.

UPD3. Neobetovaný Napísal som kód, ktorý zmení dump.csv na výsledný súbor pre vtáka s voliteľným zhrnutím IP adries. Preto môže byť časť „Spracovanie registra pre smerovaciu službu“ nahradená volaním jej programu. https://habr.com/post/354282/#comment_10782712

UPD4. Trochu práce s chybami (nepridal som ich do textu):
1) namiesto toho systemctl reload vták má zmysel použiť príkaz konfigurovať birdc.
2) v routeri Mikrotik namiesto zmeny nexthopu na IP druhej strany tunela /routing filter add action=accept chain=dynamic-in protocol=bgp comment=»Nastaviť ďalší skok» set-in-nexthop=172.30.1.1 má zmysel zadať cestu priamo k rozhraniu tunela, bez adresy /routing filter add action=accept chain=dynamic-in protocol=bgp comment=»Nastaviť ďalší skok» set-in-nexthop-direct=<názov rozhrania>

UPD5. Objavila sa nová služba https://antifilter.download, odkiaľ si môžete vyzdvihnúť hotové zoznamy IP adries. Aktualizované každú pol hodinu. Na strane klienta zostáva len zarámovať záznamy so zodpovedajúcou „trasou... odmietnutím“.
A v tomto bode pravdepodobne stačí otrhať babičku a aktualizovať článok.

UPD6. Upravená verzia článku pre tých, ktorí na to nechcú prísť, ale chcú začať - tu.

Zdroj: hab.com

Pridať komentár