Postavljanje BGP-a da zaobiđe blokiranje, ili "Kako sam se prestao bojati i zaljubio se u RKN"

Pa, dobro, o "voljenim" je preterivanje. Umjesto toga, „bio je u stanju koegzistirati sa“.

Kao što svi znate, Roskomnadzor je od 16. aprila 2018. blokirao pristup resursima na Internetu u izuzetno širokim potezima, dodajući u „Jedinstveni registar imena domena, indeksa stranica stranica na Internetu i mrežnih adresa koji omogućavaju identifikaciju lokacija na Internetu”, koji sadrži informacije čija je distribucija zabranjena u Ruskoj Federaciji” (u tekstu - samo registar) od /10 ponekad. Kao rezultat toga, trpe građani Ruske Federacije i preduzeća, jer su izgubili pristup potpuno 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 oko postavljanja zaobilaznice, došlo mi je nekoliko ljudi tražeći takvu pomoć. Kada im je sve pošlo za rukom, jedan od njih je preporučio da opiše tehniku ​​u članku. Nakon malo razmišljanja, odlučio sam prekinuti šutnju na stranici i pokušati već jednom napisati nešto srednje između projekta i objave na Facebooku, tj. habrapost. Rezultat je pred vama.

odricanje

Budući da nije baš legalno objavljivati ​​načine za zaobilaženje blokiranja pristupa informacijama zabranjenim na teritoriji Ruske Federacije, svrha ovog članka bit će govoriti o metodi koja vam omogućava da automatizirate pristup resursima koji su dozvoljeni na teritoriji Ruske Federacije. teritorije Ruske Federacije, ali zbog tuđih radnji nisu direktno dostupni preko vašeg provajdera. A pristup drugim resursima dobijenim kao rezultat radnji iz članka je nesretna nuspojava i ni na koji način nije svrha članka.

Također, kako sam prvenstveno mrežni arhitekt po struci, vokaciji i životnom putu, programiranje i Linux mi nisu jača strana. Stoga, naravno, skripte se mogu bolje napisati, sigurnosna pitanja u VPS-u mogu se dublje razraditi, itd. Vaši prijedlozi će biti prihvaćeni sa zahvalnošću, ako budu 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 protokola. Cilj je da se sav promet upućen blokiranim resursima ukloni u tunel. Minimum objašnjenja, uglavnom uputstva korak po korak.

Šta ti treba za ovo?

Nažalost, ova objava nije za svakoga. Da biste koristili ovu tehniku, morat ćete spojiti nekoliko elemenata:

  1. Morate imati linux server negdje izvan polja za blokiranje. Ili barem želja da imate takav server - na sreću on sada košta od 9 dolara godišnje, a moguće i manje. Metoda je također prikladna ako imate poseban VPN tunel, tada se server može nalaziti unutar polja za blokiranje.
  2. Vaš ruter bi trebao biti dovoljno pametan da može
    • bilo koji VPN klijent koji vam se sviđa (ja preferiram OpenVPN, ali to može biti PPTP, L2TP, GRE+IPSec ili bilo koja druga opcija koja kreira tunelski interfejs);
    • BGPv4 protokol. Što znači da za SOHO to može biti Mikrotik ili bilo koji ruter sa OpenWRT/LEDE/sličnim prilagođenim firmverom koji vam omogućava da instalirate Quagga ili Bird. Takođe nije zabranjeno korišćenje PC rutera. U slučaju preduzeća, potražite BGP podršku u dokumentaciji za vaš granični ruter.
  3. Trebali biste razumjeti korištenje Linuxa i mrežne tehnologije, uključujući BGP protokol. Ili barem želite dobiti takvu ideju. Budući da ovaj put nisam spreman prihvatiti neizmjernost, morat ćete sami proučiti neke aspekte koji su vam nerazumljivi. Međutim, ja ću, naravno, odgovarati na konkretna pitanja u komentarima i malo je vjerovatno da ću ja biti jedini koji će odgovoriti, pa nemojte se ustručavati pitati.

Što se koristi u primjeru

  • Kopija registra - od https://github.com/zapret-info/z-i 
  • VPS - Ubuntu 16.04
  • Usluga rutiranja - ptica 1.6.3   
  • ruter - Mikrotik hAP ak
  • Radni folderi - pošto radimo kao root, većina svega će se nalaziti u root folderu. odnosno:
    • /root/blacklist - radni folder sa skriptom za kompilaciju
    • /root/zi - kopija registra sa github-a
    • /etc/bird - standardni folder za postavke bird servisa
  • Eksterna IP adresa VPS-a sa serverom za rutiranje i završnom tačkom tunela je 194.165.22.146, ASN 64998; eksterna IP adresa rutera - 81.177.103.94, ASN 64999
  • IP adrese unutar tunela su 172.30.1.1 i 172.30.1.2, respektivno.

Postavljanje BGP-a da zaobiđe blokiranje, ili "Kako sam se prestao bojati i zaljubio se u RKN"

Naravno, možete koristiti bilo koje druge rutere, operativne sisteme i softverske proizvode, prilagođavajući rješenje njihovoj logici.

Ukratko - logika rješenja

  1. Pripremne radnje
    1. Dobivanje VPS-a
    2. Podizanje tunela od rutera do VPS-a
  2. Primamo i redovno ažuriramo kopiju registra
  3. Instalacija i konfiguracija usluge rutiranja
  4. Kreiramo listu statičkih ruta za uslugu rutiranja na osnovu registra
  5. Povezujemo ruter sa servisom i konfigurišemo slanje celokupnog saobraćaja kroz tunel.

Stvarno rješenje

Pripremne radnje

Na internetu postoji mnogo usluga koje pružaju VPS po izuzetno povoljnim cijenama. Do sada sam pronašao i koristim opciju za 9 USD godišnje, ali čak i ako se ne trudite previše, postoji mnogo opcija za 1E mjesečno na svakom uglu. Pitanje odabira VPS-a je daleko izvan okvira ovog članka, pa ako neko ne razumije nešto o tome, pitajte u komentarima.

Ako koristite VPS ne samo za uslugu rutiranja, već i za završetak tunela na njemu, morate podići ovaj tunel i, gotovo sigurno, konfigurirati NAT za njega. Na internetu postoji veliki broj uputstava o ovim radnjama, ovdje ih neću ponavljati. Glavni zahtjev za takav tunel je da mora stvoriti poseban interfejs na vašem ruteru koji podržava tunel prema VPS-u. Najčešće korištene VPN tehnologije ispunjavaju ovaj zahtjev - na primjer, OpenVPN u tun modu je savršen.

Dobivanje kopije registra

Kao što je Džebrail rekao: "Onaj ko nas ometa, pomoći će nam." Budući da RKN pravi registar zabranjenih resursa, bio bi grijeh ne iskoristiti ovaj registar za rješavanje našeg problema. Primit ćemo kopiju registra sa github-a.

Idemo na vaš Linux server, ulazimo u korijenski kontekst (sudo su —) i instalirajte git ako već nije instaliran.

apt install git

Idite u svoj početni direktorij i izvucite kopiju registra.

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

Postavili smo cron ažuriranje (ja to radim svakih 20 minuta, ali možete odabrati bilo koji interval koji vas zanima). Da bismo to uradili pokrećemo crontab -e i dodajte mu sljedeći red:

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

Povezujemo kuku koja će kreirati datoteke za uslugu rutiranja nakon ažuriranja registra. Da biste to učinili, kreirajte 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 da ga učinite izvršnim

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

Kreiraćemo makebgp skriptu na koju se kuka poziva malo kasnije.

Instaliranje i konfiguriranje usluge usmjeravanja

Instaliraj pticu. Nažalost, verzija bird-a koja je trenutno objavljena u Ubuntu repozitorijumu je uporediva po svežini sa izmetom Archeopteryxa, tako da moramo prvo da dodamo zvanični PPA programera softvera u sistem.

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

Nakon ovoga, odmah deaktiviramo bird za IPv6 - neće nam trebati u ovoj instalaciji.

systemctl stop bird6
systemctl disable bird6

Ispod je minimalistički fajl konfiguracije usluge ptica (/etc/bird/bird.conf), što nam je sasvim dovoljno (i još jednom vas podsjećam da niko ne zabranjuje razvoj i prilagođavanje ideje 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;
}

id rutera - identifikator rutera, koji vizuelno izgleda kao IPv4 adresa, ali to nije. U našem slučaju to može biti bilo koji 32-bitni broj u formatu IPv4 adrese, ali je dobro da navedete tačno IPv4 adresu vašeg uređaja (u ovom slučaju VPS).

Protocol direct definira koja sučelja će raditi s procesom rutiranja. Primjer daje nekoliko primjera imena, možete dodati i druga. Možete jednostavno izbrisati liniju; u tom slučaju server će slušati sva dostupna sučelja s IPv4 adresom.

Protocol static je naša magija koja učitava liste prefiksa i IP adresa (koje su zapravo /32 prefiksa, naravno) iz datoteka za naknadnu najavu. Odakle dolaze ove liste bit će riječi u nastavku. Imajte na umu da je učitavanje IP adresa po defaultu komentarisano, razlog za to je velika količina učitavanja. Poređenja radi, u trenutku pisanja, na listi prefiksa ima 78 redova, a na listi IP adresa 85898. Toplo preporučujem da počnete i otklanjate greške samo na listi prefiksa i da li da omogućite učitavanje IP-a u budućnost je na vama da odlučite nakon eksperimentiranja sa vašim ruterom. Ne može svaki od njih lako probaviti 85 hiljada unosa u tabeli rutiranja.

protokol bgp, u stvari, postavlja bgp peering sa vašim ruterom. IP adresa je adresa eksternog interfejsa rutera (ili adresa tunelskog interfejsa na strani rutera), 64998 i 64999 su brojevi autonomnih sistema. U ovom slučaju, oni se mogu dodijeliti u obliku bilo kojih 16-bitnih brojeva, ali je dobra praksa koristiti AS brojeve iz privatnog raspona definiranog RFC6996 - 64512-65534 uključujući (postoji format za 32-bitne ASN-ove, ali u našem slučaju ovo je definitivno pretjerano). Opisana konfiguracija koristi eBGP peering, u kojem brojevi autonomnih sistema usluge rutiranja i rutera moraju biti različiti.

Kao što vidite, usluga treba da zna IP adresu rutera, tako da ako imate dinamičku ili neusmjerivu privatnu (RFC1918) ili dijeljenu (RFC6598) adresu, nemate opciju da pokrenete peering na vanjskoj interfejs, ali servis će i dalje raditi unutar tunela.

Također je sasvim jasno da iz jedne usluge možete dati rute do nekoliko različitih rutera - samo duplirajte postavke za njih kopiranjem bgp odjeljka protokola i promjenom susjedove IP adrese. Zato su u primjeru prikazane postavke za zavirivanje izvan tunela, kao najuniverzalnije. Lako ih je ukloniti u tunel promjenom IP adresa u postavkama u skladu s tim.

Obrada registra za uslugu usmjeravanja

Sada trebamo, zapravo, da kreiramo liste prefiksa i IP adresa, koje su u prethodnoj fazi spominjane u statici protokola. Da bismo to učinili, uzimamo datoteku registra i od nje pravimo datoteke koje su nam potrebne koristeći sljedeću skriptu, smještenu 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 da ga učinite izvršnim

chmod +x /root/blacklist/makebgp

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

Najvjerovatnije vam bird u ovom trenutku ne radi, jer ste u prethodnoj fazi tražili od njega da traži fajlove koji još nisu postojali. Stoga ga pokrećemo i provjeravamo da li je pokrenut:

systemctl start bird
birdc show route

Izlaz druge naredbe trebao bi pokazati oko 80 zapisa (ovo je za sada, ali kada ga postavite, sve će ovisiti o revnosti RKN-a u blokiranju mreža) otprilike ovako:

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

tim

birdc show protocol

će pokazati status protokola unutar usluge. Dok ne konfigurišete ruter (pogledajte sljedeću tačku), OurRouter protokol će biti u početnom stanju (Poveži se ili Aktivna faza), a nakon uspješnog povezivanja prelazi u stanje gore (Uspostavljena faza). Na primjer, na mom sistemu 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 rutera

Verovatno su svi umorni od čitanja ove krpe za noge, 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 da se podigne BGP peering i dodeli nexthop svim primljenim prefiksima, ukazujući na naš tunel (ako treba da šaljemo saobraćaj preko p2p interfejsa) ili na nexthop IP adresu ako će saobraćaj ići na ethernet).

Na primjer, na Mikrotiku u RouterOS-u to se rješava 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

iu Cisco IOS - 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

Ako se isti tunel koristi i za BGP peering i za prijenos korisnog saobraćaja, nije potrebno postavljati nexthop, on će biti ispravno postavljen koristeći protokol. Ali ako ga postavite ručno, ni to neće pogoršati situaciju.

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

Nakon što je vaša BGP sesija počela, rute do velikih mreža su stigle i instalirane su u tabeli, promet je tekao na adrese sa njih i sreća je blizu, možete se vratiti na uslugu ptica i pokušati dekomentirati unos koji povezuje listu IP adresa, izvršite nakon toga

systemctl reload bird

i pogledajte kako je vaš ruter prenio ovih 85 hiljada ruta. Budite spremni da se isključite i razmislite šta da radite sa tim :)

Ukupno

Čisto teoretski, nakon dovršetka gore opisanih koraka, sada imate uslugu koja automatski preusmjerava promet na IP adrese zabranjene u Ruskoj Federaciji mimo sistema filtriranja.

Može se, naravno, poboljšati. Na primjer, prilično je lako sažeti listu IP adresa koristeći perl ili python rješenja. Jednostavna Perl skripta koja to radi koristeći Net::CIDR::Lite pretvara 85 hiljada prefiksa u 60 (ne hiljadu), ali, naravno, pokriva mnogo veći opseg adresa nego što je blokirano.

Pošto usluga funkcioniše na trećem nivou ISO/OSI modela, neće vas spasiti od blokiranja sajta/stranice ako se reši na pogrešnu adresu kako je zabeleženo u registru. Ali zajedno sa registrom, sa github-a stiže i datoteka nxdomain.txt, koja se uz nekoliko poteza skripte lako pretvara u izvor adresa za, na primjer, dodatak SwitchyOmega u Chromeu.

Također je potrebno napomenuti da rješenje zahtijeva dodatnu doradu ako niste samo korisnik Interneta, već i sami objavljujete neke resurse (na primjer, web stranica ili mail server radi na ovoj konekciji). Koristeći sredstva rutera, potrebno je strogo vezati odlazni saobraćaj sa ovog servisa na vašu javnu adresu, inače ćete izgubiti konekciju sa onim resursima koji su pokriveni listom prefiksa koje ruter prima.

Ako imate pitanja, pitajte, spreman sam odgovoriti.

UPD. Hvala ti navion и TerAnYu za parametre za git koji omogućavaju smanjenje količine preuzimanja.

UPD2. Kolege, izgleda da sam pogriješio što u članak nisam dodao uputstva za postavljanje tunela između VPS-a i rutera. Ovo otvara mnoga pitanja.
Za svaki slučaj, još jednom ću napomenuti da ste prije pokretanja ovog vodiča već konfigurirali VPN tunel u smjeru koji vam je potreban i provjerili njegovu funkcionalnost (na primjer, okretanjem prometa tamo prema zadanim postavkama ili statički). Ako još niste završili ovu fazu, nema puno smisla slijediti korake u članku. Još nemam svoj tekst o ovome, ali ako google “podešavanje OpenVPN servera” zajedno sa imenom operativnog sistema instaliranog na VPS-u, i “podešavanje OpenVPN klijenta” sa imenom vašeg rutera , najvjerovatnije ćete pronaći brojne članke o ovoj temi, uključujući i Habré.

UPD3. Nepožrtvovano Napisao sam kod koji pretvara dump.csv u rezultujuću datoteku za pticu sa opcionim sumiranjem IP adresa. Stoga se odjeljak “Obrada registra za uslugu usmjeravanja” može zamijeniti pozivanjem njegovog programa. https://habr.com/post/354282/#comment_10782712

UPD4. Malo rada na greškama (nisam ih dodao u tekst):
1) umjesto toga systemctl ptica ponovnog učitavanja ima smisla koristiti naredbu birdc configure.
2) u Mikrotik ruteru, umjesto da promijenite nexthop na IP druge strane tunela /filter rutiranja add action=accept chain=dynamic-in protocol=bgp comment=»Set nexthop» set-in-nexthop=172.30.1.1 ima smisla specificirati rutu direktno do tunelskog interfejsa, bez adrese /filter rutiranja add action=accept chain=dynamic-in protocol=bgp comment=»Postavi nexthop» set-in-nexthop-direct=<ime interfejsa>

UPD5. Pojavila se nova usluga https://antifilter.download, odakle možete preuzeti gotove liste IP adresa. Ažurira se svakih pola sata. Na strani klijenta, sve što ostaje je da se uokvire zapisi sa odgovarajućim “route... reject”.
I u ovom trenutku je vjerovatno dovoljno da otrcate svoju baku i ažurirate članak.

UPD6. Revidirana verzija članka za one koji to ne žele shvatiti, ali žele započeti - ovdje.

izvor: www.habr.com

Dodajte komentar