BGP opsetzen fir d'Blockéierung z'iwwergoen, oder "Wéi ech opgehalen hunn Angscht ze hunn a verléift mat RKN gefall sinn"

Gutt, okay, iwwer "gär" ass eng iwwerdreiwen. Éischter, "konnt zesumme existéieren mat."

Wéi Dir all wësst, zënter dem 16. Abrëll 2018, blockéiert Roskomnadzor den Zougang zu Ressourcen um Internet an extrem breede Schlag, a bäigefüügt zum "Vereenegt Register vun Domainnamen, Säitindexe vu Siten um Internet an Netzwierkadressen, déi Siten z'identifizéieren erlaben. um Internet," mat Informatiounen, d'Verdeelung vun deenen an der russescher Federatioun verbueden ass" (am Text - just e Register) vun /10 heiansdo. Als Resultat leiden d'Bierger vun der russescher Federatioun a Geschäfter, déi Zougang zu de komplett legale Ressourcen verluer hunn, déi se brauchen.

Nodeems ech an de Kommentaren zu engem vun den Artikelen op Habré gesot hunn, datt ech bereet wier den Affer mat engem Contournement opzebauen ze hëllefen, sinn e puer Leit bei mech komm fir esou Hëllef ze froen. Wann alles fir si geschafft huet, huet ee vun hinnen recommandéiert d'Technik an engem Artikel ze beschreiwen. No e bëssen Iwwerleeung hunn ech decidéiert meng Rou um Site ze briechen a probéieren eng Kéier eppes Tëschenzäit tëscht engem Projet an engem Facebook Post ze schreiwen, d.h. habrapost. D'Resultat ass virun Iech.

Verzichterklärung

Well et net ganz legal ass Weeër ze verëffentlechen fir d'Blockéierung vun Zougang zu Informatioun verbueden um Territoire vun der russescher Federatioun ze verëffentlechen, ass den Zweck vun dësem Artikel iwwer eng Method ze schwätzen déi Iech erlaabt den Zougang zu Ressourcen ze automatiséieren déi erlaabt sinn op der Territoire vun der russescher Federatioun, mä wéinst engem aneren seng Aktiounen sinn net direkt zougänglech duerch Är Provider. An Zougang zu anere Ressourcen, déi als Resultat vun Aktiounen aus dem Artikel kritt goufen, ass eng onglécklech Nebenwirkung an ass op kee Fall den Zweck vum Artikel.

Och, well ech virun allem en Netzwierkarchitekt vu Beruff sinn, Beruff a Liewenswee, Programméiere a Linux sinn net meng Stäerkten. Dofir kënne selbstverständlech Scripte besser geschriwwe ginn, Sécherheetsprobleemer am VPS kënne méi déif ausgeschafft ginn, etc. Är Suggestioune ginn mat Dankbarkeet ugeholl, wa se genuch detailléiert sinn - ech wäerte frou se an den Text vum Artikel ze addéieren.

TL; DR

Mir automatiséieren Zougang zu Ressourcen duerch Ären existenten Tunnel mat enger Kopie vum Registry an dem BGP Protokoll. D'Zil ass all Traffic ze läschen, déi un blockéiert Ressourcen an den Tunnel adresséiert ass. Minimum Erklärungen, meeschtens Schrëtt-fir-Schrëtt Instruktioune.

Wat brauch Dir dofir?

Leider ass dëse Post net fir jiddereen. Fir dës Technik ze benotzen, musst Dir e puer Elementer zesummesetzen:

  1. Dir musst e Linux Server iergendwou ausserhalb vum Spärfeld hunn. Oder op d'mannst de Wonsch esou e Server ze hunn - glécklecherweis kascht et elo vun $ 9 / Joer, a méiglecherweis manner. D'Method ass och gëeegent wann Dir e separaten VPN-Tunnel hutt, da kann de Server am Blockéierungsfeld sinn.
  2. Äre Router sollt intelligent genuch sinn fir ze kënnen
    • all VPN Client deen Dir gär hutt (ech léiwer OpenVPN, awer et kann PPTP, L2TP, GRE + IPSec oder all aner Optioun sinn, déi en Tunnelinterface erstellt);
    • BGPv4 Protokoll. Wat heescht datt et fir SOHO Mikrotik oder all Router mat OpenWRT / LEDE / ähnlech personaliséiert Firmware kéint sinn, déi Iech erlaabt Quagga oder Bird z'installéieren. D'Benotzung vun engem PC Router ass och net verbueden. Am Fall vun enger Entreprise, kuckt no BGP Support an der Dokumentatioun fir Äre Grenzrouter.
  3. Dir sollt e Verständnis vu Linux Benotzung an Netzwierktechnologien hunn, dorënner de BGP Protokoll. Oder op d'mannst wëllt esou eng Iddi kréien. Well ech net bereet sinn d'Immensitéit dës Kéier ëmzegoen, musst Dir e puer Aspekter studéieren déi Iech selwer onverständlech sinn. Wéi och ëmmer, ech wäerte selbstverständlech spezifesch Froen an de Kommentaren beäntweren an ech sinn onwahrscheinlech deen eenzegen ze äntweren, also zéckt net ze froen.

Wat gëtt am Beispill benotzt

  • Eng Kopie vum Register - vun https://github.com/zapret-info/z-i 
  • VPS - Ubuntu 16.04
  • Routing Service - vogel 1.6.3   
  • Router - Mikrotik hAP ac
  • Aarbechtsdateien - well mir als Root schaffen, wäert dat meescht vun allem am Heem Dossier vun der Root sinn. Respektiv:
    • /root/blacklist - Aarbechtsdatei mam Kompiléierungsskript
    • /root/zi - Kopie vum Registry vu github
    • /etc/bird - Standard Dossier fir Vugel Service Astellungen
  • Déi extern IP Adress vum VPS mam Routing Server an dem Tunnelterminatiounspunkt ass 194.165.22.146, ASN 64998; extern IP Adress vum Router - 81.177.103.94, ASN 64999
  • D'IP Adressen am Tunnel sinn 172.30.1.1 respektiv 172.30.1.2.

BGP opsetzen fir d'Blockéierung z'iwwergoen, oder "Wéi ech opgehalen hunn Angscht ze hunn a verléift mat RKN gefall sinn"

Natierlech kënnt Dir all aner Router, Betribssystemer a Softwareprodukter benotzen, d'Léisung un hir Logik upassen.

Kuerz gesot - d'Logik vun der Léisung

  1. Virbereedungsaktivitéiten
    1. Kritt e VPS
    2. En Tunnel vum Router op de VPS erhéijen
  2. Mir kréien a regelméisseg eng Kopie vum Registry update
  3. Installatioun a Konfiguratioun vum Routing-Service
  4. Mir erstellen eng Lëscht vu statesche Strecken fir de Routing-Service baséiert op der Registry
  5. Mir verbannen de Router mam Service a konfiguréieren all Traffic duerch den Tunnel ze schécken.

Déi eigentlech Léisung

Virbereedungsaktivitéiten

Et gi vill Servicer um Internet déi VPS fir extrem raisonnabel Präisser ubidden. Bis elo hunn ech fonnt a benotzen d'Optioun fir $ 9 / Joer, awer och wann Dir Iech net ze vill stéiert, et gi vill Méiglechkeeten fir 1E / Mount op all Eck. D'Fro fir e VPS ze wielen läit wäit iwwer den Ëmfang vun dësem Artikel, also wann een net eppes iwwer dëst versteet, frot an de Kommentaren.

Wann Dir e VPS net nëmme fir de Routing-Service benotzt, awer och fir en Tunnel drop ofzeschléissen, musst Dir dësen Tunnel erhéijen a bal sécher NAT dofir konfiguréieren. Et gi vill Instruktiounen iwwer dës Aktiounen um Internet, ech wäert se net hei widderhuelen. D'Haaptfuerderung fir sou en Tunnel ass datt et eng separat Interface op Ärem Router erstellen muss, deen den Tunnel Richtung VPS ënnerstëtzt. Déi meescht benotzt VPN Technologien erfëllen dës Ufuerderung - zum Beispill, OpenVPN am Tun Modus ass perfekt.

Kritt eng Kopie vum Registry

Wéi de Jabrail gesot huet: "Deen, deen eis verhënnert, hëlleft eis." Well de RKN e Register vu verbuedenen Ressourcen opstellt, wier et Sënn, dëst Register net ze benotzen fir eise Problem ze léisen. Mir kréien eng Kopie vum Registry vu github.

Mir ginn op Äre Linux Server, falen an de Root Kontext (sudo su -) an installéiert git wann et net schonn installéiert ass.

apt install git

Gitt an Ärem Heemverzeichnis an zitt eng Kopie vum Registry eraus.

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

Mir setzen e Cron Update (ech maachen et eemol all 20 Minutten, awer Dir kënnt all Intervall wielen deen Iech interesséiert). Fir dëst ze maachen, lancéiere mir crontab -e a füügt déi folgend Zeil derbäi:

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

Mir verbannen en Hook deen Dateien fir de Routingservice erstellt nodeems de Registry aktualiséiert gëtt. Fir dëst ze maachen, erstellt eng Datei /root/zi/.git/hooks/post-merge mat folgendem Inhalt:

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

an vergiesst net et ausféierbar ze maachen

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

Mir erstellen de Makebgp Skript op deen den Hook e bësse méi spéit bezitt.

Installatioun an Konfiguratioun vun engem Routing Service

Installéieren Vugel. Leider ass d'Versioun vum Vugel, déi de Moment an den Ubuntu Repositories gepost gëtt, vergläichbar a Frëschheet mat Archeopteryx Feeën, also musse mir als éischt den offiziellen PPA vun de Software Entwéckler op de System derbäi.

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

Duerno deaktivéiere mir Vugel fir IPv6 direkt - mir brauche se net an dëser Installatioun.

systemctl stop bird6
systemctl disable bird6

Drënner ass eng minimalistesch Vogelservice Konfiguratiounsdatei (/etc/bird/bird.conf), wat fir eis zimmlech genuch ass (an ech erënneren Iech nach eng Kéier drun, datt kee verbitt d'Iddi z'entwéckelen an unzepassen fir Ären eegene Besoinen ze passen)

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 Identifizéierer, déi visuell ausgesäit wéi eng IPv4 Adress, awer net eng. An eisem Fall kann et all 32-Bit Zuel am IPv4 Adressformat sinn, awer et ass eng gutt Form fir genau d'IPv4 Adress vun Ärem Apparat unzeginn (an dësem Fall VPS).

Protokoll direkt definéiert wéi eng Interfaces mam Routingprozess funktionnéieren. D'Beispill gëtt e puer Beispiller Nimm, Dir kënnt anerer derbäisetzen. Dir kënnt d'Linn einfach läschen; an dësem Fall lauschtert de Server all verfügbare Interfaces mat enger IPv4 Adress.

Protokoll statesch ass eis Magie déi Lëschte vu Präfixen an IP Adressen lued (déi tatsächlech /32 Präfixe sinn, natierlech) aus Dateie fir spéider Ukënnegung. Wou dës Lëschte hierkommen, gëtt hei ënnen diskutéiert. Notéiert w.e.g. datt d'IP Adresse vum Luede kommentéiert ginn als Standard, de Grond dofir ass de grousse Volume vum Eroplueden. Zum Verglach, am Moment vum Schreiwen, sinn et 78 Zeilen an der Lëscht vun de Präfixe, an 85898 an der Lëscht vun IP Adressen. d'Zukunft ass un Iech fir ze entscheeden nodeems Dir mat Ärem Router experimentéiert hutt. Net jidderee vun hinnen kann einfach 85 Tausend Entréen an der Routingtabelle verdauen.

Protokoll bgp, tatsächlech, setzt bgp Peering mat Ärem Router op. D'IP Adress ass d'Adress vun der externer Interface vum Router (oder d'Adress vun der Tunnel Interface op der Router Säit), 64998 an 64999 sinn d'Zuelen vun autonome Systemer. An dësem Fall kënne se a Form vun all 16-Bit Zuelen zougewisen ginn, awer et ass gutt Praxis AS Zuelen aus dem private Beräich ze benotzen definéiert vun RFC6996 - 64512-65534 inklusiv (et gëtt e Format fir 32-Bit ASNs, awer an eisem Fall ass dëst definitiv iwwerkill). Déi beschriwwe Konfiguratioun benotzt eBGP Peering, an deem d'Zuelen vun den autonome Systemer vum Routingdéngscht an dem Router anescht musse sinn.

Wéi Dir gesitt, muss de Service d'IP Adress vum Router kennen, also wann Dir eng dynamesch oder net-routabel privat (RFC1918) oder gedeelt (RFC6598) Adress hutt, hutt Dir keng Optioun fir Peering op der externer ze erhéijen Interface, awer de Service funktionnéiert nach ëmmer am Tunnel.

Et ass och ganz kloer datt Dir vun engem Service Router op verschidde Router ubitt - just d'Astellunge fir si duplizéieren andeems Dir de Protokoll bgp Sektioun kopéiert an d'IP Adress vum Noper ännert. Dofir weist d'Beispill Astellunge fir ausserhalb vum Tunnel ze kucken, wéi déi universellst. Et ass einfach se an den Tunnel ze läschen andeems Dir d'IP Adressen an den Astellungen deementspriechend ännert.

Veraarbechtung vum Registry fir de Routing-Service

Elo musse mir, tatsächlech, Lëschte vu Präfixen an IP Adressen erstellen, déi am Protokoll statesch an der viregter Etapp ernimmt goufen. Fir dëst ze maachen, huelen mir d'Registrierungsdatei a maachen d'Fichier'en, déi mir brauchen dovunner mat dem folgenden Skript, gesat /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'

Vergiesst net et ausféierbar ze maachen

chmod +x /root/blacklist/makebgp

Elo kënnt Dir et manuell lafen an d'Erscheinung vu Dateien an /etc/bird beobachten.

Wahrscheinlech funktionnéiert de Vugel de Moment net fir Iech, well Dir an der viregter Etapp gefrot hutt fir Dateien ze sichen déi nach net existéieren. Dofir lancéiere mir et a kontrolléieren ob et ugefaang huet:

systemctl start bird
birdc show route

D'Output vum zweete Kommando soll ongeféier 80 records weisen (dëst ass fir de Moment, awer wann Dir et opstellt, hänkt alles vun der Äiferheet vum RKN an der Blockéierung vun Netzwierker of) eppes wéi dat:

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

Equipe

birdc show protocol

wäert de Status vun de Protokoller am Service weisen. Bis Dir de Router konfiguréiert hutt (kuckt den nächste Punkt), wäert den OurRouter Protokoll am Startzoustand sinn (Connect oder Active Phase), an no enger erfollegräicher Verbindung geet et an den Up State (Etabléiert Phase). Zum Beispill, op mengem System gesäit d'Ausgab vun dësem Kommando esou aus:

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

Router verbannen

Jiddereen ass méiglecherweis midd dëse Foussduch ze liesen, awer huelt Häerz - d'Enn ass no. Ausserdeem, an dëser Rubrik wäert ech net fäeg sinn Schrëtt-fir-Schrëtt Instruktiounen ze ginn - et wäert fir all Hiersteller anescht sinn.

Ech kann Iech awer e puer Beispiller weisen. D'Haaptlogik ass d'BGP Peering z'erhéijen an Nexthop un all kritt Präfixe ze weisen, op eisen Tunnel ze weisen (wa mir Traffic duerch eng p2p Interface schécken mussen) oder d'nexthop IP Adress wann de Verkéier op Ethernet geet).

Zum Beispill, op Mikrotik am RouterOS gëtt dëst wéi follegt geléist

/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

an Cisco IOS - wéi dës

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

Wann dee selwechten Tunnel souwuel fir BGP Peering benotzt gëtt a fir nëtzlech Traffic ze vermëttelen, ass et net néideg Nexthop ze setzen; et gëtt korrekt mat dem Protokoll gesat. Awer wann Dir et manuell setzt, wäert et och net verschlechtert ginn.

Op anere Plattformen musst Dir d'Konfiguratioun selwer erausfannen, awer wann Dir Schwieregkeeten hutt, schreift an de Kommentaren, ech probéieren ze hëllefen.

Nodeems Är BGP Sessioun ugefaang huet, sinn d'Strecken op grouss Netzwierker ukomm a sinn an der Tabell installéiert, de Verkéier ass op d'Adressen vun hinnen gefloss an d'Gléck ass no, Dir kënnt zréck an de Vugelservice a probéieren d'Entrée do ze decommentéieren, déi d'Verbindung verbënnt. Lëscht vun IP Adressen, ausféieren duerno

systemctl reload bird

a kuckt wéi Äre Router dës 85 dausend routes transferéiert huet. Sidd bereet fir auszeschléissen an iwwerdenken wat een domat maache soll :)

Total

Reng theoretesch, nodeems Dir d'Schrëtt uewen beschriwwen ofgeschloss hutt, hutt Dir elo e Service deen den Traffic automatesch op IP Adressen ëmgeleet, déi an der Russescher Federatioun verbannt sinn, laanscht de Filtersystem.

Et kann natierlech verbessert ginn. Zum Beispill ass et ganz einfach eng Lëscht vun IP Adressen mat Perl oder Python Léisungen ze resuméieren. En einfache Perl Skript mécht dëst mat Net :: CIDR :: Lite verwandelt 85 dausend Präfixe an 60 (net dausend), awer deckt natierlech eng vill méi grouss Palette vun Adressen wéi blockéiert ass.

Zënter datt de Service um drëtten Niveau vum ISO / OSI Modell funktionnéiert, wäert et Iech net spueren fir e Site / Säit ze blockéieren wann et op déi falsch Adress léist wéi an der Registry opgeholl. Awer zesumme mam Registry kënnt d'Datei nxdomain.txt vu github, déi mat e puer Schlag vum Skript einfach an eng Quell vun Adressen fir zum Beispill de SwitchyOmega Plugin am Chrome verwandelt.

Et ass och noutwendeg ze ernimmen datt d'Léisung zousätzlech Verfeinerung erfuerdert wann Dir net nëmmen en Internet Benotzer sidd, awer och e puer Ressourcen op Iech selwer verëffentlechen (zum Beispill eng Websäit oder Mailserver leeft op dëser Verbindung). Mat de Mëttele vum Router ass et néideg den ausgaangende Verkéier vun dësem Service op Är ëffentlech Adress strikt ze binden, soss verléiert Dir d'Konnektivitéit mat deene Ressourcen, déi vun der Lëscht vun de Präfixe vum Router ofgedeckt sinn.

Wann Dir Froen hutt, frot, ech si prett ze äntweren.

UPD. Merci navion и TerAnYu fir Parameteren fir git déi d'Downloadvolumen reduzéieren.

UPD 2. Kollegen, et gesäit aus wéi wann ech e Feeler gemaach hunn andeems ech keng Instruktioune fir en Tunnel tëscht dem VPS an dem Router op den Artikel opstellen. Vill Froen ginn doduerch opgeworf.
Just am Fall, wäert ech nach eng Kéier bemierken datt ier Dir dëse Guide ufänkt, Dir hutt schonn e VPN-Tunnel an déi Richtung konfiguréiert déi Dir braucht a seng Funktionalitéit iwwerpréift (zum Beispill andeems Dir de Traffic do par défaut oder statesch dréit). Wann Dir dës Phase nach net ofgeschloss hutt, mécht et net vill Sënn fir d'Schrëtt am Artikel ze verfollegen. Ech hunn nach keen eegenen Text doriwwer, awer wann Dir googlet "en OpenVPN Server opbauen" zesumme mam Numm vum Betribssystem deen op der VPS installéiert ass, an "en OpenVPN Client opbauen" mam Numm vun Ärem Router , Dir wäert héchstwahrscheinlech eng Rei vun Artikelen zu dësem Thema fannen, dorënner op Habré.

UPD 3. Onopfälleg Ech hunn e Code geschriwwen, deen dump.csv an eng resultéierend Datei fir Vugel mat fakultativen Zesummefaassung vun IP Adressen verwandelt. Dofir kann d'Sektioun "Veraarbechtung vum Registry fir de Routing-Service" ersat ginn andeems Dir säi Programm rufft. https://habr.com/post/354282/#comment_10782712

UPD 4. E bëssen Aarbecht op Feeler (ech hunn se net an den Text bäigefüügt):
1) amplaz systemctl reload Vugel et mécht Sënn de Kommando ze benotzen birdc konfiguréieren.
2) am Mikrotik Router, anstatt den Nexthop op d'IP vun der zweeter Säit vum Tunnel z'änneren / Routing Filter add action = akzeptéieren Kette = Dynamic-in Protokoll = bgp Kommentar =»Nexthop setzen» set-in-nexthop=172.30.1.1 et mécht Sënn der Streck direkt un den Tunnel Interface ze uginn, ouni Adress / Routing Filter add action = akzeptéieren Kette = Dynamic-in Protokoll = bgp Comment =»Nexthop setzen» set-in-nexthop-direct=<Interface Numm>

UPD 5. En neie Service ass erschéngt https://antifilter.download, vu wou Dir fäerdeg Lëschte vun IP Adressen ophuelen kënnt. All hallef Stonn aktualiséiert. Op der Clientssäit bleift et just d'Records mat der entspriechender "route ... refuséieren" ze cadreieren.
An zu dësem Zäitpunkt ass et wahrscheinlech genuch fir Är Groussmamm ze réieren an den Artikel ze aktualiséieren.

UPD 6. Eng iwwerschafft Versioun vum Artikel fir déi, déi et net wëllen erausfannen, awer wëllen ufänken - hei.

Source: will.com

Setzt e Commentaire