Configurer BGP pour contourner le blocage, ou "Comment j'ai cessé d'avoir peur et je suis tombé amoureux de RKN"

Eh bien, d'accord, parler de "tombé amoureux" est une exagération. Plutôt "pourrait coexister avec".

Comme vous le savez tous, depuis le 16 avril 2018, Roskomnadzor bloque l'accès aux ressources sur le réseau avec des traits extrêmement larges, en ajoutant au registre unifié des noms de domaine, des pointeurs vers des pages de sites sur Internet et des adresses réseau qui vous permettent de identifier les sites sur Internet contenant des informations dont la diffusion est interdite dans la Fédération de Russie » (dans le texte - juste un registre) /10 parfois. En conséquence, les citoyens de la Fédération de Russie et les entreprises souffrent, ayant perdu l'accès aux ressources absolument légales dont ils ont besoin.

Après avoir dit dans les commentaires d'un des articles sur Habré que j'étais prêt à aider les victimes à mettre en place un plan de contournement, plusieurs personnes m'ont contacté pour demander une telle aide. Lorsque tout a fonctionné pour eux, l'un d'eux a recommandé de décrire la technique dans un article. Après réflexion, j'ai décidé de rompre mon silence sur le site et d'essayer pour une fois d'écrire quelque chose d'intermédiaire entre un projet et un post sur Facebook, c'est-à-dire habrapost. Le résultat est devant vous.

Clause de non-responsabilité 

Puisqu'il n'est pas très légal de publier des moyens de contourner le blocage de l'accès aux informations interdites sur le territoire de la Fédération de Russie, le but de cet article sera de parler d'une méthode qui vous permet d'automatiser l'accès aux ressources autorisées sur le territoire de la Fédération de Russie, mais en raison des actions de quelqu'un inaccessibles directement via votre fournisseur. Et l'accès à d'autres ressources, obtenu à la suite d'actions de l'article, est un effet secondaire malheureux et n'est en aucun cas le but de l'article.

Aussi, comme je suis avant tout architecte réseau de profession, vocation et parcours de vie, la programmation et Linux ne sont pas mes points forts. Par conséquent, bien sûr, les scripts peuvent être mieux écrits, les problèmes de sécurité dans VPS peuvent être résolus plus en profondeur, etc. Vos suggestions seront acceptées avec gratitude, si elles sont suffisamment détaillées - je me ferai un plaisir de les ajouter au texte de l'article.

TL; DR

Nous automatisons l'accès aux ressources via votre tunnel existant à l'aide d'une copie du registre et du protocole BGP. L'objectif est de retirer tout le trafic adressé aux ressources bloquées dans le tunnel. Explication minimale, principalement des instructions étape par étape.

De quoi avez-vous besoin pour cela

Malheureusement, ce poste n'est pas pour tout le monde. Pour utiliser cette technique, vous aurez besoin de rassembler quelques éléments :

  1. Vous devez avoir un serveur Linux quelque part en dehors du champ de blocage. Ou du moins le désir de démarrer un tel serveur - puisqu'il coûte désormais à partir de 9 $ / an, et peut-être moins. La méthode convient également si vous disposez d'un tunnel VPN séparé, le serveur peut alors être situé à l'intérieur du champ de blocage.
  2. Votre routeur doit être suffisamment intelligent pour pouvoir
    • n'importe quel client VPN que vous aimez (je préfère OpenVPN, mais cela peut être PPTP, L2TP, GRE+IPSec et toute autre option qui crée une interface de tunnel) ;
    • Protocole BGPv4. Ce qui signifie que pour SOHO, il peut s'agir de Mikrotik ou de tout routeur doté d'un micrologiciel personnalisé OpenWRT/LEDE/similaire qui vous permet d'installer Quagga ou Bird. L'utilisation d'un routeur PC n'est pas non plus interdite. Pour une entreprise, consultez la documentation de votre routeur de frontière pour la prise en charge de BGP.
  3. Vous devez être familiarisé avec l'utilisation de Linux et les technologies réseau, y compris BGP. Ou au moins envie d'avoir cette idée. Comme je ne suis pas prêt à embrasser l'immensité cette fois, vous devrez étudier par vous-même certains points qui vous sont incompréhensibles. Cependant, je répondrai bien sûr à des questions spécifiques dans les commentaires et il est peu probable que je sois le seul à répondre, alors n'hésitez pas à demander.

Ce qui est utilisé dans l'exemple

  • Copie du registre https://github.com/zapret-info/z-i 
  • VPS-Ubuntu 16.04
  • Service de routage - oiseau 1.6.3   
  • Routeur - Mikrotik hAP ac
  • Dossiers de travail - puisque nous travaillons en tant que root, la plupart de tout sera placé dans le dossier root home. Respectivement:
    • /root/blacklist - dossier de travail avec script de compilation
    • /root/zi - une copie du registre de github
    • /etc/bird - dossier standard des paramètres du service Bird
  • Nous acceptons 194.165.22.146, ASN 64998 comme adresse IP externe du VPS avec le serveur de routage et le point de terminaison du tunnel ; adresse IP externe du routeur - 81.177.103.94, ASN 64999
  • Les adresses IP à l'intérieur du tunnel sont 172.30.1.1 et 172.30.1.2, respectivement.

Configurer BGP pour contourner le blocage, ou "Comment j'ai cessé d'avoir peur et je suis tombé amoureux de RKN"

Bien sûr, vous pouvez utiliser n'importe quel autre routeur, système d'exploitation et produit logiciel, en ajustant la solution pour qu'elle corresponde à leur logique.

En bref - la logique de la solution

  1. Actions préparatoires
    1. Obtenir un VPS
    2. Nous élevons le tunnel du routeur au VPS
  2. Obtenir et mettre à jour régulièrement une copie du registre
  3. Installation et configuration du service de routage
  4. Créer une liste de routes statiques pour le service de routage en fonction du registre
  5. Nous connectons le routeur au service et configurons l'envoi de tout le trafic via le tunnel.

La décision proprement dite

Actions préparatoires

Dans l'immensité du réseau, il existe de nombreux services qui fournissent des VPS pour un prix extrêmement raisonnable. Jusqu'à présent, j'ai trouvé et utilisé l'option pour 9 $/an, mais même si vous ne vous embêtez pas vraiment, il y a beaucoup d'options pour 1E/mois à chaque coin de rue. La question du choix d'un VPS dépasse largement le cadre de cet article, donc si quelque chose n'est pas clair pour quelqu'un à ce sujet, demandez dans les commentaires.

Si vous utilisez VPS non seulement pour le service de routage, mais également pour y terminer un tunnel, vous devez augmenter ce tunnel et, presque sans équivoque, configurer NAT pour celui-ci. Il existe un grand nombre d'instructions sur le réseau pour ces actions, je ne les répéterai pas ici. La principale exigence pour un tel tunnel est qu'il doit créer une interface distincte sur votre routeur qui prend en charge le tunnel vers le VPS. La plupart des technologies VPN utilisées répondent à cette exigence - par exemple, OpenVPN en mode tun convient.

Obtenir une copie du registre

Comme l'a dit Jabrail, "Celui qui nous empêche nous aidera." Étant donné que le RKN crée un registre des ressources interdites, ce serait un péché de ne pas utiliser ce registre pour résoudre notre problème. Nous recevrons une copie du registre de github.

On va sur votre serveur Linux, on tombe dans le contexte de root'a (sudo su-) et installez git s'il n'est pas déjà installé.

apt install git

Accédez à votre répertoire personnel et extrayez une copie du registre.

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

Configurez une mise à jour cron (je l'ai toutes les 20 minutes, mais vous pouvez choisir n'importe quel intervalle qui vous intéresse). Pour ce faire, nous courons crontab -e et ajoutez-y la ligne suivante :

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

Nous connectons un crochet qui créera des fichiers pour le service de routage après la mise à jour du registre. Pour ce faire, nous créons un fichier /root/zi/.git/hooks/post-merge avec le contenu suivant :

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

et n'oubliez pas de le rendre exécutable

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

Le script makebgp référencé par le hook sera créé ultérieurement.

Installation et configuration du service de routage

Installez l'oiseau. Malheureusement, la version actuellement publiée de bird dans les référentiels Ubuntu est comparable en fraîcheur aux excréments d'Archaeopteryx, nous devons donc d'abord ajouter le PPA officiel des développeurs de logiciels au système.

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

Après cela, nous désactivons immédiatement bird pour IPv6 - dans cette installation, nous n'en aurons pas besoin.

systemctl stop bird6
systemctl disable bird6

Vous trouverez ci-dessous un fichier de configuration minimaliste pour le service bird (/etc/bird/bird.conf), ce qui nous suffit amplement (et encore une fois je vous rappelle que personne n'interdit de développer et d'ajuster l'idée en fonction de vos propres besoins)

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;
}

ID du routeur - identifiant du routeur, ressemblant visuellement à une adresse IPv4, mais ce n'est pas le cas. Dans notre cas, il peut s'agir de n'importe quel nombre 32 bits au format d'adresse IPv4, mais il est recommandé d'y spécifier l'adresse IPv4 de votre appareil (dans ce cas, VPS).

protocol direct détermine quelles interfaces fonctionneront avec le processus de routage. L'exemple donne quelques exemples de noms, vous pouvez en ajouter d'autres. Vous pouvez aussi simplement supprimer la ligne, auquel cas le serveur écoutera sur toutes les interfaces disponibles avec une adresse IPv4.

protocol static est notre magie qui charge des listes de préfixes et d'adresses IP (qui sont, bien sûr, des préfixes /32) à partir de fichiers pour une annonce ultérieure. L'origine de ces listes sera discutée ci-dessous. Veuillez noter que le chargement des adresses IP est commenté par défaut, la raison en est la grande quantité de téléchargement. A titre de comparaison, au moment de la rédaction de l'article, il y a 78 lignes dans la liste des préfixes, et 85898 dans la liste des adresses IP.Je vous recommande fortement de commencer et de déboguer uniquement sur la liste des préfixes, et de décider si oui ou non pour activer le chargement IP à l'avenir après avoir expérimenté votre routeur. Tous ne peuvent pas digérer facilement 85 XNUMX entrées dans la table de routage.

Le protocole bgp configure en fait l'appairage bgp avec votre routeur. l'adresse IP est l'adresse de l'interface externe du routeur (ou l'adresse de l'interface du tunnel du côté du routeur), 64998 et 64999 sont les numéros des systèmes autonomes. Dans ce cas, ils peuvent être attribués sous la forme de n'importe quels numéros 16 bits, mais il est recommandé d'utiliser des numéros AS de la plage privée définie par RFC6996 - 64512-65534 inclus (il existe un format ASN 32 bits, mais dans notre cas, c'est définitivement exagéré). La configuration décrite utilise le peering eBGP, dans lequel les numéros de système autonome du service de routage et du routeur doivent être différents.

Comme vous pouvez le voir, le service a besoin de connaître l'adresse IP du routeur, donc si vous avez une adresse dynamique ou non routable privée (RFC1918) ou partagée (RFC6598), vous n'avez pas la possibilité d'augmenter le peering sur l'interface externe, mais le service fonctionnera toujours à l'intérieur du tunnel.

Il est également assez transparent que vous puissiez fournir à plusieurs routeurs différents des itinéraires à partir d'un service - dupliquez simplement les paramètres pour eux en copiant la section protocole bgp en modifiant l'adresse IP du voisin. C'est pourquoi l'exemple montre les paramètres d'appairage en dehors du tunnel comme les plus universels. Il n'est pas difficile de les retirer dans le tunnel en modifiant les adresses IP dans les paramètres en conséquence.

Traitement du registre pour le service de routage

Maintenant, nous devons en fait créer des listes de préfixes et d'adresses IP, qui sont mentionnées à l'étape précédente dans le protocole statique. Pour ce faire, nous prenons le fichier de registre et en faisons les fichiers dont nous avons besoin avec le script suivant, situé dans /root/liste noire/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'

N'oubliez pas de le rendre exécutable

chmod +x /root/blacklist/makebgp

Vous pouvez maintenant l'exécuter manuellement et observer l'apparence des fichiers dans /etc/bird.

Très probablement, à ce moment-là, bird ne fonctionne pas pour vous, car à l'étape précédente, vous lui avez suggéré de rechercher des fichiers qui n'existaient pas encore. Par conséquent, nous le lançons et contrôlons qu'il démarre :

systemctl start bird
birdc show route

La sortie de la deuxième commande devrait afficher environ 80 entrées (c'est pour le moment, et lorsque vous la configurerez, tout dépendra du zèle de l'ILV dans le blocage des réseaux) comme ceci :

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

Équipe

birdc show protocol

affichera l'état des protocoles au sein du service. Jusqu'à ce que vous configuriez le routeur (voir le paragraphe suivant), le protocole OurRouter sera dans l'état de démarrage (phases Connect ou Active), et après une connexion réussie, il passera dans l'état up (phase Etablie). Par exemple, sur mon système, la sortie de cette commande ressemble à ceci :

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

Connexion routeur

Tout le monde est probablement déjà fatigué de lire ce footcloth, mais rassurez-vous - la fin est proche. De plus, dans cette section, je ne pourrai pas donner d'instructions étape par étape - ce sera différent pour chaque fabricant.

Cependant, je peux vous montrer quelques exemples. La logique principale est d'augmenter l'appairage BGP et d'attacher le prochain saut à tous les préfixes reçus, pointant vers notre tunnel (si vous avez besoin de générer du trafic via l'interface p2p) ou l'adresse IP du prochain saut si le trafic va vers Ethernet).

Par exemple, sur Mikrotik dans RouterOS, cela est résolu comme suit

/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

et dans Cisco IOS - comme ceci

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

Dans le cas où le même tunnel est utilisé à la fois pour le peering BGP et pour la transmission du trafic utile, il n'est pas nécessaire de paramétrer nexthop, il sera paramétré correctement au moyen du protocole. Mais si vous le réglez manuellement, cela ne s'aggravera pas non plus.

Sur d'autres plates-formes, vous devrez déterminer vous-même la configuration, mais si vous rencontrez des difficultés, écrivez dans les commentaires, j'essaierai de vous aider.

Une fois que votre session BGP a augmenté, que les routes vers les grands réseaux sont arrivées et sont installées dans le tableau, que le trafic vers leurs adresses a disparu et que le bonheur est proche, vous pouvez revenir au service oiseau et essayer de décommenter l'entrée qui relie le liste des adresses IP, exécutez après cela

systemctl reload bird

et voyez comment votre routeur a transféré ces 85 XNUMX routes. Préparez-vous à l'éteindre et réfléchissez à ce qu'il faut en faire 🙂

En tout

En théorie, après avoir effectué les étapes ci-dessus, vous disposez d'un service qui redirige automatiquement le trafic vers les adresses IP interdites dans la Fédération de Russie après le système de filtrage.

Il peut, bien sûr, être amélioré. Par exemple, il est assez facile de résumer une liste d'adresses IP via des solutions perl ou python. Un simple script perl faisant cela avec Net::CIDR::Lite transforme 85 60 préfixes en XNUMX (et non mille), mais couvre naturellement une plage d'adresses beaucoup plus large que celle qui est bloquée.

Étant donné que le service fonctionne au troisième niveau du modèle ISO / OSI, il ne vous évitera pas de bloquer le site / la page s'il ne résout pas l'adresse enregistrée dans le registre. Mais avec le registre de github, le fichier nxdomain.txt arrive, qui avec quelques coups de script se transforme facilement en une source d'adresses pour, par exemple, le plugin SwitchyOmega dans Chrome.

Il convient également de mentionner que la solution nécessite un affinement supplémentaire si vous n'êtes pas seulement un internaute, mais publiez également certaines ressources de vous-même (par exemple, un site Web ou un serveur de messagerie fonctionne sur cette connexion). Au moyen du routeur, vous devez lier en dur le trafic sortant de ce service à votre adresse publique, sinon vous perdrez la connectivité avec les ressources couvertes par la liste des préfixes reçus par le routeur.

Si vous avez des questions - demandez, prêt à répondre.

UPD. Merci avion и TerAnYu pour les options permettant à git de réduire les volumes de téléchargement.

UPD2. Chers collègues, il semble que j'ai commis une erreur en n'ajoutant pas d'instructions pour la configuration d'un tunnel entre le VPS et le routeur à l'article. Beaucoup de questions en découlent.
Juste au cas où, je note à nouveau - il est supposé qu'avant de commencer les étapes de ce guide, vous avez déjà configuré le tunnel VPN dans la direction dont vous avez besoin et vérifié ses performances (par exemple, en y enveloppant le trafic par défaut ou statique). Si vous n'avez pas encore terminé cette phase, cela n'a pas vraiment de sens de suivre les étapes de l'article. Je n'ai pas encore mon propre texte à ce sujet, mais si vous recherchez sur Google "Configuration du serveur OpenVPN" avec le nom du système d'exploitation installé sur le VPS, et "Configuration du client OpenVPN" avec le nom de votre routeur, vous trouverez de nombreux articles à ce sujet, notamment sur Habré.

MISE À JOUR3. Non sacrifié a écrit un code qui crée le fichier résultant pour bird à partir de dump.csv avec une sommation facultative des adresses IP. Ainsi, la section "Traitement du registre pour le service de routage" peut être remplacée par un appel à son programme. https://habr.com/post/354282/#comment_10782712

UPD4. Un petit travail sur les erreurs (n'a pas contribué dans le texte):
1) à la place oiseau de recharge systemctl il est logique d'utiliser la commande birdc configurer.
2) dans le routeur Mikrotik, au lieu de changer le saut suivant en IP du deuxième côté du tunnel /routing filter add action=accept chain=dynamic-in protocol=bgp comment="Set nexthop" set-in-nexthop=172.30.1.1 il est logique de spécifier l'itinéraire directement à l'interface du tunnel, sans l'adresse /routing filter add action=accept chain=dynamic-in protocol=bgp comment="Set nexthop" set-in-nexthop-direct=<nom de l'interface>

UPD5. Un nouveau service est arrivé https://antifilter.download, d'où vous pouvez prendre des listes d'adresses IP prêtes à l'emploi. Mise à jour toutes les demi-heures. Côté client, il ne reste plus qu'à encadrer les entrées avec le "route...reject" correspondant.
Et c'est probablement suffisant pour baiser ma grand-mère et mettre à jour l'article.

UPD6. Une version révisée de l'article pour ceux qui ne veulent pas comprendre, mais veulent commencer - ici.

Source: habr.com

Ajouter un commentaire