Opsætning af BGP til at omgå blokering, eller "Hvordan jeg holdt op med at være bange og blev forelsket i RKN"

Nå, okay, om "forelsket" er en overdrivelse. Snarere "kunne sameksistere med".

Som I alle ved, har Roskomnadzor siden den 16. april 2018 blokeret adgangen til ressourcer på netværket med ekstremt brede streger ved at tilføje til det Unified Registry af domænenavne, pointere til sider med websteder på internettet og netværksadresser, der giver dig mulighed for at identificere websteder på internettet, der indeholder oplysninger, hvis spredning er forbudt i Den Russiske Føderation" (i teksten - kun et register) /10 nogle gange. Som følge heraf lider borgerne i Den Russiske Føderation og virksomheder, fordi de har mistet adgangen til de absolut juridiske ressourcer, de har brug for.

Efter at jeg i kommentarerne til en af ​​artiklerne om Habré sagde, at jeg var klar til at hjælpe ofrene med at oprette en bypass-ordning, kontaktede flere personer mig og bad om sådan hjælp. Da alt fungerede for dem, anbefalede en af ​​dem at beskrive teknikken i en artikel. Ved nærmere eftertanke besluttede jeg at bryde min tavshed på siden og forsøge for en gangs skyld at skrive noget mellem et projekt og et opslag på Facebook, dvs. habrapost. Resultatet ligger foran dig.

Ansvarsfraskrivelse

Da det ikke er særlig lovligt at offentliggøre måder at omgå blokering af adgang til oplysninger, der er forbudt på Den Russiske Føderations territorium, vil formålet med denne artikel være at tale om en metode, der giver dig mulighed for at automatisere adgang til ressourcer, der er tilladt på territoriet af Den Russiske Føderation, men på grund af nogens handlinger utilgængelige direkte gennem din udbyder. Og adgang til andre ressourcer, opnået som følge af handlinger fra artiklen, er en uheldig bivirkning og er på ingen måde artiklens formål.

Da jeg primært er netværksarkitekt af profession, er kald og livsvej heller ikke programmering og Linux mine styrker. Derfor kan scripts selvfølgelig skrives bedre, sikkerhedsproblemer i VPS kan bearbejdes dybere mv. Dine forslag vil blive accepteret med taknemmelighed, hvis de er detaljerede nok - jeg vil med glæde tilføje dem til artiklens tekst.

TL; DR

Vi automatiserer adgang til ressourcer gennem din eksisterende tunnel ved hjælp af en kopi af registreringsdatabasen og BGP-protokollen. Målet er at fjerne al trafik adresseret til blokerede ressourcer ind i tunnelen. Minimum forklaring, for det meste trinvise instruktioner.

Hvad skal du bruge til dette

Desværre er dette indlæg ikke for alle. For at bruge denne teknik skal du sammensætte et par elementer:

  1. Du skal have en linux-server et sted uden for blokeringsfeltet. Eller i det mindste ønsket om at starte sådan en server - da det nu koster fra $ 9 / år, og muligvis mindre. Metoden er også velegnet, hvis du har en separat VPN-tunnel, så kan serveren placeres inde i blokfeltet.
  2. Din router skal være smart nok til at kunne
    • enhver VPN-klient du kan lide (jeg foretrækker OpenVPN, men det kan være PPTP, L2TP, GRE+IPSec og enhver anden mulighed, der skaber en tunnelgrænseflade);
    • BGPv4 protokol. Hvilket betyder, at det for SOHO kan være Mikrotik eller en hvilken som helst router med OpenWRT/LEDE/lignende brugerdefineret firmware, der giver dig mulighed for at installere Quagga eller Bird. Brug af en pc-router er heller ikke forbudt. For en virksomhed, se dokumentationen til din grænserouter for BGP-support.
  3. Du bør være fortrolig med Linux-brug og netværksteknologier, herunder BGP. Eller i det mindste ønsker at få den idé. Da jeg ikke er klar til at omfavne uhyrligheden denne gang, bliver du nødt til at studere nogle punkter, som er uforståelige for dig på egen hånd. Men jeg vil selvfølgelig svare på specifikke spørgsmål i kommentarerne, og det er usandsynligt, at jeg er den eneste, der svarer, så spørg gerne.

Hvad bruges i eksemplet

  • Kopi af registeret https://github.com/zapret-info/z-i 
  • VPS - Ubuntu 16.04
  • Ruteservice - fugl 1.6.3   
  • Router - Mikrotik hAP ac
  • Arbejdsmapper - da vi arbejder som rod, vil det meste af alt blive placeret i rodhjemmemappen. Henholdsvis:
    • /root/blacklist - arbejdsmappe med kompileringsscript
    • /root/zi - en kopi af registreringsdatabasen fra github
    • /etc/bird - mappe med standardindstillinger for fugletjenester
  • Vi accepterer 194.165.22.146, ASN 64998 som den eksterne IP-adresse for VPS'en med routingserveren og tunneltermineringspunktet; ekstern IP-adresse på routeren - 81.177.103.94, ASN 64999
  • IP-adresserne inde i tunnelen er henholdsvis 172.30.1.1 og 172.30.1.2.

Opsætning af BGP til at omgå blokering, eller "Hvordan jeg holdt op med at være bange og blev forelsket i RKN"

Selvfølgelig kan du bruge alle andre routere, operativsystemer og softwareprodukter, og justere løsningen, så den passer til deres logik.

Kort fortalt - beslutningens logik

  1. Forberedende handlinger
    1. Få en VPS
    2. Vi hæver tunnelen fra routeren til VPS'en
  2. Indhentning og regelmæssig opdatering af en kopi af registreringsdatabasen
  3. Installation og konfiguration af routingtjenesten
  4. Opret en liste over statiske ruter for routingtjenesten baseret på registreringsdatabasen
  5. Vi kobler routeren til tjenesten og sætter op på at sende al trafik gennem tunnelen.

Den egentlige beslutning

Forberedende handlinger

I det store netværk er der mange tjenester, der leverer VPS til yderst rimelige penge. Indtil videre har jeg fundet og bruge muligheden for $9/år, men selvom du ikke rigtig gider, er der en masse 1E/måned muligheder på hvert hjørne. Spørgsmålet om at vælge en VPS ligger langt uden for rammerne af denne artikel, så hvis noget ikke er klart for nogen om dette, så spørg i kommentarerne.

Hvis du bruger VPS ikke kun til routingtjenesten, men også til at afslutte en tunnel på den, skal du hæve denne tunnel og næsten utvetydigt konfigurere NAT til den. Der er et stort antal instruktioner på netværket for disse handlinger, jeg vil ikke gentage dem her. Hovedkravet til sådan en tunnel er, at den skal skabe et separat interface på din router, der understøtter tunnelen mod VPS. De fleste brugte VPN-teknologier opfylder dette krav - for eksempel er OpenVPN i tun-tilstand fint.

Få en kopi af registreringsdatabasen

Som Jabrayil sagde: "Den, der hindrer os, vil hjælpe os." Da RKN opretter et register over forbudte ressourcer, ville det være synd ikke at bruge dette register til at løse vores problem. Vi modtager en kopi af registreringsdatabasen fra github.

Vi går til din Linux-server, falder ind i konteksten af ​​root'a (sudo su -) og installer git, hvis det ikke allerede er installeret.

apt install git

Gå til din hjemmemappe og træk en kopi af registreringsdatabasen ud.

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

Opsæt en cron-opdatering (jeg har den hvert 20. minut, men du kan vælge ethvert interval, der interesserer dig). For at gøre dette løber vi crontab -e og tilføje følgende linje til det:

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

Vi forbinder en hook, der vil oprette filer til routingtjenesten efter opdatering af registreringsdatabasen. Til dette opretter vi en fil /root/zi/.git/hooks/post-merge med følgende indhold:

#!/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 glem ikke at gøre det eksekverbart

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

Makebgp-scriptet, der refereres til af krogen, vil blive oprettet senere.

Installation og konfiguration af routingtjenesten

Installer fugl. Desværre er den version af fugl, der i øjeblikket er frigivet i Ubuntu-lagrene, sammenlignelig i friskhed med Archeopteryx-fæces, så vi skal først tilføje softwareudviklernes officielle PPA til systemet.

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

Derefter deaktiverer vi straks fugl til IPv6 - i denne installation har vi ikke brug for det.

systemctl stop bird6
systemctl disable bird6

Nedenfor er en minimalistisk konfigurationsfil til fugletjenesten (/etc/bird/bird.conf), hvilket er ganske nok for os (og endnu en gang minder jeg dig om, at ingen forbyder at udvikle og tune ideen, så den passer 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;
}

router-id - router-id, der visuelt ligner en IPv4-adresse, men det er den ikke. I vores tilfælde kan det være et hvilket som helst 32-bit nummer i IPv4-adresseformatet, men det er god praksis at angive IPv4-adressen på din enhed (i dette tilfælde VPS) der.

Protocol direct bestemmer, hvilke grænseflader der fungerer med routingprocessen. Eksemplet giver et par eksempler på navne, du kan tilføje flere. Du kan også blot slette linjen, i hvilket tilfælde serveren lytter på alle tilgængelige grænseflader med en IPv4-adresse.

Protocol static er vores magi, der indlæser lister over præfikser og ip-adresser (som selvfølgelig er /32 præfikser) fra filer til senere annoncering. Hvor disse lister kommer fra vil blive diskuteret nedenfor. Bemærk venligst, at indlæsning af ip-adresser er kommenteret ud som standard, grunden til dette er den store mængde upload. Til sammenligning er der på tidspunktet for artiklens skrivning 78 linjer i listen over præfikser og 85898 i listen over ip-adresser. Jeg anbefaler kraftigt, at du kun starter og fejlretter på listen over præfikser og beslutter, om eller ej for at aktivere ip-indlæsning i fremtiden efter at have eksperimenteret med din router. Ikke hver eneste af dem kan let fordøje 85 tusinde poster i routingtabellen.

protokol bgp sætter faktisk bgp-peering op med din router. ip-adresse er adressen på routerens eksterne grænseflade (eller adressen på tunnelgrænsefladen fra siden af ​​routeren), 64998 og 64999 er numrene på autonome systemer. I dette tilfælde kan de tildeles i form af alle 16-bit-numre, men det er god praksis at bruge AS-numre fra det private område defineret af RFC6996 - 64512-65534 inklusive (der er et 32-bit ASN-format, men i vores tilfælde er dette bestemt overkill). Den beskrevne konfiguration bruger eBGP-peering, hvor de autonome systemnumre for routingtjenesten og routeren skal være forskellige.

Som du kan se, skal tjenesten kende IP-adressen på routeren, så hvis du har en dynamisk eller ikke-routerbar privat (RFC1918) eller delt (RFC6598) adresse, har du ingen mulighed for at hæve peering på den eksterne grænseflade, men tjenesten vil stadig fungere inde i tunnelen.

Det er også ret gennemskueligt, at du kan forsyne flere forskellige routere med ruter fra én tjeneste – dupliker blot indstillingerne for dem ved at kopiere protokol bgp-afsnittet med ændring af naboens IP-adresse. Derfor viser eksemplet indstillingerne for peering uden for tunnelen, som de mest universelle. Det er ikke svært at fjerne dem ind i tunnelen ved at ændre IP-adresserne i indstillingerne i overensstemmelse hermed.

Registry Behandling for Routing Service

Nu skal vi faktisk lave lister over præfikser og ip-adresser, som er nævnt i det foregående trin i protokol statisk. For at gøre dette tager vi registreringsdatabasen og laver de filer, vi har brug for, ud af den med følgende script, der er placeret i /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'

Glem ikke at gøre det eksekverbart

chmod +x /root/blacklist/makebgp

Nu kan du køre det manuelt og observere udseendet af filer i /etc/bird.

Mest sandsynligt virker fugl i øjeblikket ikke for dig, fordi du på det forrige stadium foreslog, at den søgte efter filer, der ikke eksisterede endnu. Derfor starter vi den og kontrollerer, at den starter:

systemctl start bird
birdc show route

Outputtet af den anden kommando skulle vise omkring 80 poster (dette er i øjeblikket, og når du sætter det op, vil alt afhænge af ILV'ens nidkærhed i at blokere netværk) som dette:

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

Team

birdc show protocol

vil vise status for protokollerne i tjenesten. Indtil du konfigurerer routeren (se næste afsnit), vil OurRouter-protokollen være i starttilstanden (Connect eller Active phases), og efter en vellykket forbindelse vil den gå i op-tilstand (etableret fase). For eksempel på mit system ser outputtet af denne kommando sådan ud:

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

Tilslutning af en router

Alle er sikkert allerede trætte af at læse denne fodklæde, men tag mod – enden er nær. Desuden vil jeg i dette afsnit ikke være i stand til at give trin-for-trin instruktioner - det vil være forskelligt for hver producent.

Jeg kan dog vise dig et par eksempler. Hovedlogikken er at hæve BGP-peering og vedhæfte nexthop til alle modtagne præfikser, der peger på vores tunnel (hvis du skal udsende trafik gennem p2p-grænsefladen) eller nexthop ip-adresse, hvis trafikken går 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 - sådan her

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

I tilfælde af at den samme tunnel bruges både til BGP-peering og til at sende nyttig trafik, er det ikke nødvendigt at indstille nexthop, det vil blive indstillet korrekt ved hjælp af protokollen. Men hvis du indstiller det manuelt, bliver det heller ikke værre.

På andre platforme skal du selv finde ud af konfigurationen, men hvis du har problemer, så skriv i kommentarerne, jeg vil prøve at hjælpe.

Efter din BGP-session er steget, ruter til store netværk er ankommet og er installeret i tabellen, trafikken til adresserne fra dem er forsvundet, og lykken er tæt på, kan du vende tilbage til fugleservicen og prøve at fjerne kommentaren til posten der, der forbinder liste over ip-adresser, kør derefter

systemctl reload bird

og se, hvordan din router overførte disse 85 tusinde ruter. Gør dig klar til at slukke den og tænk over, hvad du skal gøre med den 🙂

I alt

Rent teoretisk, efter at have udført ovenstående trin, har du en tjeneste, der automatisk omdirigerer trafik til IP-adresser, der er forbudt i Den Russiske Føderation, forbi filtreringssystemet.

Det kan selvfølgelig forbedres. For eksempel er det nemt nok at opsummere en liste over ip-adresser gennem perl- eller python-løsninger. Et simpelt perl-script, der gør dette med Net::CIDR::Lite, forvandler 85 præfikser til 60 (ikke tusinde), men dækker naturligvis et meget større område af adresser, end der er blokeret.

Da tjenesten opererer på det tredje niveau af ISO / OSI-modellen, vil den ikke redde dig fra blokering af websted/side, hvis den ikke løses til den adresse, der er registreret i registreringsdatabasen. Men sammen med registreringsdatabasen fra github kommer filen nxdomain.txt, som med et par strøg af scriptet nemt bliver til en adressekilde til eksempelvis SwitchyOmega-pluginnet i Chrome.

Det skal også nævnes, at løsningen kræver yderligere skærpelse, hvis du ikke blot er internetbruger, men også udgiver nogle ressourcer fra dig selv (eksempelvis kører en hjemmeside eller mailserver på denne forbindelse). Ved hjælp af routeren skal du hårdt binde udgående trafik fra denne tjeneste til din offentlige adresse, ellers vil du miste forbindelsen til de ressourcer, der er dækket af listen over præfikser modtaget af routeren.

Hvis du har spørgsmål - spørg, klar til at svare.

UPD. tak skal du have navion и TerAnYu for muligheder for git for at reducere downloadvolumen.

UPD2. Kolleger, det ser ud til, at jeg lavede en fejl ved ikke at tilføje instruktioner til opsætning af en tunnel mellem VPS'en og routeren til artiklen. Mange spørgsmål er forårsaget af dette.
For en sikkerheds skyld, bemærker jeg igen - det antages, at før du starter trinene i denne vejledning, har du allerede konfigureret VPN-tunnelen i den retning, du har brug for, og kontrolleret dens ydeevne (for eksempel indpakning af trafik der som standard eller statisk). Hvis du ikke har gennemført denne fase endnu, giver det ikke rigtig mening at følge trinene fra artiklen. Jeg har ikke min egen tekst om dette endnu, men hvis du googler "OpenVPN server setup" sammen med navnet på operativsystemet installeret på VPS'en og "OpenVPN client setup" med navnet på din router, vil du højst sandsynligt vil finde en række artikler om dette emne, blandt andet om Habré.

UPD3. Uopofret skrev en kode, der laver den resulterende fil for bird fra dump.csv med valgfri summering af ip-adresser. Derfor kan sektionen "Registry-behandling for routingtjenesten" erstattes med et kald til dets program. https://habr.com/post/354282/#comment_10782712

UPD4. Lidt arbejde med fejlene (bidrog ikke i teksten):
1) i stedet for systemctl genindlæs fugl det giver mening at bruge kommandoen birdc konfigurere.
2) i Mikrotik-routeren, i stedet for at ændre næste-hop til IP-adressen på den anden side af tunnelen /routing filter add action=accepter kæde=dynamic-in protocol=bgp comment="Set nexthop" set-in-nexthop=172.30.1.1 det giver mening at angive ruten direkte til tunnelgrænsefladen uden adressen /routing filter add action=accepter kæde=dynamic-in protocol=bgp comment="Set nexthop" set-in-nexthop-direct=<interfacenavn>

UPD5. En ny service er kommet https://antifilter.download, hvorfra du kan tage færdige lister over ip-adresser. Opdateres hver halve time. På klientsiden er der kun tilbage at indramme posterne med den tilsvarende "rute ... afvise".
Og det er nok nok til at sjaske min bedstemor og opdatere artiklen.

UPD6. En revideret version af artiklen for dem, der ikke vil forstå, men vil starte - her.

Kilde: www.habr.com

Tilføj en kommentar