Agordi BGP por preteriri blokadon, aŭ "Kiel mi ĉesis timi kaj enamiĝis al RKN"

Nu, bone, pri "enamiĝis" estas troigo. Prefere "povus kunekzisti kun".

Kiel vi ĉiuj scias, ekde la 16-a de aprilo 2018, Roskomnadzor blokas aliron al rimedoj en la reto per ekstreme larĝaj strekoj, aldonante al la Unuigita Registro de domajnaj nomoj, montrilojn al paĝoj de retejoj en la Interreto kaj retajn adresojn, kiuj permesas vin. identigi retejojn en la Interreto, enhavantaj informojn, kies disvastigo estas malpermesita en Rusa Federacio” (en la teksto - nur registro) /10 foje. Kiel rezulto, la civitanoj de la Rusa Federacio kaj entreprenoj suferas, perdinte la aliron al la tute laŭleĝaj rimedoj, kiujn ili bezonas.

Post kiam mi diris en la komentoj al unu el la artikoloj pri Habré, ke mi pretas helpi la viktimojn pri starigo de pretervojo, pluraj homoj kontaktis min petante tian helpon. Kiam ĉio funkciis por ili, unu el ili rekomendis priskribi la teknikon en artikolo. Pripensinte, mi decidis rompi mian silenton en la retejo kaj provi unufoje skribi ion mezan inter projekto kaj afiŝo en Fejsbuko, t.e. habrapost. La rezulto estas antaŭ vi.

malgarantio

Ĉar ne estas tre laŭleĝe publikigi manierojn preterpasi blokadon de aliro al informoj malpermesitaj sur la teritorio de Rusa Federacio, la celo de ĉi tiu artikolo estos paroli pri metodo, kiu permesas vin aŭtomatigi aliron al rimedoj, kiuj estas permesitaj sur la teritorio. de la Rusa Federacio, sed pro ies agoj neatingeblaj rekte per via provizanto. Kaj aliro al aliaj rimedoj, akiritaj kiel rezulto de agoj de la artikolo, estas bedaŭrinda kromefiko kaj tute ne estas la celo de la artikolo.

Ankaŭ, ĉar mi estas ĉefe reta arkitekto laŭ profesio, alvokiĝo kaj vivvojo, programado kaj Linukso ne estas miaj fortoj. Tial, kompreneble, skriptoj povas esti skribitaj pli bone, sekurecproblemoj en VPS povas esti ellaboritaj pli profunde, ktp. Viaj proponoj estos akceptataj kun dankemo, se ili estos sufiĉe detalaj - mi volonte aldonos ilin al la teksto de la artikolo.

TL; DR

Ni aŭtomatigas aliron al rimedoj per via ekzistanta tunelo uzante kopion de la registro kaj la BGP-protokolo. La celo estas forigi ĉiun trafikon adresitan al blokitaj rimedoj en la tunelon. Minimuma klarigo, plejparte paŝo post paŝo instrukcioj.

Kion vi bezonas por ĉi tio

Bedaŭrinde, ĉi tiu afiŝo ne estas por ĉiuj. Por uzi ĉi tiun teknikon, vi devos kunmeti kelkajn elementojn:

  1. Vi devas havi linuksan servilon ie ekster la blokadkampo. Aŭ almenaŭ la deziro komenci tian servilon - ĉar ĝi nun kostas de $ 9 / jaro, kaj eble malpli. La metodo ankaŭ taŭgas se vi havas apartan VPN-tunelon, tiam la servilo povas troviĝi ene de la blokkampo.
  2. Via enkursigilo devas esti sufiĉe inteligenta por povi
    • ajna VPN-kliento, kiun vi ŝatas (mi preferas OpenVPN, sed ĝi povas esti PPTP, L2TP, GRE+IPSec, kaj ajna alia opcio kiu kreas tunelan interfacon);
    • BGPv4-protokolo. Kio signifas, ke por SOHO ĝi povas esti Mikrotik aŭ iu ajn enkursigilo kun OpenWRT/LEDE/simila kutima firmvaro kiu ebligas al vi instali Quagga aŭ Bird. La uzo de komputila enkursigilo ankaŭ ne estas malpermesita. Por entrepreno, vidu la dokumentaron por via landlima enkursigilo por BGP-subteno.
  3. Vi devus koni Linuksan uzadon kaj retajn teknologiojn, inkluzive de BGP. Aŭ almenaŭ volas havi tiun ideon. Ĉar mi ne estas preta akcepti la grandecon ĉi-foje, vi devos mem studi kelkajn punktojn, kiuj estas nekompreneblaj por vi. Tamen, mi kompreneble respondos specifajn demandojn en la komentoj kaj mi verŝajne ne estos la sola respondanta, do bonvolu demandi.

Kio estas uzata en la ekzemplo

  • Kopio de la registro https://github.com/zapret-info/z-i 
  • VPS - Ubuntu 16.04
  • Voja servo - birdo 1.6.3   
  • Enkursigilo - Mikrotik hAP ac
  • Funkciaj dosierujoj - ĉar ni laboras kiel radiko, plejparto de ĉio estos metita en la radikan hejman dosierujon. Respektive:
    • /root/blacklist - laboranta dosierujo kun kompila skripto
    • /root/zi - kopio de la registro de github
    • /etc/bird - norma birda servo agordo dosierujo
  • Ni akceptas 194.165.22.146, ASN 64998 kiel la eksteran IP-adreson de la VPS kun la enruta servilo kaj la tunela finpunkto; ekstera IP-adreso de la enkursigilo - 81.177.103.94, ASN 64999
  • La IP-adresoj ene de la tunelo estas 172.30.1.1 kaj 172.30.1.2, respektive.

Agordi BGP por preteriri blokadon, aŭ "Kiel mi ĉesis timi kaj enamiĝis al RKN"

Kompreneble, vi povas uzi iujn ajn aliajn enkursigilojn, operaciumojn kaj programajn produktojn, ĝustigante la solvon por konveni ilian logikon.

Mallonge - la logiko de la solvo

  1. Preparaj agoj
    1. Akirante VPS
    2. Ni levas la tunelon de la enkursigilo al la VPS
  2. Akirante kaj regule ĝisdatigi kopion de la registro
  3. Instalado kaj agordo de la envojiga servo
  4. Kreu liston de senmovaj itineroj por la envojiga servo bazita sur la registro
  5. Ni konektas la enkursigilon al la servo kaj starigas sendi la tutan trafikon tra la tunelo.

La reala decido

Preparaj agoj

En la vasteco de la reto estas multaj servoj, kiuj provizas VPS por ekstreme racia mono. Ĝis nun, mi trovis kaj uzis la opcion de $ 9/jaro, sed eĉ se vi ne vere ĝenas, ekzistas multaj ebloj por 1E/monato en ĉiu angulo. La demando pri elekto de VPS estas multe preter la amplekso de ĉi tiu artikolo, do se io ne estas klara al iu pri tio, demandu en la komentoj.

Se vi uzas VPS ne nur por la vojservo, sed ankaŭ por ĉesigi tunelon sur ĝi, vi devas levi ĉi tiun tunelon kaj, preskaŭ sendube, agordi NAT por ĝi. Estas granda nombro da instrukcioj en la reto por ĉi tiuj agoj, mi ne ripetos ilin ĉi tie. La ĉefa postulo por tia tunelo estas, ke ĝi devas krei apartan interfacon sur via enkursigilo, kiu subtenas la tunelon al la VPS. Plej uzataj VPN-teknologioj plenumas ĉi tiun postulon - ekzemple, OpenVPN en tun-reĝimo estas bona.

Akiru kopion de la registro

Kiel Jabrayil diris, "Kiu malhelpas nin helpos nin." Ĉar la RKN kreas registron de malpermesitaj rimedoj, estus peko ne uzi ĉi tiun registron por solvi nian problemon. Ni ricevos kopion de la registro de github.

Ni iras al via Linuksa servilo, falas en la kuntekston de root'a (sudo su-) kaj instalu git se ĝi ne estas jam instalita.

apt install git

Iru al via hejma dosierujo kaj eltiru kopion de la registro.

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

Agordu cron-ĝisdatigon (mi havas ĝin ĉiujn 20 minutojn, sed vi povas elekti ajnan intervalon, kiu interesas vin). Por fari tion, ni kuras crontab -e kaj aldonu la sekvan linion al ĝi:

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

Ni konektas hokon, kiu kreos dosierojn por la enruta servo post ĝisdatigo de la registro. Por fari tion, ni kreas dosieron /root/zi/.git/hooks/post-merge kun la jena enhavo:

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

kaj ne forgesu fari ĝin efektivigebla

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

La makebgp-skripto referencita de la hoko estos kreita poste.

Instalado kaj agordo de la envojiga servo

Instalu birdon. Bedaŭrinde, la versio de birdo nuntempe publikigita en la Ubuntu-deponejoj estas komparebla en freŝeco al Archaeopteryx-feko, do ni devas unue aldoni la oficialan PPA de la programistoj al la sistemo.

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

Post tio, ni tuj malŝaltas birdon por IPv6 - en ĉi tiu instalaĵo ni ne bezonos ĝin.

systemctl stop bird6
systemctl disable bird6

Malsupre estas minimumisma agorda dosiero por la birdservo (/etc/bird/bird.conf), kio sufiĉas por ni (kaj denove mi memorigas al vi, ke neniu malpermesas disvolvi kaj agordi la ideon laŭ viaj propraj bezonoj)

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-identigilo, videble simila al IPv4-adreso, sed ĝi ne estas. En nia kazo, ĝi povas esti ajna 32-bita nombro en la IPv4-adresformato, sed estas bona praktiko specifi la IPv4-adreson de via aparato (ĉi-kaze, VPS) tie.

protokolo rekta determinas kiuj interfacoj funkcios kun la envojiga procezo. La ekzemplo donas kelkajn ekzemplojn de nomoj, vi povas aldoni pli. Vi ankaŭ povas simple forigi la linion, en kiu kazo la servilo aŭskultos sur ĉiuj disponeblaj interfacoj kun IPv4-adreso.

protokolo statika estas nia magio, kiu ŝarĝas listojn de prefiksoj kaj ip-adresoj (kiuj estas, kompreneble, /32-prefiksoj) el dosieroj por posta anonco. De kie venas ĉi tiuj listoj, estos diskutita malsupre. Bonvolu noti, ke la ŝarĝo de ip-adresoj estas komentita defaŭlte, la kialo de tio estas la granda kvanto de alŝutado. Por komparo, en la momento de verkado de la artikolo, estas 78 linioj en la listo de prefiksoj, kaj en la listo de ip-adresoj 85898. Mi forte rekomendas, ke vi komencu kaj sencimu nur sur la listo de prefiksoj, kaj decidu ĉu aŭ ne. por ebligi ip-ŝarĝadon estonte post eksperimentado kun via enkursigilo. Ne ĉiu el ili povas facile digesti 85 mil enskribojn en la vojtabelo.

protokolo bgp efektive starigas bgp peering kun via enkursigilo. ip-adreso estas la adreso de la ekstera interfaco de la enkursigilo (aŭ la adreso de la tunela interfaco de la flanko de la enkursigilo), 64998 kaj 64999 estas la nombroj de aŭtonomaj sistemoj. En ĉi tiu kazo, ili povas esti asignitaj en la formo de ajnaj 16-bitaj nombroj, sed estas bona praktiko uzi AS-nombrojn el la privata gamo difinita de RFC6996 - 64512-65534 inkluzive (estas 32-bita ASN-formato, sed en nia kazo tio certe estas troa). La priskribita konfiguracio uzas eBGP peering, en kiu la aŭtonomiaj sistemnumeroj de la envojiga servo kaj la enkursigilo devas esti malsamaj.

Kiel vi povas vidi, la servo bezonas scii la IP-adreson de la enkursigilo, do se vi havas dinamikan aŭ ne-enrutigeblan privatan (RFC1918) aŭ komunan (RFC6598) adreson, vi ne havas eblon levi peering sur la ekstera interfaco, sed la servo ankoraŭ funkcios ene de la tunelo.

Ankaŭ estas sufiĉe travidebla, ke vi povas provizi plurajn malsamajn enkursigilojn per itineroj de unu servo - nur duobligu la agordojn por ili kopiante la protokolan bgp-sekcion kun ŝanĝado de la IP-adreso de la najbaro. Tial la ekzemplo montras la agordojn por peering ekster la tunelo, kiel la plej universalajn. Ne estas malfacile forigi ilin en la tunelon ŝanĝante la IP-adresojn en la agordoj laŭe.

Registra Pretigo por la Voja Servo

Nun ni bezonas, fakte, krei listojn de prefiksoj kaj ip-adresoj, kiuj estas menciitaj en la antaŭa paŝo en protokolo statika. Por fari tion, ni prenas la registran dosieron kaj faras el ĝi la dosierojn, kiujn ni bezonas per la sekva skripto, situanta en /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'

Ne forgesu fari ĝin efektivigebla

chmod +x /root/blacklist/makebgp

Nun vi povas ruli ĝin permane kaj observi la aspekton de dosieroj en /etc/bird.

Plej verŝajne, ĉi-momente birdo ne funkcias por vi, ĉar en la antaŭa etapo vi sugestis, ke ĝi serĉu dosierojn, kiuj ankoraŭ ne ekzistis. Tial ni lanĉas ĝin kaj kontrolas, ke ĝi komenciĝas:

systemctl start bird
birdc show route

La eligo de la dua komando devus montri ĉirkaŭ 80 enirojn (ĉi tio estas nuntempe, kaj kiam vi agordas ĝin, ĉio dependos de la fervoro de la ILV pri blokado de retoj) jene:

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

teamo

birdc show protocol

montros la staton de la protokoloj ene de la servo. Ĝis vi agordas la enkursigilon (vidu la sekvan paragrafon), la protokolo OurRouter estos en la komenca stato (Konekti aŭ Aktivaj fazoj), kaj post sukcesa konekto, ĝi iros en la suprenan staton (Estita fazo). Ekzemple, en mia sistemo, la eligo de ĉi tiu komando aspektas jene:

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

Konektante enkursigilon

Verŝajne ĉiuj jam tedas legi ĉi tiun piedtukon, sed kuraĝu - la fino estas proksima. Krome, en ĉi tiu sekcio mi ne povos doni paŝon post paŝo instrukciojn - ĝi estos malsama por ĉiu fabrikanto.

Tamen mi povas montri al vi kelkajn ekzemplojn. La ĉefa logiko estas altigi BGP-peering kaj alligi nexthop al ĉiuj ricevitaj prefiksoj, montrante nian tunelon (se vi bezonas eligi trafikon per la p2p-interfaco) aŭ nexthop-ip-adreso se la trafiko iras al ethernet).

Ekzemple, ĉe Mikrotik en RouterOS, ĉi tio estas solvita jene

/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

kaj en Cisco IOS - tiel

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 la okazo, ke la sama tunelo estas uzata kaj por BGP peering kaj por transdoni utilan trafikon, ne necesas agordi nexthop, ĝi estos ĝuste agordita per la protokolo. Sed se vi agordas ĝin permane, ĝi ankaŭ ne plimalboniĝos.

Sur aliaj platformoj, vi devos mem eltrovi la agordon, sed se vi havas malfacilaĵojn, skribu en la komentoj, mi provos helpi.

Post kiam via BGP-sesio altiĝis, itineroj al grandaj retoj alvenis kaj estas instalitaj en la tabelo, trafiko al la adresoj de ili malaperis kaj feliĉo estas proksima, vi povas reveni al la birdservo kaj provi malkomenti la tiean enskribon, kiu ligas la. listo de ip-adresoj, ekzekutu post tio

systemctl reload bird

kaj vidu kiel via enkursigilo translokigis ĉi tiujn 85 mil vojojn. Preparu malŝalti ĝin kaj pensi pri tio, kion fari kun ĝi 🙂

Tuta

Nur teorie, post plenumi la suprajn paŝojn, vi havas servon, kiu aŭtomate redirektas trafikon al IP-adresoj malpermesitaj en la Rusa Federacio preter la filtra sistemo.

Kompreneble ĝi povas esti plibonigita. Ekzemple, estas sufiĉe facile resumi liston de ip-adresoj per perl aŭ python-solvoj. Simpla perl-skripto faranta tion per Net::CIDR::Lite igas 85 mil prefiksojn en 60 (ne mil), sed nature kovras multe pli grandan gamon da adresoj ol estas blokita.

Ĉar la servo funkcias ĉe la tria nivelo de la modelo ISO / OSI, ĝi ne savos vin de blokado de retejo / paĝo se ĝi ne solvas al la adreso registrita en la registro. Sed kune kun la registro de github, alvenas la dosiero nxdomain.txt, kiu per kelkaj strekoj de la skripto facile iĝas fonto de adresoj por, ekzemple, la kromaĵo SwitchyOmega en Chrome.

Menciindas ankaŭ, ke la solvo postulas plian akrigidon, se vi ne estas nur interreta uzanto, sed ankaŭ publikigas kelkajn rimedojn de vi mem (ekzemple retejo aŭ poŝtservilo funkcias per ĉi tiu konekto). Per la enkursigilo, vi devas malfacile ligi elirantan trafikon de ĉi tiu servo al via publika adreso, alie vi perdos konekteblecon kun tiuj rimedoj, kiuj estas kovritaj de la listo de prefiksoj ricevitaj de la enkursigilo.

Se vi havas demandojn - demandu, preta respondi.

UPD. Dankon navion и TerAnYu por opcioj por git por redukti elŝutajn volumojn.

UPD2. Kolegoj, ŝajnas, ke mi eraris ne aldonante instrukciojn por starigi tunelon inter la VPS kaj la enkursigilo al la artikolo. Multaj demandoj estas kaŭzitaj de ĉi tio.
Ĉiaokaze, mi rimarkas denove - oni supozas, ke antaŭ ol komenci la paŝojn en ĉi tiu gvidilo, vi jam agordis la VPN-tunelon en la direkto, kiun vi bezonas kaj kontrolis ĝian agadon (ekzemple, envolvi trafikon tie defaŭlte aŭ statika). Se vi ankoraŭ ne kompletigis ĉi tiun fazon, vere ne havas sencon sekvi la paŝojn de la artikolo. Mi ankoraŭ ne havas mian propran tekston pri ĉi tio, sed se vi guglas "OpenVPN-servilo-agordo" kune kun la nomo de la operaciumo instalita sur la VPS, kaj "OpenVPN-kliento-agordo" kun la nomo de via enkursigilo, plej verŝajne vi trovos kelkajn artikolojn pri tiu ĉi temo , inkluzive pri Habré.

UPD3. Neoferebla skribis kodon, kiu faras la rezultan dosieron por birdo el dump.csv kun nedeviga sumo de ip-adresoj. Sekve, la sekcio "Registra prilaborado por la vojservo" povas esti anstataŭigita per alvoko al ĝia programo. https://habr.com/post/354282/#comment_10782712

UPD4. Iom da laboro pri la eraroj (ne kontribuis en la teksto):
1) anstataŭe systemctl reŝargi birdo estas senco uzi la komandon birdc agordi.
2) en la Mikrotik-enkursigilo, anstataŭ ŝanĝi la sekvan salton al la IP de la dua flanko de la tunelo /routing filter aldoni agon=akcepti ĉenon=dinamika-enprotokolo=bgp comment="Agordu nexthop" set-in-nexthop=172.30.1.1 havas sencon specifi la itineron rekte al la tunela interfaco, sen la adreso /routing filter add action=akcepti chain=dynamic-in protocol=bgp comment="Agordu nexthop" set-in-nexthop-direct=<interfaconomo>

UPD5. Nova servo alvenis https://antifilter.download, de kie oni povas preni pretajn listojn de ip-adresoj. Ĝisdatigita ĉiun duonhoron. Ĉe la kliento, restas nur enkadrigi la enskribojn kun la responda "itinero ... malakcepti".
Kaj tio verŝajne sufiĉas por ĉasi mian avinon kaj ĝisdatigi la artikolon.

UPD6. Reviziita versio de la artikolo por tiuj, kiuj ne volas kompreni, sed volas komenci - tie.

fonto: www.habr.com

Aldoni komenton