Nastavení BGP pro obcházení blokování nebo „Jak jsem se přestal bát a zamiloval se do RKN“

Dobře, slovo „zamilovat se“ je přehnané. Spíše „mohl koexistovat s“.

Jak všichni víte, od 16. dubna 2018 Roskomnadzor blokuje přístup ke zdrojům v síti extrémně širokými tahy a přidává do Jednotného registru doménových jmen, ukazatele na stránky webů na internetu a síťové adresy, které vám umožňují identifikovat stránky na internetu, obsahující informace, jejichž šíření je v Ruské federaci zakázáno“ (v textu - pouze rejstřík) /10 někdy. V důsledku toho trpí občané Ruské federace a podniky, kteří ztratili přístup k absolutně legálním zdrojům, které potřebují.

Poté, co jsem v komentářích k jednomu z článků o Habré řekl, že jsem připraven pomoci obětem s nastavením obchvatu, kontaktovalo mě několik lidí s žádostí o takovou pomoc. Když jim vše fungovalo, jeden z nich doporučil techniku ​​popsat v článku. Po zamyšlení jsem se rozhodl prolomit mlčení na stránce a zkusit pro jednou napsat něco mezi projektem a příspěvkem na Facebooku, tzn. habrapost. Výsledek je před vámi.

Odmítnutí odpovědnosti

Vzhledem k tomu, že není příliš legální zveřejňovat způsoby, jak obejít blokování přístupu k informacím zakázaným na území Ruské federace, účelem tohoto článku bude mluvit o metodě, která vám umožní automatizovat přístup ke zdrojům, které jsou na území povoleny. Ruské federace, ale z důvodu něčího jednání nedostupné přímo přes vašeho poskytovatele. A přístup k dalším zdrojům získaným v důsledku činností z článku je nešťastným vedlejším účinkem a v žádném případě není účelem článku.

Jelikož jsem profesí, povoláním a životní cestou především síťový architekt, programování a Linux nejsou moje silné stránky. Proto lze samozřejmě lépe psát skripty, hlouběji propracovat bezpečnostní problémy ve VPS atd. Vaše návrhy budou přijaty s povděkem, pokud budou dostatečně podrobné - rád je doplním do textu článku.

TL, DR

Automatizujeme přístup ke zdrojům prostřednictvím vašeho stávajícího tunelu pomocí kopie registru a protokolu BGP. Cílem je odstranit veškerý provoz adresovaný blokovaným zdrojům do tunelu. Minimální vysvětlení, většinou pokyny krok za krokem.

Co k tomu potřebujete

Bohužel tento příspěvek není pro každého. Chcete-li použít tuto techniku, budete muset dát dohromady několik prvků:

  1. Musíte mít linuxový server někde mimo blokovací pole. Nebo alespoň touha spustit takový server - protože nyní stojí od 9 $ / rok a možná i méně. Metoda je také vhodná, pokud máte samostatný VPN tunel, pak může být server umístěn uvnitř pole bloku.
  2. Váš router musí být dostatečně chytrý, aby toho byl schopen
    • jakýkoli klient VPN, který se vám líbí (preferuji OpenVPN, ale může to být PPTP, L2TP, GRE+IPSec a jakákoli jiná možnost, která vytváří rozhraní tunelu);
    • protokol BGPv4. Což znamená, že pro SOHO to může být Mikrotik nebo jakýkoliv router s OpenWRT/LEDE/similar custom firmwarem, který vám umožní nainstalovat Quagga nebo Bird. Zakázáno není ani použití PC routeru. Pro podniky naleznete v dokumentaci k vašemu hraničnímu směrovači podporu BGP.
  3. Měli byste být obeznámeni s používáním Linuxu a síťovými technologiemi, včetně BGP. Nebo alespoň chtít získat ten nápad. Protože tentokrát nejsem připraven přijmout nezměrnost, budete si muset některé body, které jsou pro vás nepochopitelné, nastudovat sami. Na konkrétní otázky však samozřejmě odpovím v komentářích a je nepravděpodobné, že budu odpovídat pouze já, takže se klidně ptejte.

Co je použito v příkladu

  • Kopie rejstříku https://github.com/zapret-info/z-i 
  • VPS - Ubuntu 16.04
  • Směrovací služba - pták 1.6.3   
  • Router - Mikrotik hAP ac
  • Pracovní složky – jelikož pracujeme jako root, bude většina všeho umístěna v kořenové domovské složce. Respektive:
    • /root/blacklist - pracovní složka s kompilačním skriptem
    • /root/zi - kopie registru z githubu
    • /etc/bird - standardní složka nastavení služby bird
  • Přijímáme 194.165.22.146, ASN 64998 jako externí IP adresu VPS se směrovacím serverem a koncovým bodem tunelu; externí IP adresa routeru - 81.177.103.94, ASN 64999
  • IP adresy uvnitř tunelu jsou 172.30.1.1 a 172.30.1.2.

Nastavení BGP pro obcházení blokování nebo „Jak jsem se přestal bát a zamiloval se do RKN“

Samozřejmě můžete použít jakékoli jiné routery, operační systémy a softwarové produkty a upravit řešení tak, aby odpovídalo jejich logice.

Stručně - logika řešení

  1. Přípravné akce
    1. Získání VPS
    2. Zvedneme tunel z routeru do VPS
  2. Získání a pravidelná aktualizace kopie registru
  3. Instalace a konfigurace směrovací služby
  4. Vytvořte seznam statických tras pro službu směrování na základě registru
  5. Připojíme router ke službě a nastavíme posílání veškerého provozu tunelem.

Skutečné rozhodnutí

Přípravné akce

V rozlehlosti sítě existuje mnoho služeb, které poskytují VPS za extrémně rozumné peníze. Zatím jsem našel a používám variantu 9 $/rok, ale i když se opravdu neobtěžujete, na každém rohu je spousta možností za 1E/měsíc. Otázka výběru VPS leží daleko za rozsahem tohoto článku, takže pokud v tom není někomu něco jasné, zeptejte se v komentářích.

Pokud používáte VPS nejen pro routovací službu, ale i pro ukončení tunelu na ní, musíte tento tunel zvednout a téměř jednoznačně pro něj nakonfigurovat NAT. Návodů na tyto úkony je na síti velké množství, nebudu je zde opakovat. Hlavním požadavkem na takový tunel je, že musí na vašem routeru vytvořit samostatné rozhraní, které podporuje tunel směrem k VPS. Většina používaných technologií VPN tento požadavek splňuje – například OpenVPN v režimu tun je v pořádku.

Získejte kopii registru

Jak řekl Jabrayil: "Kdo nám brání, pomůže nám." Vzhledem k tomu, že RKN vytváří registr zakázaných zdrojů, bylo by hříchem tento registr nevyužít k vyřešení našeho problému. Obdržíme kopii registru z githubu.

Jdeme na váš linuxový server, spadáme do kontextu root'a (sudo su-) a nainstalujte git, pokud ještě není nainstalován.

apt install git

Přejděte do svého domovského adresáře a vytáhněte kopii registru.

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

Nastavte si aktualizaci cronu (mám ji každých 20 minut, ale můžete si vybrat libovolný interval, který vás zajímá). K tomu běžíme crontab -e a přidejte k němu následující řádek:

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

Připojíme háček, který po aktualizaci registru vytvoří soubory pro směrovací službu. K tomu vytvoříme soubor /root/zi/.git/hooks/post-merge s následujícím obsahem:

#!/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 nezapomeňte jej nastavit jako spustitelný

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

Skript makebgp, na který odkazuje háček, bude vytvořen později.

Instalace a konfigurace směrovací služby

Nainstalujte ptáka. Bohužel verze bird aktuálně vydaná v repozitářích Ubuntu je srovnatelná co do čerstvosti s výkaly Archeopteryx, takže musíme do systému nejprve přidat oficiální PPA vývojářů softwaru.

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

Poté bird pro IPv6 okamžitě zakážeme - v této instalaci jej nebudeme potřebovat.

systemctl stop bird6
systemctl disable bird6

Níže je uveden minimalistický konfigurační soubor pro službu Bird (/etc/bird/bird.conf), což nám bohatě stačí (a ještě jednou připomínám, že nikdo nezakazuje vyvíjet a ladit nápad podle vlastních potřeb)

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 routeru, který vizuálně vypadá jako adresa IPv4, ale není. V našem případě to může být libovolné 32bitové číslo ve formátu adresy IPv4, ale je dobrým zvykem uvést tam adresu IPv4 vašeho zařízení (v tomto případě VPS).

protokol přímý určuje, která rozhraní budou pracovat s procesem směrování. Příklad uvádí několik příkladů jmen, můžete přidat další. Můžete také jednoduše smazat linku, v takovém případě bude server naslouchat na všech dostupných rozhraních s IPv4 adresou.

protocol static je naše kouzlo, které načítá seznamy prefixů a IP adres (což jsou samozřejmě prefixy /32) ze souborů pro pozdější oznámení. Odkud tyto seznamy pocházejí, bude diskutováno níže. Upozorňujeme, že načítání IP adres je ve výchozím nastavení zakomentováno, důvodem je velké množství nahrávání. Pro srovnání, v době psaní článku je v seznamu prefixů 78 řádků, v seznamu IP adres 85898. Důrazně doporučuji začít a ladit pouze na seznamu prefixů a rozhodnout se, zda abyste povolili načítání IP v budoucnu po experimentování s vaším routerem. Ne každý z nich snadno stráví 85 tisíc záznamů ve směrovací tabulce.

protokol bgp ve skutečnosti nastavuje bgp peering s vaším routerem. ip-address je adresa externího rozhraní routeru (nebo adresa tunelového rozhraní ze strany routeru), 64998 a 64999 jsou čísla autonomních systémů. V tomto případě je lze přiřadit ve formě libovolných 16bitových čísel, ale je dobrou praxí používat čísla AS z privátního rozsahu definovaného RFC6996 - 64512-65534 včetně (existuje 32bitový formát ASN, ale v našem případě je to rozhodně přehnané). Popsaná konfigurace využívá peering eBGP, ve kterém se autonomní systémová čísla směrovací služby a směrovače musí lišit.

Jak vidíte, služba potřebuje znát IP adresu routeru, takže pokud máte dynamickou nebo nesměrovatelnou soukromou (RFC1918) nebo sdílenou (RFC6598) adresu, nemáte možnost zvýšit peering na externím rozhraní, ale služba bude stále fungovat uvnitř tunelu.

Zcela transparentní je také to, že můžete poskytnout více různým routerům trasy z jedné služby – stačí pro ně duplikovat nastavení zkopírováním části protokolu bgp se změnou sousedovy IP adresy. Proto příklad ukazuje nastavení pro peering mimo tunel, jako nejuniverzálnější. Není těžké je odstranit do tunelu odpovídající změnou IP adres v nastavení.

Zpracování registru pro směrovací službu

Nyní ve skutečnosti potřebujeme vytvořit seznamy prefixů a IP adres, které jsou zmíněny v předchozím kroku protokolu static. Za tímto účelem vezmeme soubor registru a vytvoříme z něj soubory, které potřebujeme, pomocí následujícího skriptu umístěné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'

Nezapomeňte jej nastavit jako spustitelný

chmod +x /root/blacklist/makebgp

Nyní jej můžete spustit ručně a sledovat vzhled souborů v /etc/bird.

S největší pravděpodobností pro vás v tuto chvíli pták nefunguje, protože v předchozí fázi jste navrhli, aby hledal soubory, které ještě neexistují. Proto jej spustíme a kontrolujeme, zda se spustí:

systemctl start bird
birdc show route

Výstup druhého příkazu by měl ukazovat asi 80 položek (to je v tuto chvíli a když to nastavíte, vše bude záviset na horlivosti ILV v blokování sítí) takto:

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

Tým

birdc show protocol

zobrazí stav protokolů v rámci služby. Dokud router nenakonfigurujete (viz další odstavec), bude protokol OurRouter ve spouštěcím stavu (fáze Connect nebo Active) a po úspěšném připojení přejde do stavu up (Established phase). Například v mém systému vypadá výstup tohoto příkazu 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

Připojení routeru

Každého už asi nebaví číst tuto podložku, ale buďte opatrní - konec se blíží. Navíc v této části nebudu moci dávat pokyny krok za krokem - u každého výrobce to bude jiné.

Mohu vám však ukázat několik příkladů. Hlavní logikou je zvýšit partnerský vztah BGP a připojit nexthop ke všem přijatým prefixům, ukazující na náš tunel (pokud potřebujete provozovat výstup přes rozhraní p2p) nebo nexthop ip-adresu, pokud provoz jde do ethernetu).

Například na Mikrotiku v RouterOS je to řešeno následovně

/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 - takhle

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

V případě, že je stejný tunel použit jak pro BGP peering, tak pro přenos užitečného provozu, není nutné nexthop nastavovat, ten se nastaví správně pomocí protokolu. Pokud si to ale nastavíte ručně, horší to také nebude.

Na jiných platformách budete muset konfiguraci zjistit sami, ale pokud máte nějaké potíže, napište do komentářů, pokusím se pomoci.

Poté, co vaše relace BGP stoupne, dorazí cesty do velkých sítí a nainstalují se do tabulky, provoz na adresy z nich odejde a štěstí je blízko, můžete se vrátit do ptačí služby a pokusit se odkomentovat tam položku, která spojuje seznam IP adres, spusťte poté

systemctl reload bird

a podívejte se, jak váš router přenesl těchto 85 tisíc tras. Připravte se to vypnout a popřemýšlet, co s tím 🙂

Celkem

Čistě teoreticky po provedení výše uvedených kroků máte službu, která automaticky přesměrovává provoz na IP adresy zakázané v Ruské federaci mimo systém filtrování.

Dá se to samozřejmě vylepšit. Je například snadné shrnout seznam IP adres pomocí řešení perl nebo python. Jednoduchý skript v perlu, který to dělá s Net::CIDR::Lite, promění 85 tisíc prefixů na 60 (ne tisíc), ale přirozeně pokrývá mnohem větší rozsah adres, než je blokováno.

Vzhledem k tomu, že služba funguje na třetí úrovni modelu ISO / OSI, nezachrání vás před blokováním stránek / stránek, pokud se nepřeloží na adresu, která je zaznamenána v registru. Spolu s registrem od githubu ale přichází soubor nxdomain.txt, který se pár tahy skriptu snadno promění ve zdroj adres například pro plugin SwitchyOmega v Chrome.

Je třeba také zmínit, že řešení vyžaduje další zpřesnění, pokud nejste pouze uživatelem internetu, ale také publikujete nějaké zdroje od sebe (na tomto připojení běží například web nebo poštovní server). Pomocí routeru musíte pevně svázat odchozí provoz z této služby na vaši veřejnou adresu, jinak ztratíte konektivitu s těmi prostředky, které jsou pokryty seznamem prefixů přijatých routerem.

Pokud máte nějaké dotazy - ptejte se, připraveni odpovědět.

UPD. Děkuji navion и TerAnYu pro možnosti git pro snížení objemu stahování.

UPD2. Kolegové, zdá se, že jsem udělal chybu, když jsem do článku nepřidal návod na nastavení tunelu mezi VPS a routerem. To je způsobeno mnoha otázkami.
Jen pro případ, znovu podotýkám - předpokládá se, že před zahájením kroků v této příručce jste již nakonfigurovali tunel VPN ve směru, který potřebujete, a zkontrolovali jeho výkon (například tam zabalit provoz ve výchozím nastavení nebo statický). Pokud jste tuto fázi ještě neabsolvovali, nemá vlastně smysl postupovat podle kroků z článku. Zatím k tomu nemám vlastní text, ale pokud zadáte do googlu „Nastavení serveru OpenVPN“ spolu s názvem operačního systému nainstalovaného na VPS a „Nastavení klienta OpenVPN“ s názvem vašeho routeru, s největší pravděpodobností najdete řadu článků na toto téma, včetně článků o Habrém.

UPD3. Neobětovaný napsal kód, který vytvoří výsledný soubor pro ptáka z dump.csv s volitelným sečtením IP adres. Sekci "Zpracování registru pro směrovací službu" lze tedy nahradit voláním jejího programu. https://habr.com/post/354282/#comment_10782712

UPD4. Trochu práce s chybami (nepřispěly do textu):
1) místo toho systemctl reload pták má smysl použít příkaz konfigurace birdc.
2) v routeru Mikrotik, místo změny dalšího skoku na IP druhé strany tunelu /routing filter add action=accept chain=dynamic-in protocol=bgp comment="Set nexthop" set-in-nexthop=172.30.1.1 má smysl zadat cestu přímo k rozhraní tunelu, bez adresy /routing filter add action=accept chain=dynamic-in protocol=bgp comment="Set nexthop" set-in-nexthop-direct=<název rozhraní>

UPD5. Přišla nová služba https://antifilter.download, odkud si můžete vzít hotové seznamy ip-adres. Aktualizováno každou půl hodinu. Na straně klienta zbývá pouze orámovat položky odpovídajícím „route ... zamítnutím“.
A to asi stačí k tomu, abych babičku setřásl a článek aktualizoval.

UPD6. Upravená verze článku pro ty, kteří nechtějí rozumět, ale chtějí začít - zde.

Zdroj: www.habr.com

Přidat komentář