Sette opp BGP for å omgå blokkering, eller "Hvordan jeg sluttet å være redd og ble forelsket i RKN"

Vel, ok, om "elsket" er en overdrivelse. Snarere "var i stand til å sameksistere med."

Som dere alle vet, siden 16. april 2018, har Roskomnadzor blokkert tilgang til ressurser på Internett i ekstremt store trekk, og lagt til "Det enhetlige registeret over domenenavn, sideindekser for nettsteder på Internett og nettverksadresser som tillater å identifisere nettsteder på Internett," som inneholder informasjon hvis distribusjon er forbudt i Den russiske føderasjonen" (i teksten - bare et register) av /10 noen ganger. Som et resultat lider borgere av den russiske føderasjonen og bedrifter, etter å ha mistet tilgangen til de fullstendig lovlige ressursene de trenger.

Etter at jeg sa i kommentarene til en av artiklene på Habré at jeg var klar til å hjelpe ofre med å sette opp en bypass-ordning, kom flere til meg og ba om slik hjelp. Da alt fungerte for dem, anbefalte en av dem å beskrive teknikken i en artikkel. Etter litt omtanke bestemte jeg meg for å bryte tausheten min på siden og prøve for en gangs skyld å skrive noe mellom et prosjekt og et Facebook-innlegg, dvs. habrapost. Resultatet ligger foran deg.

Ansvarsfraskrivelse

Siden det ikke er veldig lovlig å publisere måter å omgå blokkering av tilgang til informasjon som er forbudt på den russiske føderasjonens territorium, vil formålet med denne artikkelen være å snakke om en metode som lar deg automatisere tilgang til ressurser som er tillatt på territoriet til den russiske føderasjonen, men på grunn av andres handlinger er ikke direkte tilgjengelige via leverandøren din. Og tilgang til andre ressurser oppnådd som følge av handlinger fra artikkelen er en uheldig bieffekt og er på ingen måte hensikten med artikkelen.

Siden jeg først og fremst er nettverksarkitekt av yrke, yrke og livsvei, er ikke programmering og Linux mine sterke sider. Derfor kan selvfølgelig skript skrives bedre, sikkerhetsproblemer i VPS kan utredes dypere osv. Dine forslag vil bli akseptert med takknemlighet, hvis de er tilstrekkelig detaljerte - jeg vil gjerne legge dem til i artikkelens tekst.

TL; DR

Vi automatiserer tilgang til ressurser gjennom din eksisterende tunnel ved å bruke en kopi av registeret og BGP-protokollen. Målet er å fjerne all trafikk adressert til blokkerte ressurser inn i tunnelen. Minimum forklaringer, for det meste trinnvise instruksjoner.

Hva trenger du til dette?

Dessverre er ikke dette innlegget for alle. For å bruke denne teknikken må du sette sammen flere elementer:

  1. Du må ha en linux-server et sted utenfor blokkeringsfeltet. Eller i det minste ønsket om å ha en slik server - heldigvis koster den nå fra $9/år, og muligens mindre. Metoden egner seg også hvis du har en egen VPN-tunnel, da kan serveren ligge inne i blokkeringsfeltet.
  2. Ruteren din bør være smart nok til å kunne
    • hvilken som helst VPN-klient du liker (jeg foretrekker OpenVPN, men det kan være PPTP, L2TP, GRE+IPSec eller et hvilket som helst annet alternativ som lager et tunnelgrensesnitt);
    • BGPv4-protokoll. Noe som betyr at for SOHO kan det være Mikrotik eller en hvilken som helst ruter med OpenWRT/LEDE/lignende tilpasset firmware som lar deg installere Quagga eller Bird. Bruk av PC-ruter er heller ikke forbudt. Når det gjelder en bedrift, se etter BGP-støtte i dokumentasjonen for grenseruteren.
  3. Du bør ha forståelse for Linux-bruk og nettverksteknologier, inkludert BGP-protokollen. Eller i det minste ønsker å få en slik idé. Siden jeg ikke er klar til å omfavne enormheten denne gangen, må du studere noen aspekter som er uforståelige for deg på egen hånd. Imidlertid vil jeg selvfølgelig svare på spesifikke spørsmål i kommentarene, og jeg er neppe den eneste som svarer, så ikke nøl med å spørre.

Hva brukes i eksempelet

  • En kopi av registeret - fra https://github.com/zapret-info/z-i 
  • VPS - Ubuntu 16.04
  • Rutetjeneste - fugl 1.6.3   
  • Ruter - Mikrotik hAP ac
  • Arbeidsmapper - siden vi jobber som root, vil det meste av alt ligge i rotens hjemmemappe. Henholdsvis:
    • /root/blacklist - arbeidsmappe med kompileringsskriptet
    • /root/zi - kopi av registret fra github
    • /etc/bird - standardmappe for fugletjenesteinnstillinger
  • Den eksterne IP-adressen til VPS med rutingserveren og tunneltermineringspunktet er 194.165.22.146, ASN 64998; ekstern IP-adresse til ruteren - 81.177.103.94, ASN 64999
  • IP-adressene inne i tunnelen er henholdsvis 172.30.1.1 og 172.30.1.2.

Sette opp BGP for å omgå blokkering, eller "Hvordan jeg sluttet å være redd og ble forelsket i RKN"

Selvfølgelig kan du bruke alle andre rutere, operativsystemer og programvareprodukter, tilpasse løsningen til deres logikk.

Kort fortalt - logikken i løsningen

  1. Forberedende handlinger
    1. Få en VPS
    2. Heving av en tunnel fra ruteren til VPS
  2. Vi mottar og oppdaterer jevnlig en kopi av registeret
  3. Installere og konfigurere rutetjenesten
  4. Vi lager en liste over statiske ruter for rutetjenesten basert på registeret
  5. Vi kobler ruteren til tjenesten og konfigurerer å sende all trafikk gjennom tunnelen.

Selve løsningen

Forberedende handlinger

Det er mange tjenester på Internett som gir VPS til ekstremt rimelige priser. Så langt har jeg funnet og bruker alternativet for $9/år, men selv om du ikke bryr deg for mye, er det mange alternativer for 1E/måned på hvert hjørne. Spørsmålet om å velge en VPS ligger langt utenfor rammen av denne artikkelen, så hvis noen ikke forstår noe om dette, spør i kommentarfeltet.

Hvis du bruker en VPS ikke bare for rutingtjenesten, men også for å avslutte en tunnel på den, må du heve denne tunnelen og, nesten helt sikkert, konfigurere NAT for den. Det er et stort antall instruksjoner om disse handlingene på Internett, jeg vil ikke gjenta dem her. Hovedkravet til en slik tunnel er at den skal lage et eget grensesnitt på ruteren din som støtter tunnelen mot VPS. De fleste brukte VPN-teknologier oppfyller dette kravet – for eksempel er OpenVPN i tun-modus perfekt.

Få en kopi av registeret

Som Jabrail sa: "Den som hindrer oss vil hjelpe oss." Siden RKN oppretter et register over forbudte ressurser, vil det være synd å ikke bruke dette registeret til å løse problemet vårt. Vi vil motta en kopi av registeret fra github.

Vi går til Linux-serveren din, faller inn i rotkonteksten (sudo su -) og installer git hvis det ikke allerede er installert.

apt install git

Gå til hjemmekatalogen din og trekk ut en kopi av registeret.

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

Vi setter opp en cron-oppdatering (jeg gjør det en gang hvert 20. minutt, men du kan velge et hvilket som helst intervall som interesserer deg). For å gjøre dette lanserer vi crontab -e og legg til følgende linje:

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

Vi kobler til en krok som vil lage filer for rutingtjenesten etter oppdatering av registeret. For å gjøre dette, lag en fil /root/zi/.git/hooks/post-merge med følgende innhold:

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

og ikke glem å gjøre den kjørbar

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

Vi vil lage makebgp-skriptet som kroken refererer til litt senere.

Installere og konfigurere en rutetjeneste

Installer fugl. Dessverre er versjonen av fugl som for øyeblikket er lagt ut i Ubuntu-depotene sammenlignbar i ferskhet med Archeopteryx-avføring, så vi må først legge til den offisielle PPA-en til programvareutviklerne til systemet.

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

Etter dette deaktiverer vi umiddelbart fugl for IPv6 - vi trenger det ikke i denne installasjonen.

systemctl stop bird6
systemctl disable bird6

Nedenfor er en minimalistisk fugletjenestekonfigurasjonsfil (/etc/bird/bird.conf), som er ganske nok for oss (og jeg minner deg nok en gang om at ingen forbyr å utvikle og justere ideen til dine egne behov)

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

ruter-id - ruteridentifikator, som visuelt ser ut som en IPv4-adresse, men ikke er en. I vårt tilfelle kan det være et hvilket som helst 32-bits tall i IPv4-adresseformatet, men det er en god form å angi nøyaktig IPv4-adressen til enheten din (i dette tilfellet VPS).

Protocol direct definerer hvilke grensesnitt som skal fungere med rutingprosessen. Eksemplet gir et par eksempelnavn, du kan legge til andre. Du kan ganske enkelt slette linjen; i dette tilfellet vil serveren lytte til alle tilgjengelige grensesnitt med en IPv4-adresse.

Protocol static er magien vår som laster lister over prefikser og IP-adresser (som faktisk er /32 prefikser, selvfølgelig) fra filer for påfølgende kunngjøring. Hvor disse listene kommer fra vil bli diskutert nedenfor. Vær oppmerksom på at lasting av IP-adresser er kommentert ut som standard, årsaken til dette er det store opplastingsvolumet. Til sammenligning, i skrivende stund er det 78 linjer i listen over prefikser, og 85898 i listen over IP-adresser. Jeg anbefaler på det sterkeste å starte og feilsøke kun på listen over prefikser, og hvorvidt IP-lasting skal aktiveres eller ikke. fremtiden er opp til deg å bestemme etter å ha eksperimentert med ruteren. Ikke alle kan enkelt fordøye 85 tusen oppføringer i rutetabellen.

protokoll bgp setter faktisk opp bgp-peering med ruteren din. IP-adressen er adressen til det eksterne grensesnittet til ruteren (eller adressen til tunnelgrensesnittet på rutersiden), 64998 og 64999 er tallene for autonome systemer. I dette tilfellet kan de tildeles i form av alle 16-biters tall, men det er god praksis å bruke AS-numre fra det private området definert av RFC6996 - 64512-65534 inklusive (det er et format for 32-bits ASN-er, men i vårt tilfelle er dette definitivt overkill). Den beskrevne konfigurasjonen bruker eBGP-peering, der numrene til de autonome systemene til rutetjenesten og ruteren må være forskjellige.

Som du kan se, må tjenesten vite IP-adressen til ruteren, så hvis du har en dynamisk eller ikke-rutbar privat (RFC1918) eller delt (RFC6598) adresse, har du ikke muligheten til å øke peering på den eksterne grensesnitt, men tjenesten vil fortsatt fungere inne i tunnelen.

Det er også ganske klart at fra én tjeneste kan du gi ruter til flere forskjellige rutere - bare dupliser innstillingene for dem ved å kopiere protokollen bgp-delen og endre naboens IP-adresse. Derfor viser eksemplet innstillinger for peering utenfor tunnelen, som de mest universelle. Det er enkelt å fjerne dem inn i tunnelen ved å endre IP-adressene i innstillingene tilsvarende.

Behandler registeret for rutingtjenesten

Nå trenger vi faktisk å lage lister over prefikser og IP-adresser, som ble nevnt i protokollen statisk på forrige stadium. For å gjøre dette tar vi registerfilen og lager filene vi trenger fra den ved å bruke følgende skript, plassert i /root/svarteliste/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'

Ikke glem å gjøre den kjørbar

chmod +x /root/blacklist/makebgp

Nå kan du kjøre det manuelt og observere utseendet til filer i /etc/bird.

Mest sannsynlig fungerer ikke bird for deg for øyeblikket, fordi du på forrige stadium ba den om å se etter filer som ikke eksisterte ennå. Derfor starter vi den og sjekker at den har startet:

systemctl start bird
birdc show route

Utdataene fra den andre kommandoen skal vise omtrent 80 poster (dette er foreløpig, men når du setter den opp, vil alt avhenge av iveren til RKN for å blokkere nettverk) noe som dette:

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

Lag

birdc show protocol

vil vise status for protokoller i tjenesten. Inntil du har konfigurert ruteren (se neste punkt), vil OurRouter-protokollen være i starttilstanden (Koble til eller Aktiv fase), og etter en vellykket tilkobling vil den gå til opptilstanden (etablert fase). For eksempel, på systemet mitt ser utgangen av denne kommandoen slik ut:

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

Koble til en ruter

Alle er nok lei av å lese denne fotduken, men ta motet – slutten er nær. Dessuten vil jeg ikke i denne delen kunne gi trinnvise instruksjoner - det vil være forskjellig for hver produsent.

Jeg kan imidlertid vise deg et par eksempler. Hovedlogikken er å øke BGP-peering og tildele nexthop til alle mottatte prefikser, peker på tunnelen vår (hvis vi trenger å sende trafikk gjennom et p2p-grensesnitt) eller nexthop IP-adressen hvis trafikken vil gå til ethernet).

For eksempel på Mikrotik i RouterOS løses dette som følger

/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

og i Cisco IOS - som dette

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

Hvis den samme tunnelen brukes både for BGP-peering og for overføring av nyttig trafikk, er det ikke nødvendig å sette nexthop, den vil bli satt riktig ved hjelp av protokollen. Men hvis du setter det manuelt, vil det heller ikke gjøre det verre.

På andre plattformer må du finne ut av konfigurasjonen selv, men hvis du har noen problemer, skriv i kommentarfeltet, jeg skal prøve å hjelpe.

Etter at BGP-økten din har startet, ruter til store nettverk har kommet og er installert i tabellen, trafikken har strømmet til adressene fra dem og lykken er nær, kan du gå tilbake til fugletjenesten og prøve å fjerne kommentarer til oppføringen der som forbinder liste over IP-adresser, kjør etter det

systemctl reload bird

og se hvordan ruteren din overførte disse 85 tusen rutene. Vær forberedt på å koble fra og tenk på hva du skal gjøre med den :)

Totalt

Rent teoretisk, etter å ha fullført trinnene beskrevet ovenfor, har du nå en tjeneste som automatisk omdirigerer trafikk til IP-adresser som er forbudt i Russland, forbi filtreringssystemet.

Det kan selvsagt forbedres. For eksempel er det ganske enkelt å oppsummere en liste over IP-adresser ved å bruke perl- eller python-løsninger. Et enkelt Perl-skript som gjør dette ved å bruke Net::CIDR::Lite gjør 85 tusen prefikser til 60 (ikke tusen), men dekker selvfølgelig et mye større adresseområde enn det som er blokkert.

Siden tjenesten opererer på det tredje nivået av ISO/OSI-modellen, vil den ikke spare deg fra å blokkere et nettsted eller en side hvis den går til feil adresse som er registrert i registeret. Men sammen med registeret kommer filen nxdomain.txt fra github, som med noen få strøk av scriptet enkelt blir til en adressekilde for for eksempel SwitchyOmega-pluginen i Chrome.

Det er også nødvendig å nevne at løsningen krever ytterligere foredling hvis du ikke bare er en Internett-bruker, men også publiserer noen ressurser på egen hånd (for eksempel kjører en nettside eller e-postserver på denne tilkoblingen). Ved å bruke ruterens midler er det nødvendig å strengt binde utgående trafikk fra denne tjenesten til din offentlige adresse, ellers vil du miste tilkoblingen til de ressursene som er dekket av listen over prefikser mottatt av ruteren.

Hvis du har spørsmål, spør, jeg er klar til å svare.

UPD. Takk skal du ha navion и TerAnYu for parametere for git som tillater å redusere nedlastingsvolumer.

UPD2. Kolleger, det ser ut som jeg gjorde en feil ved å ikke legge til instruksjoner for å sette opp en tunnel mellom VPS og ruteren i artikkelen. Det reiser mange spørsmål ved dette.
Bare i tilfelle, vil jeg merke igjen at før du starter denne veiledningen, har du allerede konfigurert en VPN-tunnel i den retningen du trenger og sjekket funksjonaliteten (for eksempel ved å snu trafikk dit som standard eller statisk). Hvis du ikke har fullført denne fasen ennå, gir det ikke mye mening å følge trinnene i artikkelen. Jeg har ikke min egen tekst om dette ennå, men hvis du googler «oppsett en OpenVPN-server» sammen med navnet på operativsystemet installert på VPS, og «oppretter en OpenVPN-klient» med navnet på ruteren din , vil du mest sannsynlig finne en rekke artikler om dette emnet , inkludert om Habré.

UPD3. Uofferet Jeg skrev en kode som gjør dump.csv til en resulterende fil for fugl med valgfri oppsummering av IP-adresser. Derfor kan delen "Behandle registret for rutingtjenesten" erstattes ved å ringe programmet. https://habr.com/post/354282/#comment_10782712

UPD4. Litt arbeid med feil (jeg la dem ikke til teksten):
1) i stedet systemctl reload fugl det er fornuftig å bruke kommandoen birdc konfigurere.
2) i Mikrotik-ruteren, i stedet for å endre nexthop til IP-en til den andre siden av tunnelen /rutingsfilter add action=accept chain=dynamic-in protocol=bgp comment=»Set nexthop» set-in-nexthop=172.30.1.1 det er fornuftig å spesifisere ruten direkte til tunnelgrensesnittet, uten adresse /rutingsfilter add action=accept chain=dynamic-in protocol=bgp comment=»Set nexthop» set-in-nexthop-direct=<grensesnittnavn>

UPD5. En ny tjeneste har dukket opp https://antifilter.download, hvor du kan hente ferdige lister over IP-adresser. Oppdateres hver halvtime. På klientsiden gjenstår det bare å ramme postene med den tilsvarende "rute... avvise".
Og på dette punktet, sannsynligvis, er det nok å fille bestemoren din og oppdatere artikkelen.

UPD6. En revidert versjon av artikkelen for de som ikke vil finne ut av det, men vil komme i gang - her.

Kilde: www.habr.com

Legg til en kommentar