BGP instellen om blokkering te omzeilen, of "Hoe ik niet meer bang was en verliefd werd op RKN"

Nou ja, oké, over 'verliefd worden' is overdreven. Liever "zou naast elkaar kunnen bestaan".

Zoals jullie allemaal weten blokkeert Roskomnadzor sinds 16 april 2018 de toegang tot bronnen op het netwerk met zeer brede lijnen, door toevoeging van het Unified Registry van domeinnamen, verwijzingen naar pagina's van sites op internet en netwerkadressen waarmee u sites op internet identificeren die informatie bevatten waarvan de verspreiding verboden is in de Russische Federatie” (in de tekst - slechts een register) /10 soms. Als gevolg hiervan lijden de burgers van de Russische Federatie en het bedrijfsleven, omdat ze de toegang zijn kwijtgeraakt tot de volledig legale middelen die ze nodig hebben.

Nadat ik in de commentaren op een van de artikelen over Habré had gezegd dat ik bereid was de slachtoffers te helpen met het opzetten van een bypass-regeling, namen verschillende mensen contact met mij op met het verzoek om dergelijke hulp. Toen alles voor hen werkte, raadde een van hen aan om de techniek in een artikel te beschrijven. Bij nader inzien besloot ik mijn stilte op de site te verbreken en een keer te proberen iets te schrijven dat het midden houdt tussen een project en een bericht op Facebook, d.w.z. habrapost. Het resultaat ligt voor je.

Disclaimer

Omdat het niet erg legaal is om manieren te publiceren om de blokkering van toegang tot informatie die verboden is op het grondgebied van de Russische Federatie te omzeilen, is het doel van dit artikel om te praten over een methode waarmee u de toegang kunt automatiseren tot bronnen die op het grondgebied zijn toegestaan. van de Russische Federatie, maar door iemands handelen niet rechtstreeks via uw provider bereikbaar. En toegang tot andere bronnen, verkregen als gevolg van acties uit het artikel, is een ongelukkig neveneffect en is geenszins het doel van het artikel.

Omdat ik in de eerste plaats een netwerkarchitect ben van beroep, roeping en levenspad, zijn programmeren en Linux niet mijn sterke punten. Daarom kunnen scripts uiteraard beter worden geschreven, kunnen beveiligingsproblemen in VPS dieper worden uitgewerkt, enz. Uw suggesties zullen met dankbaarheid worden aanvaard, als ze voldoende gedetailleerd zijn. Ik zal ze graag aan de tekst van het artikel toevoegen.

TL; DR

We automatiseren de toegang tot bronnen via uw bestaande tunnel met behulp van een kopie van het register en het BGP-protocol. Het doel is om al het verkeer dat naar geblokkeerde bronnen is geadresseerd, naar de tunnel te verwijderen. Minimale uitleg, meestal stap voor stap instructies.

Wat heb je hiervoor nodig?

Helaas is dit bericht niet voor iedereen. Om deze techniek te gebruiken, moet je verschillende elementen samenvoegen:

  1. Je moet ergens buiten het blokkeerveld een Linux-server hebben. Of op zijn minst de wens om zo'n server te hebben - gelukkig kost deze nu vanaf $ 9/jaar, en mogelijk minder. De methode is ook geschikt als je een aparte VPN-tunnel hebt, dan kan de server zich binnen het blokkeerveld bevinden.
  2. Uw router moet slim genoeg zijn om dit te kunnen
    • elke VPN-client die je leuk vindt (ik geef de voorkeur aan OpenVPN, maar het kan PPTP, L2TP, GRE+IPSec en elke andere optie zijn die een tunnelinterface creëert);
    • BGPv4-protocol. Dat betekent dat het voor SOHO Mikrotik kan zijn of een router met OpenWRT/LEDE/soortgelijke aangepaste firmware waarmee je Quagga of Bird kunt installeren. Ook het gebruik van een pc-router is niet verboden. Voor een onderneming raadpleegt u de documentatie bij uw borderrouter voor BGP-ondersteuning.
  3. U moet bekend zijn met Linux-gebruik en netwerktechnologieën, inclusief BGP. Of in ieder geval dat idee willen krijgen. Omdat ik deze keer niet klaar ben om de onmetelijkheid te omarmen, zul je enkele punten moeten bestuderen die voor jou onbegrijpelijk zijn. Ik zal uiteraard specifieke vragen in de reacties beantwoorden en het is onwaarschijnlijk dat ik de enige ben die antwoordt, dus stel ze gerust.

Wat wordt in het voorbeeld gebruikt

  • Kopie van het register https://github.com/zapret-info/z-i 
  • VPS - Ubuntu 16.04
  • Routeringsservice - vogel 1.6.3   
  • Router - Mikrotik hAP ac
  • Werkmappen - aangezien we als root werken, wordt het meeste van alles in de hoofdmap geplaatst. Respectievelijk:
    • /root/blacklist - werkmap met compilatiescript
    • /root/zi - een kopie van het register van github
    • /etc/bird - standaard map met vogelservice-instellingen
  • Wij accepteren 194.165.22.146, ASN 64998 als het externe IP-adres van de VPS met de routeringsserver en het tunneleindpunt; extern IP-adres van de router - 81.177.103.94, ASN 64999
  • De IP-adressen in de tunnel zijn respectievelijk 172.30.1.1 en 172.30.1.2.

BGP instellen om blokkering te omzeilen, of "Hoe ik niet meer bang was en verliefd werd op RKN"

Uiteraard kunt u andere routers, besturingssystemen en softwareproducten gebruiken en de oplossing aanpassen aan hun logica.

In het kort: de logica van de oplossing

  1. Voorbereidende acties
    1. Een VPS verkrijgen
    2. We verhogen de tunnel van de router naar de VPS
  2. Wij ontvangen een kopie van het register en werken deze regelmatig bij
  3. De routeringsservice installeren en configureren
  4. Maak een lijst met statische routes voor de routeringsservice op basis van het register
  5. We verbinden de router met de dienst en configureren het verzenden van al het verkeer door de tunnel.

Het eigenlijke besluit

Voorbereidende acties

In de uitgestrektheid van het netwerk zijn er veel diensten die VPS bieden voor uiterst redelijk geld. Tot nu toe heb ik de optie van $ 9/jaar gevonden en gebruikt, maar zelfs als je er niet echt moeite mee hebt, zijn er op elke hoek veel opties voor 1E/maand. De kwestie van het kiezen van een VPS valt ver buiten het bestek van dit artikel, dus als iemand hierover iets niet duidelijk is, vraag het dan in de reacties.

Als je VPS niet alleen gebruikt voor de routeringsservice, maar ook voor het beëindigen van een tunnel erop, moet je deze tunnel verhogen en er bijna ondubbelzinnig NAT voor configureren. Er zijn een groot aantal instructies op het netwerk voor deze acties, ik zal ze hier niet herhalen. De belangrijkste vereiste voor zo’n tunnel is dat er een aparte interface op je router moet komen die de tunnel richting de VPS ondersteunt. De meeste gebruikte VPN-technologieën voldoen aan deze vereiste. OpenVPN in tun-modus is bijvoorbeeld prima.

Een kopie van het register verkrijgen

Zoals Jabrayil zei: "Hij die ons hindert, zal ons helpen." Omdat de RKN een register van verboden bronnen aanmaakt, zou het zonde zijn om dit register niet te gebruiken om ons probleem op te lossen. We ontvangen een kopie van het register van github.

We gaan naar je Linux-server, vallen in de context van root'a (sudo su-) en installeer git als dit nog niet is geïnstalleerd.

apt install git

Ga naar uw thuismap en haal een kopie van het register tevoorschijn.

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

We hebben een cron-update opgezet (ik doe het eens in de 20 minuten, maar je kunt elk interval kiezen dat je interesseert). Om dit te doen lanceren we crontab -e en voeg daar de volgende regel aan toe:

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

We verbinden een hook die bestanden voor de routeringsservice maakt na het updaten van het register. Om dit te doen, maakt u een bestand aan /root/zi/.git/hooks/post-merge met de 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 vergeet niet om het uitvoerbaar te maken

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

We zullen het makebgp-script waarnaar de hook verwijst iets later maken.

De routeringsservice installeren en configureren

Vogel installeren. Helaas is de versie van bird die momenteel in de Ubuntu-repository's wordt uitgebracht qua versheid vergelijkbaar met de uitwerpselen van Archaeopteryx, dus we moeten eerst de officiële PPA van de softwareontwikkelaars aan het systeem toevoegen.

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

Daarna schakelen we Bird voor IPv6 onmiddellijk uit - in deze installatie hebben we het niet nodig.

systemctl stop bird6
systemctl disable bird6

Hieronder vindt u een minimalistisch configuratiebestand voor vogelservices (/etc/bird/bird.conf), wat voor ons voldoende is (en ik herinner u er nogmaals aan dat niemand verbiedt om het idee te ontwikkelen en af ​​te stemmen op uw eigen behoeften)

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, ziet er visueel uit als een IPv4-adres, maar is dat niet. In ons geval kan dit elk 32-bits nummer in het IPv4-adresformaat zijn, maar het is een goede gewoonte om daar het IPv4-adres van uw apparaat (in dit geval VPS) op te geven.

protocol direct bepaalt welke interfaces met het routeringsproces zullen werken. Het voorbeeld geeft een paar voorbeelden van namen, u kunt er meer toevoegen. U kunt de lijn ook eenvoudigweg verwijderen. In dat geval luistert de server op alle beschikbare interfaces met een IPv4-adres.

protocol static is onze magie die lijsten met voorvoegsels en IP-adressen (die uiteraard /32 voorvoegsels zijn) uit bestanden laadt voor latere aankondiging. Waar deze lijsten vandaan komen, wordt hieronder besproken. Houd er rekening mee dat het laden van ip-adressen standaard wordt uitgecommentarieerd, de reden hiervoor is de grote hoeveelheid uploads. Ter vergelijking: op het moment dat dit artikel wordt geschreven, staan ​​er 78 regels in de lijst met voorvoegsels en 85898 in de lijst met IP-adressen. Ik raad u ten zeerste aan om alleen te beginnen en debuggen op basis van de lijst met voorvoegsels, en te beslissen of u wel of niet om het laden van IP-adressen in de toekomst mogelijk te maken nadat u met uw router heeft geëxperimenteerd. Niet iedereen kan de 85 vermeldingen in de routeringstabel gemakkelijk verwerken.

protocol bgp stelt in feite bgp-peering in met uw router. Het IP-adres is het adres van de externe interface van de router (of het adres van de tunnelinterface aan de routerzijde), 64998 en 64999 zijn de nummers van autonome systemen. In dit geval kunnen ze worden toegewezen in de vorm van elk 16-bits nummer, maar het is een goede gewoonte om AS-nummers te gebruiken uit het privébereik gedefinieerd door RFC6996 - 64512-65534 (er is een formaat voor 32-bits ASN's, maar in ons geval is dit absoluut overdreven). De beschreven configuratie maakt gebruik van eBGP-peering, waarbij de nummers van de autonome systemen van de routeringsdienst en de router verschillend moeten zijn.

Zoals u kunt zien, moet de service het IP-adres van de router kennen, dus als u een dynamisch of niet-routeerbaar privé-adres (RFC1918) of gedeeld adres (RFC6598) heeft, heeft u geen optie om peering op de externe interface te verhogen. maar de dienst zal nog steeds in de tunnel werken.

Het is ook heel transparant dat je verschillende routers kunt voorzien van routes van één dienst - dupliceer gewoon de instellingen ervoor door de bgp-sectie van het protocol te kopiëren en het IP-adres van de buurman te wijzigen. Daarom toont het voorbeeld de instellingen voor peering buiten de tunnel als de meest universele. Het is niet moeilijk om ze in de tunnel te verwijderen door de IP-adressen in de instellingen dienovereenkomstig te wijzigen.

Het register voor de routeringsservice verwerken

Nu moeten we in feite lijsten met voorvoegsels en IP-adressen maken, die in de vorige fase in de statische protocollen werden vermeld. Om dit te doen, nemen we het registerbestand en maken we er de bestanden van die we nodig hebben met behulp van het volgende script, geplaatst in /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'

Vergeet niet om het uitvoerbaar te maken

chmod +x /root/blacklist/makebgp

Nu kunt u het handmatig uitvoeren en de weergave van bestanden in /etc/bird bekijken.

Hoogstwaarschijnlijk werkt Bird op dit moment niet voor u, omdat u in de vorige fase suggereerde dat het zou zoeken naar bestanden die nog niet bestonden. Daarom lanceren we het en controleren we of het start:

systemctl start bird
birdc show route

De uitvoer van het tweede commando zou ongeveer 80 records moeten tonen (dit is voor nu, maar als je het instelt, zal alles afhangen van de ijver van de RKN bij het blokkeren van netwerken), ongeveer als volgt:

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

Team

birdc show protocol

toont de status van de protocollen binnen de service. Totdat u de router configureert (zie de volgende paragraaf), bevindt het OurRouter-protocol zich in de startstatus (Connect- of Active-fasen) en na een succesvolle verbinding gaat het naar de up-status (Established-fase). Op mijn systeem ziet de uitvoer van deze opdracht er bijvoorbeeld als volgt uit:

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

Een router aansluiten

Iedereen is waarschijnlijk al moe van het lezen van dit voetdoek, maar wees gerust: het einde is nabij. Bovendien kan ik in deze sectie geen stapsgewijze instructies geven - het zal voor elke fabrikant anders zijn.

Ik kan u echter wel een paar voorbeelden laten zien. De belangrijkste logica is om de BGP-peering te verhogen en nexthop aan alle ontvangen voorvoegsels te koppelen, verwijzend naar onze tunnel (als je verkeer via de p2p-interface moet uitvoeren) of naar het nexthop IP-adres als het verkeer naar ethernet gaat).

Op Mikrotik in RouterOS is dit bijvoorbeeld als volgt opgelost

/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 - zoals dit

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 het geval dat dezelfde tunnel wordt gebruikt voor zowel BGP-peering als voor het verzenden van nuttig verkeer, is het niet nodig om nexthop in te stellen; deze wordt correct ingesteld door middel van het protocol. Maar als je het handmatig instelt, wordt het ook niet erger.

Op andere platforms moet je de configuratie zelf uitzoeken, maar als je problemen ondervindt, schrijf dan in de reacties, ik zal proberen te helpen.

Nadat uw BGP-sessie is gestegen, routes naar grote netwerken zijn gearriveerd en in de tabel zijn geïnstalleerd, het verkeer naar de adressen van hen is verdwenen en het geluk dichtbij is, kunt u terugkeren naar de vogeldienst en proberen de vermelding daar die de verbinding met elkaar verbindt, te verwijderen lijst met IP-adressen, daarna uitvoeren

systemctl reload bird

en kijk hoe uw router deze 85 routes heeft overgedragen. Maak je klaar om het uit te zetten en bedenk wat je ermee gaat doen 🙂

In totaal

Puur theoretisch beschikt u na het uitvoeren van de bovenstaande stappen over een service die verkeer automatisch omleidt naar IP-adressen die in de Russische Federatie verboden zijn, voorbij het filtersysteem.

Het kan uiteraard verbeterd worden. Het is bijvoorbeeld vrij eenvoudig om een ​​lijst met IP-adressen samen te vatten met behulp van perl- of python-oplossingen. Een eenvoudig Perl-script dat dit doet met behulp van Net::CIDR::Lite, verandert 85 voorvoegsels in 60 (niet duizend), maar bestrijkt uiteraard een veel groter bereik aan adressen dan wordt geblokkeerd.

Omdat de service op het derde niveau van het ISO/OSI-model werkt, zal het u niet behoeden voor het blokkeren van een site/pagina als deze wordt omgezet naar het verkeerde adres zoals vastgelegd in het register. Maar samen met de registratie komt het bestand nxdomain.txt uit github, dat met een paar slagen van het script gemakkelijk verandert in een adressenbron voor bijvoorbeeld de SwitchyOmega-plug-in in Chrome.

Er moet ook worden vermeld dat de oplossing extra verscherping vereist als u niet alleen een internetgebruiker bent, maar ook enkele bronnen van uzelf publiceert (op deze verbinding draait bijvoorbeeld een website of mailserver). Door middel van de router moet u uitgaand verkeer van deze dienst hard binden aan uw openbare adres, anders verliest u de connectiviteit met de bronnen die vallen onder de lijst met voorvoegsels die door de router worden ontvangen.

Als je vragen hebt, stel ze dan, klaar om te antwoorden.

UPD. Bedankt marine и TerAnYu voor parameters voor git die het verminderen van downloadvolumes mogelijk maken.

UPD2. Collega's, het lijkt erop dat ik een fout heb gemaakt door geen instructies voor het opzetten van een tunnel tussen de VPS en de router aan het artikel toe te voegen. Hierdoor worden veel vragen gesteld.
Voor het geval dat ik nogmaals opmerk dat voordat u aan deze handleiding begint, u al een VPN-tunnel in de gewenste richting hebt geconfigureerd en de functionaliteit ervan hebt gecontroleerd (bijvoorbeeld door verkeer daar standaard of statisch naartoe te leiden). Als je deze fase nog niet hebt afgerond, heeft het niet veel zin om de stappen in het artikel te volgen. Ik heb hier nog geen eigen tekst over, maar als je googlet op “het opzetten van een OpenVPN-server” samen met de naam van het besturingssysteem dat op de VPS is geïnstalleerd, en “het opzetten van een OpenVPN-client” met de naam van je router , zul je waarschijnlijk een aantal artikelen over dit onderwerp vinden, ook op Habré.

UPD3. Onopgeofferd schreef een code die het resulterende bestand voor bird uit dump.csv maakt met optionele optelling van IP-adressen. Daarom kan de sectie "Registerverwerking voor de routeringsservice" worden vervangen door een oproep naar het programma ervan. https://habr.com/post/354282/#comment_10782712

UPD4. Een beetje werk aan de fouten (heeft niet bijgedragen aan de tekst):
1) in plaats daarvan systemctl herlaadvogel het is logisch om het commando te gebruiken birdc configureren.
2) in de Mikrotik-router, in plaats van de volgende hop te veranderen naar het IP-adres van de tweede kant van de tunnel /routeringsfilter actie toevoegen=accepteer keten=dynamisch-in protocol=bgp comment="Set nexthop" set-in-nexthop=172.30.1.1 het is zinvol om de route rechtstreeks naar de tunnelinterface op te geven, zonder het adres /routing filter add action=accept chain=dynamic-in protocol=bgp comment="Set nexthop" set-in-nexthop-direct=<interfacenaam>

UPD5. Er is een nieuwe dienst verschenen https://antifilter.download, waaruit u kant-en-klare lijsten met IP-adressen kunt halen. Ieder half uur bijgewerkt. Aan de clientzijde hoeft u alleen nog maar de vermeldingen te framen met de bijbehorende “route ... afkeuren”.
En dat is waarschijnlijk genoeg om mijn grootmoeder te neuken en het artikel bij te werken.

UPD6. Een herziene versie van het artikel voor degenen die het niet willen begrijpen, maar wel willen beginnen - hier.

Bron: www.habr.com

Voeg een reactie