Impostazione di BGP per aggirare il blocco o "Come ho smesso di avere paura e mi sono innamorato di RKN"

Bene, ok, parlare di "innamorarsi" è un'esagerazione. Piuttosto "potrebbe coesistere con".

Come tutti sapete, dal 16 aprile 2018, Roskomnadzor blocca l'accesso alle risorse della rete in modo estremamente ampio, aggiungendo al registro unificato dei nomi di dominio puntatori a pagine di siti su Internet e indirizzi di rete che consentono di identificare i siti su Internet che contengono informazioni la cui diffusione è vietata nella Federazione Russa” (nel testo - solo un registro) /10 a volte. Di conseguenza, i cittadini della Federazione Russa e le imprese soffrono, avendo perso l’accesso alle risorse completamente legali di cui hanno bisogno.

Dopo che nei commenti a uno degli articoli su Habré ho detto che ero pronto ad aiutare le vittime a creare uno schema di bypass, diverse persone mi hanno contattato chiedendo questo aiuto. Quando tutto ha funzionato per loro, uno di loro ha consigliato di descrivere la tecnica in un articolo. Riflettendoci, ho deciso di rompere il silenzio sul sito e provare per una volta a scrivere qualcosa di intermedio tra un progetto e un post su Facebook, ovvero habrapost. Il risultato è davanti a te.

Negazione di responsabilità

Poiché non è molto legale pubblicare modi per aggirare il blocco dell'accesso alle informazioni vietate sul territorio della Federazione Russa, lo scopo di questo articolo sarà quello di parlare di un metodo che consenta di automatizzare l'accesso alle risorse consentite sul territorio della Federazione Russa, ma a causa delle azioni di qualcuno non è accessibile direttamente tramite il tuo provider. E l'accesso ad altre risorse, ottenuto a seguito delle azioni dell'articolo, è uno sfortunato effetto collaterale e non è affatto lo scopo dell'articolo.

Inoltre, poiché sono principalmente un architetto di rete per professione, vocazione e percorso di vita, la programmazione e Linux non sono i miei punti di forza. Pertanto, ovviamente, gli script possono essere scritti meglio, i problemi di sicurezza nel VPS possono essere risolti in modo più approfondito, ecc. I tuoi suggerimenti saranno accettati con gratitudine, se saranno sufficientemente dettagliati: sarò felice di aggiungerli al testo dell'articolo.

TL; DR

Automatizziamo l'accesso alle risorse attraverso il tuo tunnel esistente utilizzando una copia del registro e il protocollo BGP. L'obiettivo è rimuovere nel tunnel tutto il traffico indirizzato alle risorse bloccate. Spiegazione minima, per lo più istruzioni passo passo.

Di cosa hai bisogno per questo?

Purtroppo questo post non è per tutti. Per utilizzare questa tecnica, dovrai mettere insieme alcuni elementi:

  1. Devi avere un server Linux da qualche parte fuori dal campo di blocco. O almeno il desiderio di avviare un server del genere, poiché ora costa da $ 9 all'anno, e forse meno. Il metodo è adatto anche se si dispone di un tunnel VPN separato, quindi il server può trovarsi all'interno del campo di blocco.
  2. Il tuo router deve essere abbastanza intelligente per poterlo fare
    • qualsiasi client VPN che preferisci (preferisco OpenVPN, ma può essere PPTP, L2TP, GRE+IPSec e qualsiasi altra opzione che crei un'interfaccia tunnel);
    • Protocollo BGPv4. Ciò significa che per SOHO può essere Mikrotik o qualsiasi router con OpenWRT/LEDE/firmware personalizzato simile che ti consenta di installare Quagga o Bird. Non è inoltre vietato l'uso di un router per PC. Per un'azienda, consulta la documentazione del router di confine per il supporto BGP.
  3. Dovresti avere familiarità con l'utilizzo di Linux e le tecnologie di rete, incluso BGP. O almeno voglio avere quell'idea. Poiché questa volta non sono pronto ad abbracciare l'immensità, dovrai studiare da solo alcuni punti che ti sono incomprensibili. Tuttavia, ovviamente risponderò a domande specifiche nei commenti e difficilmente sarò l’unico a rispondere, quindi sentiti libero di chiedere.

Cosa viene utilizzato nell'esempio

  • Copia del registro https://github.com/zapret-info/z-i 
  • VPS-Ubuntu 16.04
  • Servizio di instradamento - uccello 1.6.3   
  • Router- Mikrotik hAP ac
  • Cartelle di lavoro: poiché stiamo lavorando come root, la maggior parte di tutto verrà inserito nella cartella home root. Rispettivamente:
    • /root/blacklist - cartella di lavoro con script di compilazione
    • /root/zi - copia del registro da github
    • /etc/bird - cartella standard delle impostazioni del servizio bird
  • Accettiamo 194.165.22.146, ASN 64998 come indirizzo IP esterno del VPS con il server di routing e il punto terminale del tunnel; indirizzo IP esterno del router - 81.177.103.94, ASN 64999
  • Gli indirizzi IP all'interno del tunnel sono rispettivamente 172.30.1.1 e 172.30.1.2.

Impostazione di BGP per aggirare il blocco o "Come ho smesso di avere paura e mi sono innamorato di RKN"

Naturalmente, puoi utilizzare qualsiasi altro router, sistema operativo e prodotto software, adattando la soluzione alla sua logica.

In breve: la logica della decisione

  1. Azioni preparatorie
    1. Ottenere un VPS
    2. Alziamo il tunnel dal router al VPS
  2. Ottenere e aggiornare regolarmente una copia del registro
  3. Installazione e configurazione del servizio di routing
  4. Creare un elenco di route statiche per il servizio di routing in base al registro
  5. Colleghiamo il router al servizio e impostiamo l'invio di tutto il traffico attraverso il tunnel.

La soluzione reale

Azioni preparatorie

Nella vastità della rete ci sono molti servizi che forniscono VPS a prezzi estremamente ragionevoli. Finora ho trovato e utilizzato l’opzione per $ 9/anno, ma anche se non ti preoccupi davvero, ci sono molte opzioni per 1 E/mese ad ogni angolo. La questione della scelta di un VPS va ben oltre lo scopo di questo articolo, quindi se qualcosa non è chiaro a qualcuno al riguardo, chiedilo nei commenti.

Se si utilizza un VPS non solo per il servizio di routing, ma anche per terminare un tunnel su di esso, è necessario alzare questo tunnel e, quasi certamente, configurare il NAT per esso. Ci sono molte istruzioni su queste azioni su Internet, non le ripeterò qui. Il requisito principale per un tunnel di questo tipo è la creazione di un'interfaccia separata sul router che supporti il ​​tunnel verso il VPS. Le tecnologie VPN più utilizzate soddisfano questo requisito: ad esempio, OpenVPN in modalità tun va bene.

Ottieni una copia del registro

Come ha detto Jabrayil: "Colui che ci ostacola ci aiuterà". Poiché l'RKN sta creando un registro delle risorse proibite, sarebbe un peccato non utilizzare questo registro per risolvere il nostro problema. Riceveremo una copia del registro da github.

Andiamo sul tuo server Linux, entriamo nel contesto di root'a (sudo su-) e installa git se non è già installato.

apt install git

Vai alla tua home directory ed estrai una copia del registro.

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

Imposta un aggiornamento cron (lo faccio ogni 20 minuti, ma puoi scegliere qualsiasi intervallo che ti interessa). Per fare questo, lanciamo crontab -e e aggiungici la seguente riga:

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

Colleghiamo un hook che creerà file per il servizio di routing dopo aver aggiornato il registro. Per fare ciò, creiamo un file /root/zi/.git/hooks/post-merge con il seguente contenuto:

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

e non dimenticare di renderlo eseguibile

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

Lo script makebgp a cui fa riferimento l'hook verrà creato in seguito.

Installazione e configurazione del servizio di routing

Installa l'uccello. Sfortunatamente, la versione di bird attualmente rilasciata nei repository di Ubuntu è paragonabile in termini di freschezza alle feci di Archaeopteryx, quindi dobbiamo prima aggiungere al sistema il PPA ufficiale degli sviluppatori del software.

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

Successivamente disabilitiamo immediatamente bird per IPv6: non ne avremo bisogno in questa installazione.

systemctl stop bird6
systemctl disable bird6

Di seguito è riportato un file di configurazione minimalista per il servizio bird (/etc/bird/bird.conf), che per noi è più che sufficiente (e vi ricordo ancora una volta che nessuno vieta di sviluppare e adattare l'idea alle proprie esigenze)

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 - identificatore del router, visivamente sembra un indirizzo IPv4, ma non lo è. Nel nostro caso, può essere qualsiasi numero a 32 bit nel formato dell'indirizzo IPv4, ma è buona norma specificare lì l'indirizzo IPv4 del tuo dispositivo (in questo caso, VPS).

il protocollo diretto determina quali interfacce funzioneranno con il processo di routing. L'esempio fornisce un paio di esempi di nomi, puoi aggiungerne altri. Puoi anche semplicemente eliminare la linea, nel qual caso il server ascolterà su tutte le interfacce disponibili con un indirizzo IPv4.

il protocollo statico è la nostra magia che carica elenchi di prefissi e indirizzi IP (che sono, ovviamente, prefissi /32) dai file per annunci successivi. La provenienza di questi elenchi verrà discussa di seguito. Tieni presente che il caricamento degli indirizzi IP è commentato per impostazione predefinita, il motivo è la grande quantità di caricamento. Per fare un confronto, al momento della stesura dell'articolo, ci sono 78 righe nell'elenco dei prefissi e nell'elenco degli indirizzi IP 85898. Consiglio vivamente di avviare ed eseguire il debug solo sull'elenco dei prefissi e decidere se o meno per abilitare il caricamento dell'IP in futuro dopo aver sperimentato il router. Non tutti riescono a digerire facilmente 85mila voci nella tabella di routing.

il protocollo bgp configura effettivamente il peering bgp con il router. indirizzo ip è l'indirizzo dell'interfaccia esterna del router (o l'indirizzo dell'interfaccia del tunnel dal lato del router), 64998 e 64999 sono i numeri dei sistemi autonomi. In questo caso, possono essere assegnati sotto forma di numeri qualsiasi a 16 bit, ma è buona pratica utilizzare numeri AS dell'intervallo privato definito da RFC6996 - 64512-65534 compreso (esiste un formato ASN a 32 bit, ma nel nostro caso questo è decisamente eccessivo). La configurazione descritta utilizza il peering eBGP, in cui i numeri di sistema autonomi del servizio di routing e del router devono essere diversi.

Come puoi vedere, il servizio deve conoscere l'indirizzo IP del router, quindi se disponi di un indirizzo privato (RFC1918) o condiviso (RFC6598) dinamico o non instradabile, non hai la possibilità di aumentare il peering sull'interfaccia esterna, ma il servizio continuerà a funzionare all'interno del tunnel.

È anche abbastanza trasparente che tu possa fornire a diversi router diversi percorsi da un servizio: basta duplicare le impostazioni per loro copiando la sezione del protocollo bgp modificando l'indirizzo IP del vicino. Ecco perché l'esempio mostra le impostazioni per il peering all'esterno del tunnel, come le più universali. Non è difficile rimuoverli nel tunnel modificando di conseguenza gli indirizzi IP nelle impostazioni.

Elaborazione del registro per il servizio di routing

Ora dobbiamo, infatti, creare elenchi di prefissi e indirizzi IP, menzionati nel passaggio precedente nel protocollo statico. Per fare ciò, prendiamo il file di registro e ne ricaviamo i file di cui abbiamo bisogno con il seguente script, situato in /root/lista nera/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'

Non dimenticare di renderlo eseguibile

chmod +x /root/blacklist/makebgp

Ora puoi eseguirlo manualmente e osservare l'aspetto dei file in /etc/bird.

Molto probabilmente in questo momento bird non funziona per te, perché nella fase precedente gli hai suggerito di cercare file che ancora non esistevano. Pertanto, lo lanciamo e controlliamo che si avvii:

systemctl start bird
birdc show route

L'output del secondo comando dovrebbe mostrare circa 80 voci (questo è al momento, e quando lo configurerai, tutto dipenderà dallo zelo dell'ILV nel bloccare le reti) in questo modo:

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

Squadra

birdc show protocol

mostrerà lo stato dei protocolli all'interno del servizio. Fino a quando non si configura il router (vedere il paragrafo successivo), il protocollo OurRouter sarà nello stato iniziale (fase Connect o Active) e, dopo una connessione riuscita, passerà allo stato up (fase Stabilita). Ad esempio, sul mio sistema, l'output di questo comando è simile al seguente:

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

Collegamento di un router

Probabilmente tutti sono già stanchi di leggere questa coperta, ma fatti coraggio: la fine è vicina. Inoltre, in questa sezione non potrò fornire istruzioni passo passo: sarà diverso per ciascun produttore.

Posso però mostrarvi un paio di esempi. La logica principale è aumentare il peering BGP e allegare nexthop a tutti i prefissi ricevuti, puntando al nostro tunnel (se è necessario inviare il traffico attraverso l'interfaccia p2p) o all'indirizzo IP nexthop se il traffico va su Ethernet).

Ad esempio, su Mikrotik in RouterOS, questo viene risolto come segue

/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

e in Cisco IOS - in questo modo

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

Nel caso in cui lo stesso tunnel venga utilizzato sia per il peering BGP che per la trasmissione del traffico utile, non è necessario impostare il nexthop, verrà impostato correttamente tramite il protocollo. Ma se lo imposti manualmente, non peggiorerà neanche.

Su altre piattaforme dovrai capire da solo la configurazione, ma se hai difficoltà scrivi nei commenti, cercherò di aiutarti.

Dopo che la tua sessione BGP è aumentata, i percorsi verso reti di grandi dimensioni sono arrivati ​​e sono installati nella tabella, il traffico verso gli indirizzi da essi è sparito e la felicità è vicina, puoi tornare al servizio bird e provare a rimuovere il commento dalla voce che collega il elenco di indirizzi IP, eseguilo successivamente

systemctl reload bird

e guarda come il tuo router ha trasferito questi 85mila percorsi. Preparati a spegnerlo e pensa a cosa farne 🙂

In totale

In teoria, dopo aver eseguito i passaggi precedenti, disponi di un servizio che reindirizza automaticamente il traffico verso indirizzi IP vietati nella Federazione Russa oltre il sistema di filtraggio.

Ovviamente può essere migliorato. Ad esempio, è abbastanza semplice riassumere un elenco di indirizzi IP tramite soluzioni Perl o Python. Un semplice script Perl che esegue questa operazione con Net::CIDR::Lite trasforma 85mila prefissi in 60 (non migliaia), ma copre naturalmente una gamma di indirizzi molto più ampia di quella bloccata.

Poiché il servizio opera al terzo livello del modello ISO/OSI, non ti salverà dal blocco del sito/pagina se non si risolve all'indirizzo registrato nel registro. Ma insieme al registro di github arriva il file nxdomain.txt, che con pochi tratti dello script si trasforma facilmente in una fonte di indirizzi, ad esempio, per il plugin SwitchyOmega in Chrome.

Va anche detto che la soluzione richiede un ulteriore perfezionamento se non sei solo un utente di Internet, ma pubblichi anche alcune tue risorse (ad esempio, su questa connessione viene eseguito un sito Web o un server di posta). Tramite il router è necessario vincolare il traffico in uscita da questo servizio al proprio indirizzo pubblico, altrimenti si perderà la connettività con quelle risorse che sono coperte dall'elenco dei prefissi ricevuti dal router.

Se hai domande, chiedi, pronto a rispondere.

AGGIORNAMENTO. Grazie navicella и TerAnYu per le opzioni di git per ridurre i volumi di download.

UPD2. Colleghi, sembra che io abbia commesso un errore non aggiungendo all'articolo le istruzioni per la creazione di un tunnel tra il VPS e il router. Molte domande sono causate da questo.
Per ogni evenienza, lo ripeto: si presuppone che prima di iniziare i passaggi di questa guida, tu abbia già configurato il tunnel VPN nella direzione che ti serve e ne abbia controllato le prestazioni (ad esempio, avvolgendo il traffico lì per impostazione predefinita o statico). Se non hai ancora completato questa fase, non ha davvero senso seguire i passaggi dell'articolo. Finora non ho un testo personale su questo argomento, ma se cerchi su Google "configurazione del server OpenVPN" insieme al nome del sistema operativo installato sul VPS e "configurazione del client OpenVPN" con il nome del tuo router, molto probabilmente troverai numerosi articoli su questo argomento, anche su Habré.

UPD3. Non sacrificato ha scritto un codice che crea il file risultante per bird da dump.csv con somma facoltativa degli indirizzi IP. Pertanto, la sezione "Elaborazione del registro per il servizio di routing" può essere sostituita con una chiamata al suo programma. https://habr.com/post/354282/#comment_10782712

UPD4. Un piccolo lavoro sugli errori (non ha contribuito nel testo):
1) invece systemctl ricarica uccello ha senso usare il comando configurare birdc.
2) nel router Mikrotik, invece di cambiare il next-hop nell'IP del secondo lato del tunnel /routing filter add action=accept chain=dynamic-in protocol=bgp comment="Imposta nexthop" set-in-nexthop=172.30.1.1 ha senso specificare il percorso direttamente all'interfaccia del tunnel, senza l'indirizzo /routing filter add action=accept chain=dynamic-in protocol=bgp comment="Imposta nexthop" set-in-nexthop-direct=<nome interfaccia>

UPD5. È arrivato un nuovo servizio https://antifilter.download, da dove puoi prendere elenchi già pronti di indirizzi IP. Aggiornato ogni mezz'ora. Lato client non resta che inquadrare le voci con il relativo “route...reject”.
E questo probabilmente basterà per scopare mia nonna e aggiornare l'articolo.

UPD6. Una versione rivista dell'articolo per coloro che non vogliono capire, ma vogliono iniziare - qui.

Fonte: habr.com

Aggiungi un commento