Postavljanje BGP-a za zaobilaženje blokiranja ili "Kako sam se prestao bojati i zaljubio se u RKN"

Pa, dobro, ono o "zaljubio" je pretjerivanje. Prije bi "mogao koegzistirati s".

Kao što svi znate, od 16. travnja 2018. Roskomnadzor blokira pristup resursima na mreži iznimno širokim potezima, dodajući u Jedinstveni registar naziva domena, pokazivače na stranice web-mjesta na Internetu i mrežne adrese koje vam omogućuju da identificirati stranice na internetu koje sadrže informacije čije je širenje zabranjeno u Ruskoj Federaciji” (u tekstu - samo registar) /10 ponekad. Kao rezultat toga, građani Ruske Federacije i poduzeća trpe, jer su izgubili pristup apsolutno legalnim resursima koji su im potrebni.

Nakon što sam u komentarima na jedan od članaka na Habréu rekao da sam spreman pomoći žrtvama s postavljanjem zaobilaznice, nekoliko ljudi me kontaktiralo tražeći takvu pomoć. Kad im je sve pošlo za rukom, jedan od njih preporučio je opis tehnike u članku. Kad sam razmislio, odlučio sam prekinuti šutnju na stranici i pokušati barem jednom napisati nešto srednje između projekta i objave na Facebooku, tj. habrapost. Rezultat je pred vama.

Izjava o odricanju od odgovornosti

Budući da nije baš legalno objavljivati ​​načine zaobilaženja blokiranja pristupa informacijama zabranjenim na teritoriju Ruske Federacije, svrha ovog članka bit će govoriti o metodi koja vam omogućuje automatiziranje pristupa resursima koji su dopušteni na teritoriju Ruske Federacije, ali zbog nečijih radnji nedostupan izravno preko vašeg providera. A pristup drugim resursima, dobiven kao rezultat radnji iz članka, je nesretna nuspojava i nikako nije svrha članka.

Također, budući da sam po struci, vokaciji i životnom putu primarno mrežni arhitekt, programiranje i Linux mi nisu jače strane. Stoga se, naravno, skripte mogu bolje napisati, sigurnosni problemi u VPS-u mogu se dublje razraditi, itd. Vaši prijedlozi će biti prihvaćeni sa zahvalnošću, ako su dovoljno detaljni - rado ću ih dodati u tekst članka.

TL; DR

Automatiziramo pristup resursima kroz vaš postojeći tunel koristeći kopiju registra i BGP protokol. Cilj je ukloniti sav promet upućen blokiranim resursima u tunel. Minimum objašnjenja, uglavnom upute korak po korak.

Što vam je potrebno za ovo

Nažalost, ovaj post nije za svakoga. Da biste koristili ovu tehniku, morat ćete sastaviti nekoliko elemenata:

  1. Morate imati linux poslužitelj negdje izvan polja za blokiranje. Ili barem želju za pokretanjem takvog poslužitelja - budući da sada košta od 9 dolara godišnje, a možda i manje. Metoda je također prikladna ako imate zaseban VPN tunel, tada se poslužitelj može nalaziti unutar blok polja.
  2. Vaš usmjerivač mora biti dovoljno pametan da bi to mogao
    • bilo koji VPN klijent koji želite (preferiram OpenVPN, ali može biti PPTP, L2TP, GRE+IPSec i bilo koja druga opcija koja stvara sučelje tunela);
    • BGPv4 protokol. Što znači da za SOHO to može biti Mikrotik ili bilo koji router s OpenWRT/LEDE/sličnim custom firmwareom koji omogućuje instalaciju Quagge ili Birda. Korištenje PC rutera također nije zabranjeno. Za poduzeće, pogledajte dokumentaciju za svoj granični usmjerivač za BGP podršku.
  3. Trebali biste biti upoznati s korištenjem Linuxa i mrežnim tehnologijama, uključujući BGP. Ili barem želite dobiti tu ideju. Budući da ovaj put nisam spreman prihvatiti neizmjernost, morat ćete sami proučiti neke točke koje su vam nerazumljive. No, za konkretna pitanja ću, naravno, odgovoriti u komentarima i teško da ću biti jedini koji odgovara, pa slobodno pitajte.

Što se koristi u primjeru

  • Kopija upisnika https://github.com/zapret-info/z-i 
  • VPS - Ubuntu 16.04
  • Usluga usmjeravanja - ptica 1.6.3   
  • Usmjerivač - Mikrotik hAP ak
  • Radne mape - budući da radimo kao root, većina svega bit će smještena u početnu root mapu. Odnosno:
    • /root/blacklist - radna mapa sa skriptom kompilacije
    • /root/zi - kopija registra iz githuba
    • /etc/bird - standardna mapa postavki usluge ptica
  • Prihvaćamo 194.165.22.146, ASN 64998 kao vanjsku IP adresu VPS-a s poslužiteljem za usmjeravanje i točkom završetka tunela; vanjska IP adresa usmjerivača - 81.177.103.94, ASN 64999
  • IP adrese unutar tunela su 172.30.1.1 odnosno 172.30.1.2.

Postavljanje BGP-a za zaobilaženje blokiranja ili "Kako sam se prestao bojati i zaljubio se u RKN"

Naravno, možete koristiti bilo koje druge usmjerivače, operativne sustave i softverske proizvode, prilagođavajući rješenje tako da odgovara njihovoj logici.

Ukratko – logika rješenja

  1. Pripremne aktivnosti
    1. Dobivanje VPS-a
    2. Podižemo tunel od routera do VPS-a
  2. Dobivanje i redovito ažuriranje kopije matične knjige
  3. Instalacija i konfiguracija usluge usmjeravanja
  4. Napravite popis statičkih ruta za uslugu usmjeravanja na temelju registra
  5. Usmjerivač povezujemo s uslugom i postavljamo slanje cjelokupnog prometa kroz tunel.

Prava odluka

Pripremne aktivnosti

U prostranstvu mreže postoje mnoge usluge koje pružaju VPS za vrlo razuman novac. Do sada sam pronašao i koristio opciju za 9 USD godišnje, ali čak i ako se ne trudite, na svakom uglu ima puno opcija za 1 E mjesečno. Pitanje odabira VPS-a daleko je izvan okvira ovog članka, pa ako nekome nešto nije jasno o tome, pitajte u komentarima.

Ako koristite VPS ne samo za uslugu usmjeravanja, već i za završetak tunela na njemu, morate podignuti ovaj tunel i, gotovo nedvosmisleno, konfigurirati NAT za njega. Na mreži postoji veliki broj uputa za ove radnje, neću ih ovdje ponavljati. Glavni zahtjev za takav tunel je da mora stvoriti zasebno sučelje na vašem usmjerivaču koje podržava tunel prema VPS-u. Većina VPN tehnologija koje se koriste ispunjava ovaj zahtjev - na primjer, OpenVPN u tun modu je u redu.

Dobijte kopiju registra

Kao što je Džebrail rekao: "Onaj ko nas koči pomoći će nam." Budući da RKN stvara registar zabranjenih resursa, bio bi grijeh ne iskoristiti ovaj registar za rješavanje našeg problema. Dobit ćemo kopiju registra od githuba.

Idemo na vaš Linux poslužitelj, upadamo u kontekst root'a (sudo su-) i instalirajte git ako već nije instaliran.

apt install git

Idite u svoj matični imenik i izvadite kopiju registra.

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

Postavite ažuriranje crona (imam ga svakih 20 minuta, ali možete odabrati bilo koji interval koji vas zanima). Da bismo to učinili, trčimo crontab -e i dodajte mu sljedeći redak:

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

Povezujemo kuku koja će stvoriti datoteke za uslugu usmjeravanja nakon ažuriranja registra. Za to stvaramo datoteku /root/zi/.git/hooks/post-merge sa sljedećim sadržajem:

#!/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 ne zaboravite ga učiniti izvršnim

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

Makebgp skripta na koju se poziva kuka bit će kreirana kasnije.

Instalacija i konfiguracija usluge usmjeravanja

Instalirajte pticu. Nažalost, trenutno objavljena verzija ptice u repozitoriju Ubuntua usporediva je svježinom s izmetom Archeopteryxa, tako da moramo prvo dodati službeni PPA programera softvera u sustav.

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

Nakon toga odmah onemogućujemo pticu za IPv6 - u ovoj nam instalaciji neće trebati.

systemctl stop bird6
systemctl disable bird6

Ispod je minimalistička konfiguracijska datoteka za uslugu ptica (/etc/bird/bird.conf), što je nama sasvim dovoljno (i još jednom vas podsjećam da nitko ne brani razvijati i dotjerivati ​​ideju prema vlastitim potrebama)

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 - identifikator routera, vizualno izgleda kao IPv4 adresa, ali nije. U našem slučaju to može biti bilo koji 32-bitni broj u formatu IPv4 adrese, ali dobra je praksa tamo navesti IPv4 adresu svog uređaja (u ovom slučaju VPS).

protocol direct određuje koja će sučelja raditi s procesom usmjeravanja. Primjer daje nekoliko primjera imena, možete dodati još. Također možete jednostavno izbrisati liniju, u kojem će slučaju poslužitelj slušati sva dostupna sučelja s IPv4 adresom.

protocol static je naša magija koja učitava popise prefiksa i ip adresa (koje su, naravno, /32 prefiksi) iz datoteka za kasniju objavu. Odakle potječu ove liste bit će riječi u nastavku. Imajte na umu da je učitavanje ip adresa zakomentirano prema zadanim postavkama, razlog za to je velika količina učitavanja. Usporedbe radi, u vrijeme pisanja članka na popisu prefiksa nalazi se 78 redaka, a na popisu ip adresa 85898. Toplo preporučujem da počnete i otklanjate pogreške samo na popisu prefiksa i odlučite hoćete li ili ne kako biste omogućili učitavanje IP-a u budućnosti nakon eksperimentiranja s vašim usmjerivačem. Ne može svaki od njih lako probaviti 85 tisuća unosa u tablici usmjeravanja.

protokol bgp zapravo postavlja bgp peering s vašim usmjerivačem. ip-adresa je adresa vanjskog sučelja rutera (ili adresa sučelja tunela sa strane rutera), 64998 i 64999 su brojevi autonomnih sustava. U ovom slučaju, oni se mogu dodijeliti u obliku bilo kojeg 16-bitnog broja, ali dobra je praksa koristiti AS brojeve iz privatnog raspona definiranog RFC6996 - uključujući 64512-65534 (postoji 32-bitni ASN format, ali u našem slučaju ovo je definitivno pretjerano). Opisana konfiguracija koristi eBGP peering, u kojem se brojevi autonomnog sustava usluge usmjeravanja i usmjerivača moraju razlikovati.

Kao što možete vidjeti, usluga mora znati IP adresu usmjerivača, tako da ako imate dinamičku ili neusmjerivačku privatnu (RFC1918) ili zajedničku (RFC6598) adresu, nemate mogućnost podizanja peeringa na vanjskom sučelju, ali usluga će i dalje raditi unutar tunela.

Također je prilično transparentno da možete pružiti nekoliko različitih usmjerivača s rutama iz jedne usluge - samo duplicirajte postavke za njih kopiranjem odjeljka protokola bgp uz promjenu susjedove IP adrese. Zato su u primjeru prikazane postavke za virenje izvan tunela, kao najuniverzalnije. Nije ih teško ukloniti u tunel odgovarajućom promjenom IP adresa u postavkama.

Obrada registra za uslugu usmjeravanja

Sada zapravo trebamo stvoriti popise prefiksa i ip-adresa, koje su spomenute u prethodnom koraku u statici protokola. Da bismo to učinili, uzmemo datoteku registra i napravimo datoteke koje su nam potrebne pomoću sljedeće skripte koja se nalazi u /root/crna lista/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 zaboravite ga učiniti izvršnim

chmod +x /root/blacklist/makebgp

Sada ga možete pokrenuti ručno i promatrati izgled datoteka u /etc/bird.

Najvjerojatnije, u ovom trenutku ptica ne radi za vas, jer ste u prethodnoj fazi predložili da traži datoteke koje još ne postoje. Stoga ga pokrećemo i kontroliramo da se pokrene:

systemctl start bird
birdc show route

Izlaz druge naredbe trebao bi prikazati oko 80 unosa (to je trenutno, a kada to postavite, sve će ovisiti o revnosti ILV-a u blokiranju mreža) ovako:

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

Momčad

birdc show protocol

pokazat će status protokola unutar usluge. Dok ne konfigurirate usmjerivač (vidi sljedeći odlomak), protokol OurRouter bit će u početnom stanju (Poveži se ili Aktivne faze), a nakon uspješne veze prijeći će u gore stanje (Uspostavljena faza). Na primjer, na mom sustavu izlaz ove naredbe izgleda ovako:

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

Povezivanje usmjerivača

Vjerojatno su svi već umorni od čitanja ove krpice, ali ohrabrite se - kraj je blizu. Štoviše, u ovom odjeljku neću moći dati upute korak po korak - to će biti drugačije za svakog proizvođača.

Međutim, mogu vam pokazati nekoliko primjera. Glavna logika je podići BGP peering i pridružiti nexthop svim primljenim prefiksima, pokazujući na naš tunel (ako trebate izlazni promet kroz p2p sučelje) ili nexthop ip-adresu ako promet ide na ethernet).

Na primjer, na Mikrotiku u RouterOS-u to je riješeno na sljedeći način

/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 u Cisco IOS-u - ovako

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

U slučaju da se isti tunel koristi i za BGP peering i za prijenos korisnog prometa, nije potrebno postaviti nexthop, on će biti ispravno postavljen pomoću protokola. Ali ako to postavite ručno, neće biti ništa gore.

Na drugim platformama morat ćete sami shvatiti konfiguraciju, ali ako imate poteškoća, napišite u komentarima, pokušat ću vam pomoći.

Nakon što se vaša BGP sesija podigne, rute do velikih mreža stignu i instalirane su u tablici, promet prema adresama s njih je otišao i sreća je blizu, možete se vratiti na uslugu ptica i pokušati odkomentirati tamošnji unos koji povezuje popis IP adresa, izvršite nakon toga

systemctl reload bird

i pogledajte kako je vaš ruter prenio ovih 85 tisuća ruta. Pripremite se da ga isključite i razmislite što ćete s njim 🙂

Ukupno

Čisto teoretski, nakon izvođenja gore navedenih koraka, imate uslugu koja automatski preusmjerava promet na IP adrese zabranjene u Ruskoj Federaciji mimo sustava filtriranja.

Može se, naravno, poboljšati. Na primjer, dovoljno je jednostavno sažeti popis IP adresa putem perl ili python rješenja. Jednostavna perl skripta koja to radi s Net::CIDR::Liteom pretvara 85 tisuća prefiksa u 60 (ne tisuću), ali prirodno pokriva puno veći raspon adresa nego što je blokiran.

Budući da usluga radi na trećoj razini ISO/OSI modela, neće vas spasiti od blokiranja stranice/stranice ako se ne riješi na adresu koja je zapisana u registru. No uz registar s githuba stiže i datoteka nxdomain.txt koja se uz nekoliko poteza skripte lako pretvara u izvor adresa za npr. SwitchyOmega plugin u Chromeu.

Također treba spomenuti da rješenje zahtijeva dodatno izoštravanje ako niste samo korisnik interneta, već i sami objavljujete neke resurse (na primjer, web stranica ili poslužitelj pošte radi na ovoj vezi). Putem usmjerivača morate čvrsto vezati odlazni promet s ove usluge na svoju javnu adresu, inače ćete izgubiti vezu s onim resursima koji su pokriveni popisom prefiksa koje prima usmjerivač.

Ako imate bilo kakvih pitanja - pitajte, spremni odgovoriti.

UPD. Hvala vam navion и TerAnYu za opcije za git za smanjenje količine preuzimanja.

UPD2. Kolege, izgleda da sam pogriješio što nisam u članak dodao upute za postavljanje tunela između VPS-a i routera. Zbog toga se postavljaju mnoga pitanja.
Za svaki slučaj, ponovno napominjem - pretpostavlja se da ste prije pokretanja koraka u ovom vodiču već konfigurirali VPN tunel u smjeru koji vam je potreban i provjerili njegovu izvedbu (na primjer, omatanje prometa tamo prema zadanim postavkama ili statično). Ako još niste završili ovu fazu, nema smisla slijediti korake iz članka. Još nemam vlastiti tekst o ovome, ali ako guglate “OpenVPN server setup” zajedno s nazivom operativnog sustava instaliranog na VPS-u i “OpenVPN client setup” s nazivom vašeg usmjerivača, najvjerojatnije pronaći ćete brojne članke o ovoj temi, uključujući i na Habréu.

UPD3. Nežrtvovan napisao je kôd koji iz dump.csv pravi rezultirajuću datoteku za pticu s opcijskim zbrajanjem ip adresa. Stoga se odjeljak "Obrada registra za uslugu usmjeravanja" može zamijeniti pozivom njegovog programa. https://habr.com/post/354282/#comment_10782712

UPD4. Malo rada na pogreškama (nije doprinio u tekstu):
1) umjesto toga systemctl ponovno učitavanje ptica ima smisla koristiti naredbu birdc konfiguracija.
2) u Mikrotik routeru, umjesto promjene sljedećeg skoka u IP druge strane tunela /routing filter add action=accept chain=dynamic-in protocol=bgp comment="Set nexthop" set-in-nexthop=172.30.1.1 ima smisla navesti rutu izravno do sučelja tunela, bez adrese /routing filter add action=accept chain=dynamic-in protocol=bgp comment="Set nexthop" set-in-nexthop-direct=<naziv sučelja>

UPD5. Stigla je nova usluga https://antifilter.download, odakle možete uzeti gotove popise ip-adresa. Ažurira se svakih pola sata. Na strani klijenta, sve što preostaje je uokviriti unose s odgovarajućom "rutom ... odbiti".
I to je vjerojatno dovoljno da se pojebem s bakom i ažuriram članak.

UPD6. Revidirana verzija članka za one koji ne žele razumjeti, ali žele započeti - здесь.

Izvor: www.habr.com

Dodajte komentar