ProHoster > blog > administratie > BGP instellen om blokkering te omzeilen, of "Hoe ik niet meer bang was en verliefd werd op RKN"
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:
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.
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.
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.
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.
Uiteraard kunt u andere routers, besturingssystemen en softwareproducten gebruiken en de oplossing aanpassen aan hun logica.
In het kort: de logica van de oplossing
Voorbereidende acties
Een VPS verkrijgen
We verhogen de tunnel van de router naar de VPS
Wij ontvangen een kopie van het register en werken deze regelmatig bij
De routeringsservice installeren en configureren
Maak een lijst met statische routes voor de routeringsservice op basis van het register
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:
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.
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
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:
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
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.