Stel BGP op om blokkering te omseil, of "Hoe ek opgehou het om bang te wees en verlief geraak het op RKN"

Wel, oukei, oor "verlief geraak" is 'n oordrywing. Eerder "kon saambestaan ​​met".

Soos u almal weet, blokkeer Roskomnadzor sedert 16 April 2018 toegang tot hulpbronne op die netwerk met uiters breë trekke, en voeg by die verenigde register van domeinname, verwysings na bladsye van webwerwe op die internet en netwerkadresse wat u toelaat om identifiseer webwerwe op die internet wat inligting bevat, waarvan die verspreiding in die Russiese Federasie verbied is” (in die teks - net 'n register) /10 soms. As gevolg hiervan ly die burgers van die Russiese Federasie en besighede, omdat hulle toegang verloor het tot die absoluut wettige hulpbronne wat hulle benodig.

Nadat ek in die kommentaar by een van die artikels op Habré gesê het dat ek gereed is om die slagoffers te help met die opstel van 'n omseilskema, het verskeie mense my gekontak om sulke hulp te vra. Toe alles vir hulle gewerk het, het een van hulle aanbeveel om die tegniek in 'n artikel te beskryf. By nadenke het ek besluit om my stilte op die werf te verbreek en vir 'n slag iets tussen 'n projek en 'n plasing op Facebook te probeer skryf, m.a.w. habrapost. Die resultaat is voor jou.

Vrywaring

Aangesien dit nie baie wettig is om maniere te publiseer om die blokkering van toegang tot inligting wat op die grondgebied van die Russiese Federasie verbied word te omseil nie, sal die doel van hierdie artikel wees om te praat oor 'n metode waarmee u toegang tot hulpbronne wat op die gebied toegelaat word, outomatiseer. van die Russiese Federasie, maar as gevolg van iemand se optrede ontoeganklik direk deur jou verskaffer. En toegang tot ander hulpbronne, verkry as gevolg van aksies uit die artikel, is 'n ongelukkige newe-effek en is geensins die doel van die artikel nie.

Ook, aangesien ek hoofsaaklik 'n netwerkargitek van beroep is, roeping en lewenspad, is programmering en Linux nie my sterkpunte nie. Daarom kan skrifte natuurlik beter geskryf word, sekuriteitskwessies in VPS kan dieper uitgewerk word, ens. Jou voorstelle sal met dankbaarheid aanvaar word, as dit gedetailleerd genoeg is - ek sal dit graag by die teks van die artikel voeg.

TL; DR

Ons outomatiseer toegang tot hulpbronne deur jou bestaande tonnel deur 'n kopie van die register en die BGP-protokol te gebruik. Die doel is om alle verkeer wat aan geblokkeerde hulpbronne gerig is, in die tonnel te verwyder. Minimum verduideliking, meestal stap vir stap instruksies.

Wat het jy nodig hiervoor

Ongelukkig is hierdie pos nie vir almal nie. Om hierdie tegniek te gebruik, sal jy 'n paar elemente moet saamstel:

  1. Jy moet 'n Linux-bediener iewers buite die blokkeerveld hê. Of ten minste die begeerte om so 'n bediener te begin - aangesien dit nou vanaf $ 9 / jaar kos, en moontlik minder. Die metode is ook geskik as u 'n aparte VPN-tonnel het, dan kan die bediener binne die blokveld geleë wees.
  2. Jou router moet slim genoeg wees om dit te kan
    • enige VPN-kliënt waarvan jy hou (ek verkies OpenVPN, maar dit kan PPTP, L2TP, GRE+IPSec en enige ander opsie wees wat 'n tonnelkoppelvlak skep);
    • BGPv4 protokol. Wat beteken dat dit vir SOHO Mikrotik of enige router met OpenWRT/LEDE/soortgelyke pasgemaakte firmware kan wees wat jou toelaat om Quagga of Bird te installeer. Die gebruik van 'n rekenaarroeteerder word ook nie verbied nie. Vir 'n onderneming, sien die dokumentasie vir jou grensroeteerder vir BGP-ondersteuning.
  3. U moet vertroud wees met Linux-gebruik en netwerktegnologieë, insluitend BGP. Of wil ten minste daardie idee kry. Aangesien ek nie hierdie keer gereed is om die grootheid te omhels nie, sal jy op jou eie sekere punte moet bestudeer wat vir jou onverstaanbaar is. Ek sal egter natuurlik spesifieke vrae in die kommentaar beantwoord en dit is onwaarskynlik dat ek die enigste een sal wees wat antwoord, so vra gerus.

Wat word in die voorbeeld gebruik

  • Afskrif van die register https://github.com/zapret-info/z-i 
  • VPS - Ubuntu 16.04
  • Roetediens - voël 1.6.3   
  • Roeter - Mikrotik hAP ac
  • Werkende dopgehou - aangesien ons as wortel werk, sal die meeste van alles in die wortel tuislêergids geplaas word. Onderskeidelik:
    • /root/blacklist - werkmap met samestellingskrip
    • /root/zi - 'n kopie van die register vanaf github
    • /etc/bird - standaard gids vir voëldiensinstellings
  • Ons aanvaar 194.165.22.146, ASN 64998 as die eksterne IP-adres van die VPS met die roetebediener en die tonnelbeëindigingspunt; eksterne IP-adres van die router - 81.177.103.94, ASN 64999
  • Die IP-adresse binne die tonnel is onderskeidelik 172.30.1.1 en 172.30.1.2.

Stel BGP op om blokkering te omseil, of "Hoe ek opgehou het om bang te wees en verlief geraak het op RKN"

Natuurlik kan jy enige ander routers, bedryfstelsels en sagtewareprodukte gebruik, en die oplossing aanpas om by hul logika te pas.

Kortliks - die logika van die besluit

  1. Voorbereidende aksies
    1. Kry 'n VPS
    2. Ons lig die tonnel van die router na die VPS
  2. Die verkryging en gereelde opdatering van 'n kopie van die register
  3. Installeer en konfigureer die roetediens
  4. Skep 'n lys van statiese roetes vir die roeteerdiens gebaseer op die register
  5. Ons koppel die router aan die diens en stel op om alle verkeer deur die tonnel te stuur.

Die eintlike besluit

Voorbereidende aksies

In die omvang van die netwerk is daar baie dienste wat VPS vir uiters billike geld verskaf. Tot dusver het ek die $9/jaar-opsie gevind en gebruik, maar selfs al pla jy nie regtig nie, is daar baie opsies vir 1E/maand op elke hoek. Die vraag oor die keuse van 'n VPS lê ver buite die bestek van hierdie artikel, so as iets nie vir iemand hieroor duidelik is nie, vra in die kommentaar.

As jy VPS nie net vir die roetediens gebruik nie, maar ook om 'n tonnel daarop te beëindig, moet jy hierdie tonnel verhoog en, byna onomwonde, NAT daarvoor instel. Daar is 'n groot aantal instruksies op die netwerk vir hierdie aksies, ek sal dit nie hier herhaal nie. Die hoofvereiste vir so 'n tonnel is dat dit 'n aparte koppelvlak op jou router moet skep wat die tonnel na die VPS ondersteun. Die meeste gebruikte VPN-tegnologieë voldoen aan hierdie vereiste – byvoorbeeld, OpenVPN in tun-modus is goed.

Kry 'n afskrif van die register

Soos Jabrayil gesê het, "Hy wat ons verhinder, sal ons help." Aangesien die RKN 'n register van verbode hulpbronne skep, sal dit 'n sonde wees om nie hierdie register te gebruik om ons probleem op te los nie. Ons sal 'n afskrif van die register van github ontvang.

Ons gaan na jou Linux-bediener, val in die konteks van root'a (sudo su-) en installeer git as dit nie reeds geïnstalleer is nie.

apt install git

Gaan na jou tuisgids en haal 'n kopie van die register uit.

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

Stel 'n cron-opdatering op (ek het dit elke 20 minute, maar jy kan enige interval kies wat jou interesseer). Om dit te doen, hardloop ons crontab-e en voeg die volgende reël daarby:

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

Ons koppel 'n haak wat lêers vir die roeteerdiens sal skep na die opdatering van die register. Om dit te doen, skep ons 'n lêer /root/zi/.git/hooks/post-merge met die volgende inhoud:

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

en moenie vergeet om dit uitvoerbaar te maak nie

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

Die makebgp-skrip waarna die haak verwys, sal later geskep word.

Installeer en konfigureer die roetediens

Installeer voël. Ongelukkig is die weergawe van voël wat tans in die Ubuntu-bewaarplekke vrygestel word, in varsheid vergelykbaar met Archeopteryx-ontlasting, so ons moet eers die amptelike PPA van die sagteware-ontwikkelaars by die stelsel voeg.

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

Daarna deaktiveer ons bird onmiddellik vir IPv6 - in hierdie installasie sal ons dit nie nodig hê nie.

systemctl stop bird6
systemctl disable bird6

Hieronder is 'n minimalistiese konfigurasielêer vir die voëldiens (/etc/bird/bird.conf), wat vir ons genoeg is (en weereens herinner ek jou daaraan dat niemand verbied om die idee te ontwikkel en in te stel om aan jou eie behoeftes te voldoen nie)

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 - router identifiseerder, visueel lyk soos 'n IPv4 adres, maar dit is nie. In ons geval kan dit enige 32-bis-nommer in die IPv4-adresformaat wees, maar dit is goeie praktyk om die IPv4-adres van jou toestel (in hierdie geval, VPS) daar te spesifiseer.

protokol direk bepaal watter koppelvlakke met die roeteringsproses sal werk. Die voorbeeld gee 'n paar voorbeelde van name, jy kan meer byvoeg. U kan ook eenvoudig die lyn uitvee, in welke geval die bediener op alle beskikbare koppelvlakke met 'n IPv4-adres sal luister.

protokol staties is ons towerkrag wat lyste van voorvoegsels en IP-adresse (wat natuurlik /32 voorvoegsels is) van lêers laai vir latere aankondiging. Waar hierdie lyste vandaan kom, sal hieronder bespreek word. Neem asseblief kennis dat die laai van IP-adresse by verstek opgemerk word, die rede hiervoor is die groot hoeveelheid oplaai. Ter vergelyking, ten tyde van die skryf van die artikel, is daar 78 reëls in die lys van voorvoegsels, en 85898 in die lys van IP-adresse.Ek beveel sterk aan dat jy begin en ontfout slegs op die lys van voorvoegsels, en besluit of of nie. om ip-laai in die toekoms te aktiveer nadat jy met jou router geëksperimenteer het. Nie elkeen van hulle kan maklik 85 duisend inskrywings in die roetetabel verteer nie.

protokol bgp stel eintlik bgp peering op met jou router. ip-adres is die adres van die eksterne koppelvlak van die roeteerder (of die adres van die tonnelkoppelvlak vanaf die kant van die roeteerder), 64998 en 64999 is die nommers van outonome stelsels. In hierdie geval kan hulle in die vorm van enige 16-bis-nommers toegeken word, maar dit is goeie praktyk om AS-nommers van die private reeks gedefinieer deur RFC6996 - 64512-65534 ingesluit te gebruik (daar is 'n 32-bis ASN-formaat, maar in ons geval is dit beslis oordrewe). Die beskryfde konfigurasie gebruik eBGP-peering, waarin die outonome stelselnommers van die roeteerdiens en die roeteerder moet verskil.

Soos u kan sien, moet die diens die IP-adres van die router ken, dus as u 'n dinamiese of nie-roubare privaat (RFC1918) of gedeelde (RFC6598) adres het, het u geen opsie om peering op die eksterne koppelvlak te verhoog nie, maar die diens sal steeds binne die tonnel werk.

Dit is ook redelik deursigtig dat jy verskeie verskillende routers van roetes vanaf een diens kan voorsien – dupliseer net die instellings daarvoor deur die protokol bgp-afdeling te kopieer met die verandering van die buurman se IP-adres. Daarom toon die voorbeeld die instellings vir om buite die tonnel te loer as die mees universele. Dit is nie moeilik om hulle in die tonnel te verwyder deur die IP-adresse in die instellings dienooreenkomstig te verander nie.

Registerverwerking vir die roetediens

Nou moet ons in werklikheid lyste van voorvoegsels en ip-adresse skep, wat in die vorige stap in protokol staties genoem word. Om dit te doen, neem ons die registerlêer en maak die lêers wat ons benodig daaruit met die volgende skrif, geleë in /root/swartlys/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'

Moenie vergeet om dit uitvoerbaar te maak nie

chmod +x /root/blacklist/makebgp

Nou kan jy dit met die hand laat loop en die voorkoms van lêers in /etc/bird waarneem.

Heel waarskynlik, op hierdie oomblik werk voël nie vir jou nie, want in die vorige stadium het jy voorgestel dat dit soek na lêers wat nog nie bestaan ​​het nie. Daarom begin ons dit en beheer dat dit begin:

systemctl start bird
birdc show route

Die uitvoer van die tweede opdrag moet ongeveer 80 inskrywings wys (dit is op die oomblik, en wanneer jy dit opstel, sal alles afhang van die ywerigheid van die ILV om netwerke te blokkeer) soos volg:

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

Span

birdc show protocol

sal die status van die protokolle binne die diens wys. Totdat jy die roeteerder konfigureer (sien die volgende paragraaf), sal die OurRouter-protokol in die begintoestand wees (Koppel of Aktiewe fases), en na 'n suksesvolle verbinding, sal dit in die op-toestand gaan (Gevestigde fase). Byvoorbeeld, op my stelsel lyk die uitvoer van hierdie opdrag soos volg:

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

Koppel 'n router

Almal is seker al moeg om hierdie voetdoek te lees, maar hou moed – die einde is naby. Boonop sal ek nie in hierdie afdeling stap-vir-stap instruksies kan gee nie - dit sal verskil vir elke vervaardiger.

Ek kan jou egter 'n paar voorbeelde wys. Die hooflogika is om BGP-peering te verhoog en nexthop aan alle ontvangde voorvoegsels te heg, wat na ons tonnel wys (as jy verkeer deur die p2p-koppelvlak moet uitvoer) of nexthop ip-adres as die verkeer na Ethernet gaan).

Byvoorbeeld, op Mikrotik in RouterOS word dit soos volg opgelos

/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

en in Cisco IOS - soos hierdie

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

In die geval dat dieselfde tonnel gebruik word vir beide BGP-loer en vir die oordrag van nuttige verkeer, is dit nie nodig om nexthop in te stel nie, dit sal korrek gestel word deur middel van die protokol. Maar as jy dit met die hand instel, sal dit ook nie erger word nie.

Op ander platforms sal u self die konfigurasie moet uitvind, maar as u probleme ondervind, skryf in die opmerkings, ek sal probeer help.

Nadat jou BGP-sessie gestyg het, roetes na groot netwerke aangekom het en in die tabel geïnstalleer is, verkeer na die adresse van hulle af weg is en geluk naby is, kan jy terugkeer na die voëldiens en probeer om die inskrywing daar wat die verbinding verbind lys van ip-adresse, voer daarna uit

systemctl reload bird

en kyk hoe jou router hierdie 85 duisend roetes oorgedra het. Maak gereed om dit af te skakel en dink oor wat om daarmee te doen 🙂

In totaal

Suiwer teoreties, nadat u die bogenoemde stappe uitgevoer het, het u 'n diens wat verkeer outomaties herlei na IP-adresse wat in die Russiese Federasie verban is, verby die filterstelsel.

Dit kan natuurlik verbeter word. Dit is byvoorbeeld maklik genoeg om 'n lys van IP-adresse op te som deur middel van perl- of python-oplossings. 'n Eenvoudige perl-skrif wat dit met Net::CIDR::Lite doen, verander 85 duisend voorvoegsels in 60 (nie duisend nie), maar dek natuurlik 'n baie groter reeks adresse as wat geblokkeer word.

Aangesien die diens op die derde vlak van die ISO / OSI-model werk, sal dit jou nie red van werf / bladsy blokkering as dit nie die adres wat in die register aangeteken is, oplos nie. Maar saam met die register van github kom die nxdomain.txt-lêer aan, wat met 'n paar houe van die skrif maklik verander in 'n bron van adresse vir byvoorbeeld die SwitchyOmega-inprop in Chrome.

Daar moet ook genoem word dat die oplossing addisionele verskerping verg as jy nie net 'n internetgebruiker is nie, maar ook sommige bronne van jouself publiseer (byvoorbeeld, 'n webwerf of posbediener loop op hierdie verbinding). Deur middel van die roeteerder moet jy uitgaande verkeer van hierdie diens na jou publieke adres vasbind, anders sal jy konneksie verloor met daardie hulpbronne wat gedek word deur die lys voorvoegsels wat deur die roeteerder ontvang word.

As jy enige vrae het - vra, gereed om te antwoord.

UPD. Dankie navy и TerAnYu vir opsies vir git om aflaaivolumes te verminder.

UPD2. Kollegas, dit blyk dat ek 'n fout gemaak het deur nie instruksies vir die opstel van 'n tonnel tussen die VPS en die router by die artikel by te voeg nie. Baie vrae word hierdeur veroorsaak.
Net vir ingeval, let ek weer op - daar word aanvaar dat voordat u met die stappe in hierdie gids begin het, u reeds die VPN-tonnel in die rigting wat u benodig, gekonfigureer het en die werkverrigting daarvan nagegaan het (byvoorbeeld om verkeer daar by verstek of staties toe te draai). As jy nog nie hierdie fase voltooi het nie, maak dit nie regtig sin om die stappe uit die artikel te volg nie. Ek het nog nie my eie teks hieroor nie, maar as jy “OpenVPN server setup” google saam met die naam van die bedryfstelsel wat op die VPS geïnstalleer is, en “OpenVPN client setup” met die naam van jou router, sal jy heel waarskynlik sal 'n aantal artikels oor hierdie onderwerp vind, insluitend oor Habré.

UPD3. Onopgeoffer het 'n kode geskryf wat die resulterende lêer vir voël van dump.csv maak met opsionele opsomming van ip-adresse. Daarom kan die "Registrasieverwerking vir die roetediens"-afdeling vervang word met 'n oproep na sy program. https://habr.com/post/354282/#comment_10782712

UPD4. 'n Bietjie werk aan die foute (nie bygedra in die teks nie):
1) in plaas daarvan systemctl herlaai voël dit maak sin om die opdrag te gebruik birdc instel.
2) in die Mikrotik-roeteerder, in plaas daarvan om die volgende-hop na die IP van die tweede kant van die tonnel te verander /routing filter voeg action=aanvaar ketting=dinamiese-in-protokol=bgp-kommentaar="Stel nexthop" set-in-nexthop=172.30.1.1 dit maak sin om die roete direk na die tonnelkoppelvlak te spesifiseer, sonder die adres /routing filter voeg action=aanvaar ketting=dinamiese-in-protokol=bgp-kommentaar="Stel nexthop" set-in-nexthop-direct=<koppelvlaknaam>

UPD5. 'n Nuwe diens het aangebreek https://antifilter.download, van waar jy klaargemaakte lyste van ip-adresse kan neem. Elke halfuur opgedateer. Aan die kliëntkant bly al wat oorbly om die inskrywings te raam met die ooreenstemmende "roete ... verwerp".
En dit is seker genoeg om my ouma te skud en die artikel by te werk.

UPD6. 'n Hersiene weergawe van die artikel vir diegene wat nie wil verstaan ​​nie, maar wil begin - hier.

Bron: will.com

Voeg 'n opmerking