Configurar BGP per evitar el bloqueig o "Com vaig deixar de tenir por i em vaig enamorar de RKN"

Bé, d'acord, sobre "es va enamorar" és una exageració. Més aviat "podria conviure amb".

Com tots sabeu, des del 16 d'abril de 2018, Roskomnadzor bloqueja l'accés als recursos de la xarxa amb traços extremadament amplis, afegint al Registre Unificat de noms de domini, punters a pàgines de llocs a Internet i adreces de xarxa que us permeten identificar llocs a Internet que contenen informació, la difusió de la qual està prohibida a la Federació de Rússia" (al text - només un registre) /10 de vegades. Com a resultat, els ciutadans de la Federació Russa i les empreses pateixen, havent perdut l'accés als recursos completament legals que necessiten.

Després de dir en els comentaris d'un dels articles sobre Habré que estava disposat a ajudar les víctimes a establir un esquema de bypass, diverses persones es van contactar amb mi per demanar aquesta ajuda. Quan tot els va funcionar, un d'ells va recomanar descriure la tècnica en un article. Reflexionant, vaig decidir trencar el meu silenci al lloc i intentar d'una vegada escriure alguna cosa intermèdia entre un projecte i una publicació a Facebook, és a dir. habrapost. El resultat està davant teu.

renúncia

Com que no és gaire legal publicar maneres d'evitar el bloqueig de l'accés a la informació prohibida al territori de la Federació Russa, l'objectiu d'aquest article serà parlar d'un mètode que permeti automatitzar l'accés als recursos que estan permesos al territori. de la Federació Russa, però a causa de les accions d'algú inaccessible directament a través del vostre proveïdor. I l'accés a altres recursos, obtinguts com a resultat de les accions de l'article, és un efecte secundari desafortunat i no és en cap cas la finalitat de l'article.

A més, com que sóc principalment arquitecte de xarxes de professió, vocació i trajectòria de vida, la programació i Linux no són els meus punts forts. Per tant, per descomptat, els scripts es poden escriure millor, els problemes de seguretat en VPS es poden resoldre amb més profunditat, etc. Els vostres suggeriments seran acceptats amb gratitud, si són prou detallats; estaré encantat d'afegir-los al text de l'article.

TL; DR

Automatitzem l'accés als recursos a través del vostre túnel existent mitjançant una còpia del registre i el protocol BGP. L'objectiu és eliminar tot el trànsit adreçat als recursos bloquejats al túnel. Explicació mínima, sobretot instruccions pas a pas.

Què necessites per a això

Malauradament, aquesta publicació no és per a tothom. Per utilitzar aquesta tècnica, haureu d'ajuntar alguns elements:

  1. Heu de tenir un servidor Linux en algun lloc fora del camp de bloqueig. O almenys el desig d'iniciar un servidor d'aquest tipus, ja que ara costa des de $ 9 / any, i possiblement menys. El mètode també és adequat si teniu un túnel VPN separat, llavors el servidor es pot localitzar dins del camp de bloc.
  2. El vostre encaminador ha de ser prou intel·ligent per poder-ho
    • qualsevol client VPN que us agradi (prefereixo OpenVPN, però pot ser PPTP, L2TP, GRE+IPSec i qualsevol altra opció que creï una interfície de túnel);
    • Protocol BGPv4. Això vol dir que per a SOHO pot ser Mikrotik o qualsevol encaminador amb OpenWRT/LEDE/firmware personalitzat similar que us permeti instal·lar Quagga o Bird. Tampoc està prohibit l'ús d'un encaminador de PC. Per a una empresa, consulteu la documentació del vostre encaminador fronterer per obtenir suport BGP.
  3. Hauríeu d'estar familiaritzat amb l'ús de Linux i les tecnologies de xarxa, inclòs BGP. O almenys vol fer-se aquesta idea. Com que aquesta vegada no estic preparat per abraçar la immensitat, haureu d'estudiar alguns punts que us resulten incomprensibles pel vostre compte. Tanmateix, per descomptat, respondré preguntes específiques als comentaris i és poc probable que sigui l'únic que respongui, així que no dubteu a preguntar.

Què s'utilitza a l'exemple

  • Còpia del registre https://github.com/zapret-info/z-i 
  • VPS - Ubuntu 16.04
  • Servei d'encaminament - ocell 1.6.3   
  • Encaminador - Mikrotik hAP ac
  • Carpetes de treball: com que estem treballant com a arrel, la majoria de tot es col·locarà a la carpeta d'inici arrel. Respectivament:
    • /root/blacklist - carpeta de treball amb script de compilació
    • /root/zi - una còpia del registre de github
    • /etc/bird - carpeta de configuració estàndard del servei d'ocells
  • Acceptem 194.165.22.146, ASN 64998 com a adreça IP externa del VPS amb el servidor d'encaminament i el punt de terminació del túnel; adreça IP externa de l'encaminador: 81.177.103.94, ASN 64999
  • Les adreces IP dins del túnel són 172.30.1.1 i 172.30.1.2, respectivament.

Configurar BGP per evitar el bloqueig o "Com vaig deixar de tenir por i em vaig enamorar de RKN"

Per descomptat, podeu utilitzar qualsevol altre encaminador, sistema operatiu i producte de programari, ajustant la solució a la seva lògica.

Breument: la lògica de la solució

  1. Accions preparatòries
    1. Aconseguint un VPS
    2. Pugem el túnel des del router fins al VPS
  2. Obtenció i actualització periòdica d'una còpia del registre
  3. Instal·lació i configuració del servei d'encaminament
  4. Creeu una llista de rutes estàtiques per al servei d'encaminament en funció del registre
  5. Connectem l'encaminador al servei i configurem l'enviament de tot el trànsit pel túnel.

La decisió real

Accions preparatòries

A la immensitat de la xarxa hi ha molts serveis que ofereixen VPS per diners extremadament raonables. Fins ara, he trobat i he fet servir l'opció de 9 dòlars/any, però encara que no us molesteu realment, hi ha moltes opcions per a 1E/mes a cada cantonada. La qüestió d'escollir un VPS està molt més enllà de l'abast d'aquest article, així que si alguna cosa no està clara per a algú sobre això, pregunteu als comentaris.

Si utilitzeu VPS no només per al servei d'encaminament, sinó també per acabar-hi un túnel, haureu d'elevar aquest túnel i, gairebé inequívocament, configurar-hi NAT. Hi ha un gran nombre d'instruccions a la xarxa per a aquestes accions, no les repetiré aquí. El requisit principal per a aquest túnel és que ha de crear una interfície separada al vostre encaminador que admeti el túnel cap al VPS. La majoria de les tecnologies VPN utilitzades compleixen aquest requisit; per exemple, OpenVPN en mode tun està bé.

Obteniu una còpia del registre

Com deia Jabrail: "Qui ens impedeix ens ajudarà". Com que el RKN està creant un registre de recursos prohibits, seria un pecat no utilitzar aquest registre per resoldre el nostre problema. Rebrem una còpia del registre de github.

Anem al vostre servidor Linux, entrem en el context de root'a (sudo su-) i instal·leu git si encara no està instal·lat.

apt install git

Aneu al vostre directori personal i traieu una còpia del registre.

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

Configureu una actualització cron (la tinc cada 20 minuts, però podeu triar qualsevol interval que us interessi). Per fer-ho, posem en marxa crontab -e i afegiu-hi la línia següent:

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

Connectem un ganxo que crearà fitxers per al servei d'encaminament després d'actualitzar el registre. Per fer-ho, creem un fitxer /root/zi/.git/hooks/post-merge amb el següent contingut:

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

i no us oblideu de fer-lo executable

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

L'script makebgp al qual fa referència el ganxo es crearà més tard.

Instal·lació i configuració del servei d'encaminament

Instal·leu l'ocell. Malauradament, la versió d'ocell publicada actualment als dipòsits d'Ubuntu és comparable en frescor a les femtes d'Archeopteryx, per la qual cosa primer hem d'afegir al sistema el PPA oficial dels desenvolupadors de programari.

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

Després d'això, desactivem immediatament Bird per a IPv6; en aquesta instal·lació no el necessitarem.

systemctl stop bird6
systemctl disable bird6

A continuació es mostra un fitxer de configuració minimalista per al servei d'ocells (/etc/bird/bird.conf), que ens és prou (i un cop més us recordo que ningú prohibeix desenvolupar i ajustar la idea per adaptar-la a les vostres necessitats)

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 - identificador de l'encaminador, visualment semblant a una adreça IPv4, però no ho és. En el nostre cas, pot ser qualsevol número de 32 bits en el format d'adreça IPv4, però és una bona pràctica especificar-hi l'adreça IPv4 del vostre dispositiu (en aquest cas, VPS).

protocol direct determina quines interfícies funcionaran amb el procés d'encaminament. L'exemple dóna un parell d'exemples de noms, podeu afegir-ne més. També podeu simplement eliminar la línia, en aquest cas el servidor escoltarà a totes les interfícies disponibles amb una adreça IPv4.

protocol static és la nostra màgia que carrega llistes de prefixos i adreces IP (que són, per descomptat, prefixos /32) dels fitxers per a un anunci posterior. A continuació es comentarà d'on provenen aquestes llistes. Tingueu en compte que la càrrega d'adreces IP es comenta per defecte, la raó d'això és la gran quantitat de càrrega. Per comparar, en el moment d'escriure l'article, hi ha 78 línies a la llista de prefixos i 85898 a la llista d'adreces IP. Us recomano que inicieu i depureu només a la llista de prefixos i decidiu si o no. per habilitar la càrrega IP en el futur després d'experimentar amb el vostre encaminador. No tots poden digerir fàcilment 85 mil entrades a la taula d'encaminament.

protocol bgp realment configura el peering bgp amb el vostre encaminador. adreça-ip és l'adreça de la interfície externa de l'encaminador (o l'adreça de la interfície del túnel des del costat de l'encaminador), 64998 i 64999 són els números de sistemes autònoms. En aquest cas, es poden assignar en forma de qualsevol nombre de 16 bits, però és una bona pràctica utilitzar números AS de l'interval privat definit per RFC6996 - 64512-65534 inclòs (hi ha un format ASN de 32 bits, però en el nostre cas això és definitivament exagerat). La configuració descrita utilitza eBGP peering, en què els números de sistema autònom del servei d'encaminament i de l'encaminador han de ser diferents.

Com podeu veure, el servei ha de conèixer l'adreça IP de l'encaminador, de manera que si teniu una adreça privada (RFC1918) o compartida (RFC6598) dinàmica o no encaminable, no teniu cap opció per augmentar el peering a la interfície externa, però el servei seguirà funcionant dins del túnel.

També és bastant transparent que podeu proporcionar diversos encaminadors diferents amb rutes des d'un servei; només heu de duplicar la configuració d'ells copiant la secció del protocol bgp amb el canvi de l'adreça IP del veí. És per això que l'exemple mostra la configuració per mirar fora del túnel, com la més universal. No és difícil eliminar-los al túnel canviant les adreces IP a la configuració en conseqüència.

Tramitació de registre per al Servei d'encaminament

Ara necessitem, de fet, crear llistes de prefixos i adreces IP, que s'esmenten al pas anterior en protocol estàtic. Per fer-ho, agafem el fitxer de registre i en fem els fitxers que necessitem amb el següent script, situat a /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'

No us oblideu de fer-lo executable

chmod +x /root/blacklist/makebgp

Ara podeu executar-lo manualment i observar l'aparició dels fitxers a /etc/bird.

El més probable és que l'ocell en aquest moment no us funcioni, perquè en l'etapa anterior vau suggerir que cerqués fitxers que encara no existien. Per tant, l'iniciem i controlem que s'iniciï:

systemctl start bird
birdc show route

La sortida de la segona ordre hauria de mostrar unes 80 entrades (això és en aquest moment, i quan la configureu, tot dependrà de l'entusiasme de l'ILV per bloquejar xarxes) com aquesta:

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

Equip

birdc show protocol

mostrarà l'estat dels protocols dins del servei. Fins que no configureu l'encaminador (vegeu el paràgraf següent), el protocol OurRouter estarà en l'estat inicial (fases Connectar o Activa), i després d'una connexió correcta, passarà a l'estat de pujada (fase establerta). Per exemple, al meu sistema, la sortida d'aquesta ordre és així:

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

Connexió d'un encaminador

Probablement tothom ja està cansat de llegir aquest drap de peus, però animeu-vos: el final és a prop. A més, en aquesta secció no podré donar instruccions pas a pas: serà diferent per a cada fabricant.

Tanmateix, puc ensenyar-vos un parell d'exemples. La lògica principal és augmentar el peering BGP i adjuntar nexthop a tots els prefixos rebuts, apuntant al nostre túnel (si necessiteu enviar trànsit a través de la interfície p2p) o l'adreça IP de nexthop si el trànsit va a Ethernet).

Per exemple, a Mikrotik a RouterOS, això es resol de la següent manera

/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

i a Cisco IOS, així

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

En el cas que s'utilitzi el mateix túnel tant per a l'emparejament BGP com per a la transmissió de trànsit útil, no cal configurar nexthop, s'establirà correctament mitjançant el protocol. Però si el configureu manualment, tampoc empitjorarà.

En altres plataformes, haureu d'esbrinar la configuració vosaltres mateixos, però si teniu cap dificultat, escriviu als comentaris, intentaré ajudar-vos.

Després d'haver augmentat la sessió de BGP, les rutes a grans xarxes han arribat i s'han instal·lat a la taula, el trànsit a les adreces d'elles ha desaparegut i la felicitat està a prop, podeu tornar al servei d'aus i intentar descomentar l'entrada que connecta el llista d'adreces IP, executar després

systemctl reload bird

i mira com el teu encaminador ha transferit aquestes 85 mil rutes. Prepareu-vos per apagar-lo i pensar què fer-hi 🙂

En total

Teòricament, després de realitzar els passos anteriors, teniu un servei que redirigeix ​​automàticament el trànsit a adreces IP prohibides a la Federació Russa més enllà del sistema de filtratge.

Per descomptat, es pot millorar. Per exemple, és prou fàcil resumir una llista d'adreces IP mitjançant solucions perl o python. Un simple script Perl que ho fa amb Net::CIDR::Lite converteix 85 mil prefixos en 60 (no mil), però, naturalment, cobreix un rang d'adreces molt més gran del que està bloquejat.

Atès que el servei funciona al tercer nivell del model ISO/OSI, no us estalviarà del bloqueig del lloc/pàgina si no es resol a l'adreça que està registrada al registre. Però juntament amb el registre de github, arriba el fitxer nxdomain.txt, que amb uns quants cops de l'script es converteix fàcilment en una font d'adreces per, per exemple, el connector SwitchyOmega a Chrome.

També cal esmentar que la solució requereix una millora addicional si no només sou un usuari d'Internet, sinó que també publiqueu alguns recursos propis (per exemple, un lloc web o un servidor de correu s'executa amb aquesta connexió). Mitjançant l'encaminador, cal vincular el trànsit de sortida d'aquest servei a la vostra adreça pública, en cas contrari perdrà la connectivitat amb aquells recursos que estan coberts per la llista de prefixos que rep l'encaminador.

Si teniu alguna pregunta, pregunteu, preparat per respondre.

UPD. Gràcies naví и TerAnYu per obtenir opcions per a git per reduir els volums de descàrrega.

UPD2. Col·legues, sembla que em vaig equivocar en no afegir instruccions per configurar un túnel entre el VPS i l'encaminador a l'article. Moltes preguntes són provocades per això.
Per si de cas, ho torno a notar: se suposa que abans de començar els passos d'aquesta guia, ja heu configurat el túnel VPN en la direcció que necessiteu i heu comprovat el seu rendiment (per exemple, embolicant el trànsit allà per defecte o estàtic). Si encara no heu completat aquesta fase, realment no té sentit seguir els passos de l'article. Encara no tinc el meu propi text sobre això, però si busqueu a Google "Configuració del servidor OpenVPN" juntament amb el nom del sistema operatiu instal·lat al VPS i "Configuració del client OpenVPN" amb el nom del vostre encaminador, el més probable és que trobarà una sèrie d'articles sobre aquest tema, inclòs sobre Habré.

UPD3. Sense sacrifici va escriure un codi que fa que el fitxer resultant per a l'ocell de dump.csv amb una suma opcional d'adreces IP. Per tant, l'apartat "Tramitació del registre per al servei d'encaminament" es pot substituir per una trucada al seu programa. https://habr.com/post/354282/#comment_10782712

UPD4. Una mica de treball sobre els errors (no va contribuir al text):
1) en canvi systemctl recarrega l'ocell té sentit utilitzar l'ordre configura birdc.
2) al router Mikrotik, en lloc de canviar el següent salt a la IP del segon costat del túnel /routing filter add action=accept chain=dynamic-in protocol=bgp comment="Estableix nexthop" set-in-nexthop=172.30.1.1 té sentit especificar la ruta directament a la interfície del túnel, sense l'adreça /routing filter add action=accept chain=dynamic-in protocol=bgp comment="Estableix nexthop" set-in-nexthop-direct=<nom de la interfície>

UPD5. Ha arribat un nou servei https://antifilter.download, d'on podeu agafar llistes ja fetes d'adreces IP. Actualitzat cada mitja hora. Per part del client, només queda emmarcar les entrades amb el corresponent “ruta... rebutjar”.
I això probablement n'hi ha prou per enganxar la meva àvia i actualitzar l'article.

UPD6. Una versió revisada de l'article per a aquells que no volen entendre, però volen començar - aquí.

Font: www.habr.com

Afegeix comentari