BGP nustatymas siekiant apeiti blokavimą arba „Kaip aš nustojau bijoti ir įsimylėjau RKN“

Na, gerai, apie „mylimą“ yra perdėta. Atvirkščiai, „galėjo sugyventi su“.

Kaip visi žinote, nuo 16 m. balandžio 2018 d. „Roskomnadzor“ itin plačiais potėpiais blokuoja prieigą prie išteklių internete, papildydama „Vieningą domenų vardų registrą, interneto svetainių puslapių indeksus ir tinklo adresus, leidžiančius identifikuoti svetaines“. internete“, kurioje yra informacija, kurios platinimas Rusijos Federacijoje yra draudžiamas“ (tekste - tik registras) kartais /10. Dėl to kenčia Rusijos Federacijos piliečiai ir įmonės, netekę galimybės naudotis visiškai teisėtais ištekliais, kurių jiems reikia.

Po to, kai vieno iš straipsnių apie Habré komentaruose pasakiau, kad esu pasirengęs padėti aukoms nustatant aplinkkelio schemą, keli žmonės kreipėsi į mane, prašydami tokios pagalbos. Kai jiems viskas pavyko, vienas iš jų rekomendavo aprašyti techniką straipsnyje. Kiek pagalvojęs nusprendžiau nutraukti tylą svetainėje ir vieną kartą pabandyti parašyti ką nors tarpinio tarp projekto ir Facebook įrašo, t.y. habrapostas. Rezultatas yra priešais jus.

Atsakomybės neigimas

Kadangi nėra labai teisėta skelbti būdus, kaip apeiti blokavimą prieigai prie Rusijos Federacijos teritorijoje draudžiamos informacijos, šio straipsnio tikslas bus pakalbėti apie metodą, leidžiantį automatizuoti prieigą prie išteklių, kurie leidžiami Rusijos Federacijos teritorijoje. Rusijos Federacijos teritorijoje, tačiau dėl kažkieno veiksmų nėra tiesiogiai pasiekiami per jūsų teikėją. Ir prieiga prie kitų išteklių, gautų atlikus veiksmus iš straipsnio, yra apgailėtinas šalutinis poveikis ir jokiu būdu nėra straipsnio tikslas.

Be to, kadangi pagal profesiją, pašaukimą ir gyvenimo kelią pirmiausia esu tinklo architektas, programavimas ir Linux nėra mano stipriosios pusės. Todėl, žinoma, scenarijus gali būti parašytas geriau, VPS saugumo problemos gali būti išspręstos giliau ir pan. Jūsų pasiūlymai bus priimti su dėkingumu, jei jie bus pakankamai išsamūs – mielai papildysiu juos straipsnio tekstu.

Lt; DR

Automatizuojame prieigą prie išteklių per esamą tunelį, naudodami registro kopiją ir BGP protokolą. Tikslas yra pašalinti visą srautą, nukreiptą į užblokuotus išteklius, į tunelį. Minimalūs paaiškinimai, dažniausiai nuoseklios instrukcijos.

Ko tau reikia?

Deja, šis įrašas skirtas ne visiems. Norėdami naudoti šią techniką, turėsite sujungti kelis elementus:

  1. Turite turėti Linux serverį kažkur už blokavimo lauko. Ar bent jau noras turėti tokį serverį – laimei, dabar jis kainuoja nuo 9 USD/metus, o gal ir mažiau. Metodas taip pat tinka, jei turite atskirą VPN tunelį, tada serveris gali būti blokavimo lauko viduje.
  2. Jūsų maršrutizatorius turi būti pakankamai protingas, kad galėtų tai padaryti
    • bet kuris jums patinkantis VPN klientas (man labiau patinka OpenVPN, bet tai gali būti PPTP, L2TP, GRE+IPSec ar bet kuri kita tunelinę sąsają kurianti parinktis);
    • BGPv4 protokolas. O tai reiškia, kad SOHO tai gali būti Mikrotik arba bet koks maršrutizatorius su OpenWRT/LEDE/panašia pasirinktine programine įranga, leidžiančia įdiegti Quagga arba Bird. Naudoti kompiuterio maršrutizatorių taip pat nedraudžiama. Jei tai įmonė, ieškokite BGP palaikymo savo pasienio maršrutizatoriaus dokumentacijoje.
  3. Turėtumėte išmanyti Linux naudojimą ir tinklo technologijas, įskaitant BGP protokolą. Arba bent jau nori turėti tokią idėją. Kadangi šį kartą nesu pasiruošęs priimti begalybės, kai kuriuos jums nesuprantamus aspektus turėsite išstudijuoti patys. Tačiau, žinoma, į konkrečius klausimus atsakysiu komentaruose ir vargu ar atsakysiu vienintelis, todėl nedvejodami klauskite.

Kas naudojamas pavyzdyje

  • Registro kopija – iš https://github.com/zapret-info/z-i 
  • VPS – Ubuntu 16.04
  • Maršruto parinkimo paslauga – paukštis 1.6.3   
  • Maršrutizatorius - Mikrotik hAP ac
  • Darbiniai aplankai – kadangi dirbame kaip root, dauguma visko bus šakniniame namų aplanke. Atitinkamai:
    • /root/blacklist – darbo aplankas su kompiliavimo scenarijumi
    • /root/zi – registro kopija iš github
    • /etc/bird – standartinis paukščių tarnybos nustatymų aplankas
  • VPS išorinis IP adresas su maršruto serveriu ir tunelio pabaigos tašku yra 194.165.22.146, ASN 64998; išorinis maršrutizatoriaus IP adresas - 81.177.103.94, ASN 64999
  • Tunelio viduje esantys IP adresai yra atitinkamai 172.30.1.1 ir 172.30.1.2.

BGP nustatymas siekiant apeiti blokavimą arba „Kaip aš nustojau bijoti ir įsimylėjau RKN“

Žinoma, galite naudoti bet kokius kitus maršrutizatorius, operacines sistemas ir programinės įrangos produktus, pritaikydami sprendimą pagal jų logiką.

Trumpai – sprendimo logika

  1. Parengiamieji veiksmai
    1. Gaukite VPS
    2. Tunelio pakėlimas nuo maršrutizatoriaus iki VPS
  2. Mes gauname ir reguliariai atnaujiname registro kopiją
  3. Maršruto paslaugos diegimas ir konfigūravimas
  4. Remdamiesi registru sudarome maršruto parinkimo paslaugos statinių maršrutų sąrašą
  5. Sujungiame maršrutizatorių prie paslaugos ir sukonfigūruojame viso srauto siuntimą tuneliu.

Tikrasis sprendimas

Parengiamieji veiksmai

Internete yra daug paslaugų, kurios teikia VPS už itin priimtiną kainą. Iki šiol radau ir naudoju variantą už 9 USD per metus, bet net jei per daug nesivargiate, yra daug variantų už 1E / mėn ant kiekvieno kampo. VPS pasirinkimo klausimas yra toli už šio straipsnio taikymo srities, todėl jei kas nors ko nors nesupranta, klauskite komentaruose.

Jei naudojate VPS ne tik maršruto parinkimo paslaugai, bet ir jame esančiam tuneliui nutraukti, turite pakelti šį tunelį ir beveik neabejotinai sukonfigūruoti jam NAT. Internete yra daugybė instrukcijų apie šiuos veiksmus, čia jų nekartosiu. Pagrindinis reikalavimas tokiam tuneliui yra tas, kad jis turi sukurti atskirą sąsają jūsų maršrutizatoriuje, kuri palaikytų tunelį link VPS. Dauguma naudojamų VPN technologijų atitinka šį reikalavimą – pavyzdžiui, OpenVPN tun režimu yra tobulas.

Gauti registro kopiją

Kaip sakė Jabrailas: „Tas, kuris mums trukdo, mums padės“. Kadangi RKN kuria draudžiamų išteklių registrą, būtų nuodėmė nepanaudoti šio registro sprendžiant mūsų problemą. Mes gausime registro kopiją iš github.

Einame į jūsų Linux serverį, patenkame į šakninį kontekstą (sudo su -) ir įdiekite git, jei jis dar neįdiegtas.

apt install git

Eikite į savo namų katalogą ir ištraukite registro kopiją.

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

Mes nustatėme cron atnaujinimą (aš tai darau kartą per 20 minučių, bet galite pasirinkti bet kokį jus dominantį intervalą). Norėdami tai padaryti, paleidžiame crontab -e ir pridėkite prie jo šią eilutę:

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

Sujungiame kabliuką, kuris atnaujinus registrą sukurs failus maršruto parinkimo paslaugai. Norėdami tai padaryti, sukurkite failą /root/zi/.git/hooks/post-merge su tokiu turiniu:

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

ir nepamirškite padaryti jo vykdomo

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

Šiek tiek vėliau sukursime makebgp scenarijų, kurį kabliukas nurodo.

Maršruto paslaugos diegimas ir konfigūravimas

Įdiekite paukštį. Deja, šiuo metu Ubuntu saugyklose paskelbta paukščio versija savo šviežumu prilygsta Archeopteryx išmatoms, todėl pirmiausia turime į sistemą įtraukti oficialų programinės įrangos kūrėjų PPA.

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

Po to iš karto išjungiame paukštį IPv6 - mums to nereikės šiame diegime.

systemctl stop bird6
systemctl disable bird6

Žemiau yra minimalistinis paukščių tarnybos konfigūracijos failas (/etc/bird/bird.conf), kurio mums visiškai užtenka (ir dar kartą primenu, kad niekas nedraudžia plėtoti ir derinti idėjos pagal savo poreikius)

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 – maršrutizatoriaus identifikatorius, kuris vizualiai atrodo kaip IPv4 adresas, bet nėra vienas. Mūsų atveju tai gali būti bet koks 32 bitų skaičius IPv4 adreso formatu, tačiau tinkama forma tiksliai nurodyti savo įrenginio IPv4 adresą (šiuo atveju VPS).

Protocol direct apibrėžia, kurios sąsajos veiks su maršruto parinkimo procesu. Pavyzdyje pateikiami keli pavyzdiniai pavadinimai, galite pridėti kitų. Galite tiesiog ištrinti eilutę; tokiu atveju serveris klausys visų galimų sąsajų su IPv4 adresu.

Protocol static yra mūsų magija, kuri įkelia prefiksų ir IP adresų sąrašus (kurie, žinoma, iš tikrųjų yra /32 prefiksai) iš failų, kad būtų galima vėliau paskelbti. Iš kur gauti šie sąrašai, bus aptarta toliau. Atkreipkite dėmesį, kad IP adresų įkėlimas komentuojamas pagal numatytuosius nustatymus, todėl to priežastis yra didelis įkėlimų kiekis. Palyginimui, rašymo metu priešdėlių sąraše yra 78 eilutės, o IP adresų sąraše - 85898. Labai rekomenduoju pradėti ir derinti tik priešdėlių sąraše ir ar įjungti IP įkėlimą Ateitis priklauso nuo jūsų, paeksperimentuodami su maršruto parinktuvu. Ne kiekvienas iš jų gali lengvai suvirškinti 85 tūkstančius maršrutų lentelės įrašų.

protokolas bgp, tiesą sakant, nustato bgp tarpusavio ryšį su jūsų maršruto parinktuvu. IP adresas yra išorinės maršrutizatoriaus sąsajos adresas (arba tunelio sąsajos adresas maršrutizatoriaus pusėje), 64998 ir 64999 yra autonominių sistemų numeriai. Šiuo atveju juos galima priskirti bet kokių 16 bitų skaičių forma, tačiau gera praktika yra naudoti AS numerius iš privataus diapazono, apibrėžto RFC6996 – 64512-65534 imtinai (yra 32 bitų ASN formatas, bet mūsų atveju tai tikrai per daug). Apibūdintoje konfigūracijoje naudojamas eBGP peering, kuriame maršruto parinkimo tarnybos ir maršrutizatoriaus autonominių sistemų numeriai turi skirtis.

Kaip matote, paslauga turi žinoti maršrutizatoriaus IP adresą, taigi, jei turite dinaminį arba nenukreiptą privatų (RFC1918) arba bendrinamą (RFC6598) adresą, neturite galimybės padidinti ryšio išoriniame tinkle. sąsaja, tačiau paslauga vis tiek veiks tunelyje.

Taip pat visiškai aišku, kad iš vienos paslaugos galite pateikti maršrutus keliems skirtingiems maršrutizatoriams – tiesiog dubliuokite jų nustatymus nukopijuodami protokolo bgp skyrių ir pakeisdami kaimyno IP adresą. Štai kodėl pavyzdyje pateikiami universaliausi žiūrėjimo už tunelio nustatymai. Juos lengva pašalinti į tunelį atitinkamai pakeitus IP adresus nustatymuose.

Apdorojamas maršruto parinkimo paslaugos registras

Dabar iš tikrųjų turime sudaryti priešdėlių ir IP adresų sąrašus, kurie buvo paminėti ankstesniame etape. Norėdami tai padaryti, paimame registro failą ir iš jo sukuriame mums reikalingus failus naudodami šį įdėtą scenarijų /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'

Nepamirškite, kad jis būtų vykdomas

chmod +x /root/blacklist/makebgp

Dabar galite jį paleisti rankiniu būdu ir stebėti failų išvaizdą /etc/bird.

Greičiausiai paukštis šiuo metu jums neveikia, nes ankstesniame etape paprašėte jo ieškoti failų, kurių dar nebuvo. Todėl mes jį paleidžiame ir patikriname, ar jis prasidėjo:

systemctl start bird
birdc show route

Antrosios komandos išvestis turėtų parodyti apie 80 įrašų (kol kas tai yra, bet kai jį nustatysite, viskas priklausys nuo RKN uolumo blokuojant tinklus) maždaug taip:

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

Komanda

birdc show protocol

parodys paslaugos protokolų būseną. Kol nesukonfigūravote maršrutizatoriaus (žr. kitą punktą), OurRouter protokolas bus pradinėje būsenoje (Connect arba Active fazė), o po sėkmingo prisijungimo pereis į aukštyn būseną (Established phase). Pavyzdžiui, mano sistemoje šios komandos išvestis atrodo taip:

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

Maršrutizatoriaus prijungimas

Tikriausiai visiems jau atsibodo skaityti šią kojytę, bet nusiramink – pabaiga arti. Be to, šiame skyriuje negalėsiu duoti nuoseklių instrukcijų – kiekvienam gamintojui jis bus skirtingas.

Tačiau galiu parodyti porą pavyzdžių. Pagrindinė logika yra padidinti BGP peering ir priskirti nexthop visiems gaunamiems prefiksams, nukreipiant į mūsų tunelį (jei reikia siųsti srautą per p2p sąsają) arba nexthop IP adresą, jei srautas bus nukreiptas į eternetą).

Pavyzdžiui, „RouterOS“ „Mikrotik“ tai išspręsta taip

/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

o Cisco IOS – kaip ši

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

Jei tas pats tunelis naudojamas tiek BGP perjungimui, tiek naudingam srautui perduoti, nexthop nustatyti nebūtina, jis bus nustatytas teisingai naudojant protokolą. Bet jei nustatysite rankiniu būdu, tai taip pat nepablogins.

Kitose platformose konfigūraciją teks išsiaiškinti patiems, bet jei kils sunkumų, rašykite komentaruose, pasistengsiu padėti.

Prasidėjus BGP seansui, atkeliavus ir į lentelę įdiegus maršrutus į didelius tinklus, srautas iš jų nutekėjo į adresus ir laimė jau arti, galite grįžti į paukščių tarnybą ir pabandyti iškomentuoti ten esantį įrašą, kuris jungia IP adresų sąrašą, paleiskite po to

systemctl reload bird

ir pažiūrėkite, kaip jūsų maršrutizatorius perkėlė šiuos 85 tūkstančius maršrutų. Būkite pasirengę atjungti ir galvoti, ką su juo daryti :)

Iš viso

Grynai teoriškai, atlikę aukščiau aprašytus veiksmus, dabar turite paslaugą, kuri automatiškai nukreipia srautą į IP adresus, uždraustus Rusijos Federacijoje už filtravimo sistemos.

Tai, žinoma, gali būti patobulinta. Pavyzdžiui, gana lengva apibendrinti IP adresų sąrašą naudojant perl arba python sprendimus. Paprastas Perl scenarijus, atliekantis tai naudojant Net::CIDR::Lite, paverčia 85 tūkstančius priešdėlių į 60 (ne tūkstančius), bet, žinoma, apima daug didesnį adresų diapazoną nei yra užblokuotas.

Kadangi paslauga veikia trečiajame ISO/OSI modelio lygyje, ji neapsaugos jūsų nuo svetainės / puslapio blokavimo, jei ji bus nukreipta į neteisingą registre įrašytą adresą. Tačiau kartu su registru iš github atkeliauja failas nxdomain.txt, kuris keliais scenarijaus potėpiais lengvai virsta, pavyzdžiui, SwitchyOmega įskiepio „Chrome“ adresų šaltiniu.

Taip pat būtina paminėti, kad sprendimas reikalauja papildomo tobulinimo, jei esate ne tik interneto vartotojas, bet ir patys skelbiate kai kuriuos išteklius (pavyzdžiui, šiuo ryšiu veikia svetainė ar pašto serveris). Naudojant maršrutizatoriaus priemones, iš šios paslaugos išeinantį srautą būtina griežtai susieti su savo viešuoju adresu, kitaip prarasite ryšį su tais ištekliais, kuriuos apima maršrutizatoriaus gaunamų prefiksų sąrašas.

Jei turite klausimų, klauskite, aš pasiruošęs atsakyti.

UPD. Ačiū navigacija и TerAnYu git parametrams, kurie leidžia sumažinti atsisiuntimo apimtis.

UPD2. Kolegos, panašu, kad padariau klaidą, nes prie straipsnio nepridėjau tunelio tarp VPS ir maršrutizatoriaus nustatymo instrukcijos. Dėl to kyla daug klausimų.
Tik tuo atveju, dar kartą pažymėsiu, kad prieš pradėdami šį vadovą jau sukonfigūravote VPN tunelį jums reikalinga kryptimi ir patikrinote jo funkcionalumą (pavyzdžiui, nukreipdami srautą ten pagal numatytuosius nustatymus arba statiškai). Jei dar nebaigėte šio etapo, nėra prasmės sekti straipsnyje nurodytus veiksmus. Aš dar neturiu savo teksto šiuo klausimu, bet jei „Google“ ieškote „OpenVPN serverio nustatymas“ kartu su VPS įdiegtos operacinės sistemos pavadinimu ir „OpenVPN kliento nustatymas“ su maršrutizatoriaus pavadinimu , greičiausiai rasite daugybę straipsnių šia tema , įskaitant apie Habré.

UPD3. Nepaaukotas Parašiau kodą, kuris dump.csv paverčia gautu paukščio failu su pasirenkama IP adresų santrauka. Todėl skyrių „Maršrutizavimo paslaugos registro apdorojimas“ galima pakeisti iškvietus jos programą. https://habr.com/post/354282/#comment_10782712

UPD4. Šiek tiek padirbėjau su klaidomis (į tekstą jų nepridėjau):
1) vietoj systemctl perkrauti paukštį prasminga naudoti komandą birdc konfigūruoti.
2) Mikrotik maršrutizatoriuje, užuot pakeitus nexthop į antrosios tunelio pusės IP /routing filter add action=accept chain=dynamic-in protocol=bgp comment=»Nustatyti nexthop» set-in-nexthop=172.30.1.1 tikslinga nurodyti maršrutą tiesiai į tunelio sąsają, be adreso /routing filter add action=accept chain=dynamic-in protocol=bgp comment=»Nustatyti nexthop» set-in-nexthop-direct=<sąsajos pavadinimas>

UPD5. Atsirado nauja paslauga https://antifilter.download, iš kur galite pasiimti paruoštus IP adresų sąrašus. Atnaujinama kas pusvalandį. Kliento pusėje belieka įrašus įrėminti atitinkamu „maršrutas... atmesti“.
Ir šiuo metu, ko gero, užtenka nušluostyti močiutę ir atnaujinti straipsnį.

UPD6. Patikslinta straipsnio versija tiems, kurie nenori to išsiaiškinti, bet nori pradėti - čia.

Šaltinis: www.habr.com

Добавить комментарий