Einrichten von BGP zur Umgehung der Blockierung oder „Wie ich keine Angst mehr hatte und mich in RKN verliebte“

Nun gut, das Wort „verliebt“ ist übertrieben. Vielmehr „könnte mit koexistieren“.

Wie Sie alle wissen, blockiert Roskomnadzor seit dem 16. April 2018 den Zugriff auf Ressourcen im Netzwerk mit extrem weitreichenden Maßnahmen und fügt dem einheitlichen Register von Domänennamen, Verweisen auf Seiten von Websites im Internet und Netzwerkadressen hinzu, die Ihnen dies ermöglichen Identifizieren Sie Websites im Internet, die Informationen enthalten, deren Verbreitung in der Russischen Föderation verboten ist“ (im Text nur ein Register) /10 manchmal. Darunter leiden die Bürger der Russischen Föderation und die Unternehmen, da ihnen der Zugang zu den völlig legalen Ressourcen, die sie benötigen, verloren geht.

Nachdem ich in den Kommentaren zu einem der Artikel auf Habré gesagt hatte, dass ich bereit sei, den Opfern bei der Einrichtung eines Umgehungssystems zu helfen, kontaktierten mich mehrere Personen mit der Bitte um solche Hilfe. Als bei ihnen alles funktionierte, empfahl einer von ihnen, die Technik in einem Artikel zu beschreiben. Nach einiger Überlegung beschloss ich, mein Schweigen auf der Website zu brechen und einmal zu versuchen, etwas zu schreiben, das zwischen einem Projekt und einem Beitrag auf Facebook liegt, d. h. Habrapost. Das Ergebnis liegt vor Ihnen.

Haftungsausschluss

Da es nicht sehr legal ist, Möglichkeiten zur Umgehung der Blockierung des Zugangs zu auf dem Territorium der Russischen Föderation verbotenen Informationen zu veröffentlichen, besteht der Zweck dieses Artikels darin, über eine Methode zu sprechen, mit der Sie den Zugriff auf auf dem Territorium erlaubte Ressourcen automatisieren können der Russischen Föderation, aber aufgrund der Handlungen einer Person direkt über Ihren Provider nicht zugänglich. Und der Zugriff auf andere Ressourcen, die durch Aktionen aus dem Artikel erlangt werden, ist ein unglücklicher Nebeneffekt und keineswegs der Zweck des Artikels.

Da ich von Beruf, Berufung und Lebensweg in erster Linie Netzwerkarchitekt bin, sind Programmieren und Linux nicht meine Stärken. Dadurch lassen sich natürlich auch Skripte besser schreiben, Sicherheitsthemen im VPS tiefer ausarbeiten usw. Ihre Vorschläge werden, sofern sie ausreichend detailliert sind, mit Dankbarkeit entgegengenommen – ich füge sie gerne in den Text des Artikels ein.

TL; DR

Wir automatisieren den Zugriff auf Ressourcen über Ihren vorhandenen Tunnel mithilfe einer Kopie der Registrierung und des BGP-Protokolls. Das Ziel besteht darin, den gesamten Datenverkehr, der an blockierte Ressourcen gerichtet ist, in den Tunnel zu entfernen. Minimale Erklärung, meist Schritt-für-Schritt-Anleitung.

Was braucht man dafür

Leider ist dieser Beitrag nicht jedermanns Sache. Um diese Technik nutzen zu können, müssen Sie einige Elemente zusammenstellen:

  1. Sie müssen irgendwo außerhalb des Sperrbereichs einen Linux-Server haben. Oder zumindest der Wunsch, einen solchen Server zu starten – da er mittlerweile ab 9 US-Dollar pro Jahr und möglicherweise weniger kostet. Die Methode eignet sich auch, wenn Sie über einen separaten VPN-Tunnel verfügen, dann kann sich der Server innerhalb des Blockfeldes befinden.
  2. Ihr Router muss intelligent genug sein, um dazu in der Lage zu sein
    • ein beliebiger VPN-Client (ich bevorzuge OpenVPN, es kann aber auch PPTP, L2TP, GRE+IPSec und jede andere Option sein, die eine Tunnelschnittstelle erstellt);
    • BGPv4-Protokoll. Das bedeutet, dass es sich für SOHO um Mikrotik oder einen beliebigen Router mit OpenWRT/LEDE/ähnlicher benutzerdefinierter Firmware handeln kann, der die Installation von Quagga oder Bird ermöglicht. Auch die Nutzung eines PC-Routers ist nicht verboten. Informationen zur BGP-Unterstützung für ein Unternehmen finden Sie in der Dokumentation Ihres Grenzrouters.
  3. Sie sollten mit der Linux-Nutzung und den Netzwerktechnologien, einschließlich BGP, vertraut sein. Oder zumindest auf diese Idee kommen wollen. Da ich dieses Mal nicht bereit bin, mich auf die Unermesslichkeit einzulassen, müssen Sie einige Punkte, die für Sie unverständlich sind, selbst studieren. Spezifische Fragen werde ich jedoch natürlich in den Kommentaren beantworten und es ist unwahrscheinlich, dass ich der Einzige bin, der antwortet, also zögern Sie nicht, sie zu stellen.

Was wird im Beispiel verwendet?

  • Kopie des Registers https://github.com/zapret-info/z-i 
  • VPS – Ubuntu 16.04
  • Routing-Service - Vogel 1.6.3   
  • Router - Mikrotik hAP ac
  • Arbeitsordner – da wir als Root arbeiten, wird das meiste alles im Root-Home-Ordner abgelegt. Bzw:
    • /root/blacklist – Arbeitsordner mit Kompilierungsskript
    • /root/zi – eine Kopie der Registrierung von Github
    • /etc/bird – Standardordner für Vogeldiensteinstellungen
  • Wir akzeptieren 194.165.22.146, ASN 64998 als externe IP-Adresse des VPS mit dem Routing-Server und dem Tunnelabschlusspunkt; externe IP-Adresse des Routers - 81.177.103.94, ASN 64999
  • Die IP-Adressen innerhalb des Tunnels lauten 172.30.1.1 bzw. 172.30.1.2.

Einrichten von BGP zur Umgehung der Blockierung oder „Wie ich keine Angst mehr hatte und mich in RKN verliebte“

Selbstverständlich können Sie auch beliebige andere Router, Betriebssysteme und Softwareprodukte verwenden und die Lösung an deren Logik anpassen.

Kurz gesagt - die Logik der Entscheidung

  1. Vorbereitende Maßnahmen
    1. Einen VPS bekommen
    2. Wir bauen den Tunnel vom Router zum VPS auf
  2. Beschaffung und regelmäßige Aktualisierung einer Kopie der Registrierung
  3. Installieren und Konfigurieren des Routing-Dienstes
  4. Erstellen Sie eine Liste statischer Routen für den Routing-Dienst basierend auf der Registrierung
  5. Wir verbinden den Router mit dem Dienst und richten den gesamten Datenverkehr durch den Tunnel ein.

Die eigentliche Entscheidung

Vorbereitende Maßnahmen

In der Weite des Netzwerks gibt es viele Dienste, die VPS zu äußerst günstigen Preisen anbieten. Bisher habe ich die Option für 9 $/Jahr gefunden und genutzt, aber selbst wenn Sie sich nicht wirklich darum kümmern, gibt es an jeder Ecke viele Optionen für 1E/Monat. Die Frage der Auswahl eines VPS geht weit über den Rahmen dieses Artikels hinaus. Wenn also jemandem etwas nicht klar ist, fragen Sie in den Kommentaren nach.

Wenn Sie VPS nicht nur für den Routing-Dienst, sondern auch zum Terminieren eines Tunnels darauf verwenden, müssen Sie diesen Tunnel erhöhen und fast eindeutig NAT dafür konfigurieren. Anleitungen für diese Aktionen gibt es im Netz in Hülle und Fülle, ich werde sie hier nicht wiederholen. Die Hauptvoraussetzung für einen solchen Tunnel besteht darin, dass auf Ihrem Router eine separate Schnittstelle erstellt werden muss, die den Tunnel zum VPS unterstützt. Die meisten verwendeten VPN-Technologien erfüllen diese Anforderung – beispielsweise ist OpenVPN im Tun-Modus in Ordnung.

Besorgen Sie sich eine Kopie der Registrierung

Wie Jabrayil sagte: „Wer uns behindert, wird uns helfen.“ Da das RKN ein Register verbotener Ressourcen erstellt, wäre es eine Sünde, dieses Register nicht zur Lösung unseres Problems zu verwenden. Wir erhalten eine Kopie der Registrierung von Github.

Wir gehen zu Ihrem Linux-Server, fallen in den Kontext von root'a (sudo su-) und installieren Sie git, falls es noch nicht installiert ist.

apt install git

Gehen Sie in Ihr Home-Verzeichnis und ziehen Sie eine Kopie der Registrierung heraus.

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

Richten Sie ein Cron-Update ein (ich habe es alle 20 Minuten, aber Sie können jedes Intervall wählen, das Sie interessiert). Dazu laufen wir crontab -e und fügen Sie die folgende Zeile hinzu:

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

Wir verbinden einen Hook, der nach der Aktualisierung der Registry Dateien für den Routing-Dienst erstellt. Dazu erstellen wir eine Datei /root/zi/.git/hooks/post-merge mit 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"

und vergessen Sie nicht, es ausführbar zu machen

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

Das vom Hook referenzierte makebgp-Skript wird später erstellt.

Installieren und Konfigurieren des Routing-Dienstes

Vogel installieren. Leider ist die Version von Bird, die derzeit in den Ubuntu-Repositories veröffentlicht wird, in ihrer Frische mit Archaeopteryx-Kot vergleichbar, daher müssen wir zunächst die offizielle PPA der Softwareentwickler zum System hinzufügen.

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

Danach deaktivieren wir Bird sofort für IPv6 – in dieser Installation werden wir es nicht benötigen.

systemctl stop bird6
systemctl disable bird6

Unten finden Sie eine minimalistische Konfigurationsdatei für den Vogeldienst (/etc/bird/bird.conf), was für uns völlig ausreichend ist (und ich erinnere Sie noch einmal daran, dass niemand verbietet, die Idee zu entwickeln und an Ihre eigenen Bedürfnisse anzupassen).

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, sieht optisch aus wie eine IPv4-Adresse, ist es aber nicht. In unserem Fall kann es sich um eine beliebige 32-Bit-Zahl im IPv4-Adressformat handeln, es empfiehlt sich jedoch, dort die IPv4-Adresse Ihres Geräts (in diesem Fall VPS) anzugeben.

Protocol Direct bestimmt, welche Schnittstellen mit dem Routing-Prozess funktionieren. Das Beispiel enthält einige Namensbeispiele, Sie können weitere hinzufügen. Sie können die Zeile auch einfach löschen. In diesem Fall überwacht der Server alle verfügbaren Schnittstellen mit einer IPv4-Adresse.

Protocol Static ist unsere Magie, die Listen mit Präfixen und IP-Adressen (die natürlich /32-Präfixe sind) aus Dateien zur späteren Ankündigung lädt. Woher diese Listen stammen, wird weiter unten besprochen. Bitte beachten Sie, dass das Laden von IP-Adressen standardmäßig auskommentiert ist, der Grund dafür ist die große Menge an Uploads. Zum Vergleich: Zum Zeitpunkt des Schreibens des Artikels gab es 78 Zeilen in der Liste der Präfixe und 85898 in der Liste der IP-Adressen. Ich empfehle dringend, dass Sie nur mit der Liste der Präfixe beginnen und debuggen und entscheiden, ob oder nicht Um das IP-Laden in Zukunft zu aktivieren, nachdem Sie mit Ihrem Router experimentiert haben. Nicht jeder von ihnen kann 85 Einträge in der Routing-Tabelle problemlos verarbeiten.

Das Protokoll BGP richtet tatsächlich BGP-Peering mit Ihrem Router ein. IP-Adresse ist die Adresse der externen Schnittstelle des Routers (oder die Adresse der Tunnelschnittstelle von der Seite des Routers), 64998 und 64999 sind die Nummern autonomer Systeme. In diesem Fall können sie in Form beliebiger 16-Bit-Nummern zugewiesen werden, es empfiehlt sich jedoch, AS-Nummern aus dem durch RFC6996 definierten privaten Bereich - 64512-65534 einschließlich (es gibt jedoch ein 32-Bit-ASN-Format) zu verwenden in unserem Fall ist das definitiv übertrieben). Die beschriebene Konfiguration nutzt eBGP-Peering, bei dem die autonomen Systemnummern des Routing-Dienstes und des Routers unterschiedlich sein müssen.

Wie Sie sehen, muss der Dienst die IP-Adresse des Routers kennen. Wenn Sie also eine dynamische oder nicht routbare private (RFC1918) oder gemeinsam genutzte (RFC6598) Adresse haben, haben Sie keine Möglichkeit, das Peering auf der externen Schnittstelle zu erhöhen. Der Dienst funktioniert jedoch weiterhin im Tunnel.

Es ist auch ziemlich transparent, dass Sie mehrere verschiedene Router mit Routen von einem Dienst versorgen können – duplizieren Sie einfach die Einstellungen für sie, indem Sie den Protokoll-BGP-Abschnitt kopieren und die IP-Adresse des Nachbarn ändern. Aus diesem Grund zeigt das Beispiel die Einstellungen für das Peering außerhalb des Tunnels als die universellsten. Es ist nicht schwer, sie in den Tunnel zu entfernen, indem man die IP-Adressen in den Einstellungen entsprechend ändert.

Registrierungsverarbeitung für den Routing-Dienst

Jetzt müssen wir tatsächlich Listen mit Präfixen und IP-Adressen erstellen, die im vorherigen Schritt im Protokoll Static erwähnt wurden. Dazu nehmen wir die Registrierungsdatei und erstellen daraus die benötigten Dateien mit dem folgenden Skript, das sich in befindet /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'

Vergessen Sie nicht, es ausführbar zu machen

chmod +x /root/blacklist/makebgp

Jetzt können Sie es manuell ausführen und das Aussehen der Dateien in /etc/bird beobachten.

Höchstwahrscheinlich funktioniert Bird derzeit nicht für Sie, da Sie im vorherigen Schritt vorgeschlagen haben, nach Dateien zu suchen, die noch nicht vorhanden sind. Deshalb starten wir es und kontrollieren, dass es startet:

systemctl start bird
birdc show route

Die Ausgabe des zweiten Befehls sollte etwa 80 Einträge anzeigen (dies ist im Moment so, und wenn Sie es einrichten, hängt alles vom Eifer des ILV bei der Blockierung von Netzwerken ab), wie folgt:

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

Team

birdc show protocol

zeigt den Status der Protokolle innerhalb des Dienstes an. Bis Sie den Router konfigurieren (siehe nächster Absatz), befindet sich das OurRouter-Protokoll im Startstatus (Verbindungs- oder Aktivphase) und wechselt nach einer erfolgreichen Verbindung in den Up-Status (Established-Phase). Auf meinem System sieht die Ausgabe dieses Befehls beispielsweise so 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

Anschließen eines Routers

Jeder hat es wahrscheinlich schon satt, dieses Fußtuch zu lesen, aber seien Sie beruhigt – das Ende ist nahe. Darüber hinaus kann ich in diesem Abschnitt keine Schritt-für-Schritt-Anleitung geben – diese ist bei jedem Hersteller unterschiedlich.

Ich kann Ihnen jedoch einige Beispiele zeigen. Die Hauptlogik besteht darin, das BGP-Peering zu erhöhen und NextHop an alle empfangenen Präfixe anzuhängen und auf unseren Tunnel zu verweisen (wenn Sie Datenverkehr über die P2P-Schnittstelle ausgeben müssen) oder auf die NextHop-IP-Adresse, wenn der Datenverkehr zum Ethernet geht.

Auf Mikrotik in RouterOS wird dies beispielsweise wie folgt gelöst

/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

und in Cisco IOS - so

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

Für den Fall, dass derselbe Tunnel sowohl für das BGP-Peering als auch für die Übertragung von Nutzverkehr verwendet wird, ist die Einstellung von nexthop nicht erforderlich, sondern wird über das Protokoll korrekt eingestellt. Wenn man es aber manuell einstellt, wird es auch nicht schlimmer.

Auf anderen Plattformen müssen Sie die Konfiguration selbst herausfinden, aber wenn Sie Schwierigkeiten haben, schreiben Sie in die Kommentare, ich werde versuchen zu helfen.

После того, как у вас поднялась BGP-сессия, прилетели и установились в таблицу маршруты на крупные сети, трафик на адреса из них пошел и счастье близко, вы можете вернуться к сервису bird и попробовать раскомментировать там запись, подключающую список ip-адресов, выполнить danach

systemctl reload bird

und sehen Sie, wie Ihr Router diese 85 Routen übertragen hat. Machen Sie sich bereit, es auszuschalten und überlegen Sie, was Sie damit machen sollen 🙂

Insgesamt

Rein theoretisch verfügen Sie nach Durchführung der oben genannten Schritte über einen Dienst, der den Datenverkehr automatisch am Filtersystem vorbei an in der Russischen Föderation verbotene IP-Adressen umleitet.

Es kann natürlich verbessert werden. Beispielsweise ist es mit Perl- oder Python-Lösungen ganz einfach, eine Liste von IP-Adressen zusammenzufassen. Ein einfaches Perl-Skript, das dies mit Net::CIDR::Lite ausführt, wandelt 85 Präfixe in 60 (nicht tausend) um, deckt aber natürlich einen viel größeren Adressbereich ab, als blockiert ist.

Da der Dienst auf der dritten Ebene des ISO/OSI-Modells arbeitet, erspart er Ihnen nicht die Site-/Seitenblockierung, wenn er nicht an die in der Registrierung eingetragene Adresse aufgelöst wird. Aber zusammen mit der Registry von Github kommt auch die Datei nxdomain.txt an, die sich mit ein paar Strichen des Skripts leicht in eine Adressquelle beispielsweise für das SwitchyOmega-Plugin in Chrome verwandelt.

Es sollte auch erwähnt werden, dass die Lösung einer zusätzlichen Schärfung bedarf, wenn Sie nicht nur ein Internetnutzer sind, sondern auch einige Ressourcen von sich selbst veröffentlichen (z. B. läuft eine Website oder ein Mailserver über diese Verbindung). Über den Router müssen Sie den ausgehenden Datenverkehr von diesem Dienst fest an Ihre öffentliche Adresse binden, andernfalls verlieren Sie die Verbindung zu den Ressourcen, die in der Liste der vom Router empfangenen Präfixe abgedeckt sind.

Wenn Sie Fragen haben – fragen Sie, wir sind bereit zu antworten.

UPD. Danke Navion и TerAnYu für Optionen für Git, um das Download-Volumen zu reduzieren.

UPD2. Kolleginnen und Kollegen, es scheint, dass ich einen Fehler gemacht habe, indem ich dem Artikel keine Anweisungen zum Einrichten eines Tunnels zwischen dem VPS und dem Router hinzugefügt habe. Daraus ergeben sich viele Fragen.
Nur für den Fall, ich möchte es noch einmal anmerken: Es wird davon ausgegangen, dass Sie vor Beginn der Schritte in dieser Anleitung den VPN-Tunnel bereits in die von Ihnen benötigte Richtung konfiguriert und seine Leistung überprüft haben (z. B. indem Sie den Datenverkehr dort standardmäßig oder statisch umbrechen). Wenn Sie diese Phase noch nicht abgeschlossen haben, macht es keinen Sinn, die Schritte aus dem Artikel zu befolgen. Ich habe dazu noch keinen eigenen Text, aber wenn Sie „OpenVPN-Server-Setup“ zusammen mit dem Namen des auf dem VPS installierten Betriebssystems und „OpenVPN-Client-Setup“ mit dem Namen Ihres Routers googeln, dann höchstwahrscheinlich Sie finden Sie eine Reihe von Artikeln zu diesem Thema, darunter auch über Habré.

UPD3. Ungeopfert hat einen Code geschrieben, der die resultierende Datei für Bird aus dump.csv mit optionaler Summierung von IP-Adressen erstellt. Daher kann der Abschnitt „Registrierungsverarbeitung für den Routing-Dienst“ durch einen Aufruf seines Programms ersetzt werden. https://habr.com/post/354282/#comment_10782712

UPD4. Ein wenig Arbeit an den Fehlern (hat nicht zum Text beigetragen):
1) stattdessen systemctl Vogel neu laden Es ist sinnvoll, den Befehl zu verwenden Birdc konfigurieren.
2) im Mikrotik-Router, anstatt den nächsten Hop auf die IP der zweiten Seite des Tunnels zu ändern /routing filter add action=accept chain=dynamic-in Protocol=bgp comment="Set nexthop" set-in-nexthop=172.30.1.1 Es ist sinnvoll, die Route ohne Adresse direkt zur Tunnelschnittstelle anzugeben /routing filter add action=accept chain=dynamic-in Protocol=bgp comment="Nexthop festlegen" set-in-nexthop-direct=<Schnittstellenname>

UPD5. Ein neuer Dienst ist eingetroffen https://antifilter.download, von wo aus Sie vorgefertigte Listen mit IP-Adressen abrufen können. Wird alle halbe Stunde aktualisiert. Auf der Client-Seite müssen die Einträge nur noch mit dem entsprechenden „Route ... Reject“ umrahmt werden.
Und das reicht wahrscheinlich aus, um meine Großmutter zu vögeln und den Artikel zu aktualisieren.

UPD6. Eine überarbeitete Version des Artikels für diejenigen, die es nicht verstehen, aber beginnen möchten - hier.

Source: habr.com

Kommentar hinzufügen