Vendosja e BGP për të anashkaluar bllokimin, ose "Si ndalova së frikësuari dhe rashë në dashuri me RKN"

Epo, në rregull, për "të dashuruar" është një ekzagjerim. Përkundrazi, "ishte në gjendje të bashkëjetonte me".

Siç e dini të gjithë, që nga 16 prilli 2018, Roskomnadzor ka bllokuar aksesin në burimet në internet në hapa jashtëzakonisht të gjerë, duke shtuar në "Regjistrin e unifikuar të emrave të domeneve, indekseve të faqeve të faqeve në internet dhe adresave të rrjetit që lejojnë identifikimin e faqeve në internet", që përmban informacione, shpërndarja e të cilave është e ndaluar në Federatën Ruse" (në tekst - vetëm një regjistër) nga /10 ndonjëherë. Si rezultat, qytetarët e Federatës Ruse dhe bizneset po vuajnë, duke humbur aksesin në burimet plotësisht të ligjshme që u nevojiten.

Pasi thashë në komentet e një prej artikujve në Habré se isha gati të ndihmoja viktimat në ngritjen e një skeme bypass, disa njerëz erdhën tek unë duke kërkuar një ndihmë të tillë. Kur gjithçka funksionoi për ta, njëri prej tyre rekomandoi të përshkruante teknikën në një artikull. Pas një mendimi, vendosa të thyej heshtjen time në faqe dhe të përpiqem për një herë të shkruaj diçka të ndërmjetme midis një projekti dhe një postimi në Facebook, d.m.th. habrapost. Rezultati është para jush.

Mohim përgjegjësie

Meqenëse nuk është shumë e ligjshme të publikohen mënyra për të anashkaluar bllokimin e aksesit në informacionin e ndaluar në territorin e Federatës Ruse, qëllimi i këtij artikulli do të jetë të flasim për një metodë që ju lejon të automatizoni marrjen e aksesit në burimet që lejohen në territorin e Federatës Ruse, por për shkak të veprimeve të dikujt tjetër nuk janë drejtpërdrejt të aksesueshme përmes ofruesit tuaj. Dhe qasja në burime të tjera të marra si rezultat i veprimeve nga artikulli është një efekt anësor fatkeq dhe në asnjë mënyrë nuk është qëllimi i artikullit.

Gjithashtu, duke qenë se unë jam kryesisht një arkitekt rrjeti me profesion, profesion dhe rrugën e jetës, programimi dhe Linux nuk janë pika ime e fortë. Prandaj, sigurisht, skriptet mund të shkruhen më mirë, çështjet e sigurisë në VPS mund të përpunohen më thellë, etj. Sugjerimet tuaja do të pranohen me mirënjohje, nëse ato janë mjaft të detajuara - do të jem i lumtur t'i shtoj ato në tekstin e artikullit.

TL; DR

Ne automatizojmë aksesin në burime përmes tunelit tuaj ekzistues duke përdorur një kopje të regjistrit dhe protokollit BGP. Qëllimi është të hiqet i gjithë trafiku i adresuar në burimet e bllokuara në tunel. Shpjegime minimale, kryesisht udhëzime hap pas hapi.

Çfarë ju nevojitet për këtë?

Fatkeqësisht, ky postim nuk është për të gjithë. Për të përdorur këtë teknikë, do t'ju duhet të bashkoni disa elementë së bashku:

  1. Duhet të keni një server linux diku jashtë fushës së bllokimit. Ose të paktën dëshira për të pasur një server të tillë - për fat tani kushton nga 9 dollarë/vit, dhe ndoshta më pak. Metoda është gjithashtu e përshtatshme nëse keni një tunel të veçantë VPN, atëherë serveri mund të vendoset brenda fushës së bllokimit.
  2. Ruteri juaj duhet të jetë mjaft i zgjuar sa të jetë në gjendje
    • çdo klient VPN që ju pëlqen (Unë preferoj OpenVPN, por mund të jetë PPTP, L2TP, GRE+IPSec ose ndonjë opsion tjetër që krijon një ndërfaqe tuneli);
    • Protokolli BGPv4. Që do të thotë se për SOHO mund të jetë Mikrotik ose ndonjë ruter me firmware të personalizuar OpenWRT/LEDE/të ngjashëm që ju lejon të instaloni Quagga ose Bird. Përdorimi i një ruteri PC gjithashtu nuk është i ndaluar. Në rastin e një ndërmarrje, kërkoni mbështetje BGP në dokumentacionin për ruterin tuaj kufitar.
  3. Ju duhet të keni një kuptim të përdorimit të Linux dhe teknologjive të rrjeteve, duke përfshirë protokollin BGP. Ose të paktën dëshironi të merrni një ide të tillë. Meqenëse këtë herë nuk jam gati të përqafoj pafundësinë, do t'ju duhet të studioni vetë disa aspekte që janë të pakuptueshme për ju. Sidoqoftë, sigurisht që do t'u përgjigjem pyetjeve specifike në komente dhe nuk ka gjasa të jem i vetmi që përgjigjet, prandaj mos hezitoni të pyesni.

Çfarë është përdorur në shembull

  • Një kopje e regjistrit - nga https://github.com/zapret-info/z-i 
  • VPS - Ubuntu 16.04
  • Shërbimi i rrugëzimit - zog 1.6.3   
  • Ruteri - Mikrotik hAP ac
  • Dosjet e punës - meqenëse jemi duke punuar si rrënjë, shumica e gjithçkaje do të gjendet në dosjen kryesore të root-it. Përkatësisht:
    • /root/lista e zezë - dosje pune me skriptin e përpilimit
    • /root/zi - kopje e regjistrit nga github
    • /etc/bird - dosje standarde për cilësimet e shërbimit të shpendëve
  • Adresa IP e jashtme e VPS me serverin e rrugëzimit dhe pikën e përfundimit të tunelit është 194.165.22.146, ASN 64998; adresa IP e jashtme e ruterit - 81.177.103.94, ASN 64999
  • Adresat IP brenda tunelit janë përkatësisht 172.30.1.1 dhe 172.30.1.2.

Vendosja e BGP për të anashkaluar bllokimin, ose "Si ndalova së frikësuari dhe rashë në dashuri me RKN"

Sigurisht, mund të përdorni çdo ruter tjetër, sistem operativ dhe produkte softuerësh, duke e përshtatur zgjidhjen me logjikën e tyre.

Shkurtimisht - logjika e zgjidhjes

  1. Aktivitetet përgatitore
    1. Marrja e një VPS
    2. Ngritja e një tuneli nga ruteri në VPS
  2. Ne marrim dhe përditësojmë rregullisht një kopje të regjistrit
  3. Instalimi dhe konfigurimi i shërbimit të rrugëzimit
  4. Ne krijojmë një listë të rrugëve statike për shërbimin e rrugëzimit bazuar në regjistrin
  5. Ne lidhim ruterin me shërbimin dhe konfigurojmë dërgimin e të gjithë trafikut përmes tunelit.

Zgjidhja reale

Aktivitetet përgatitore

Ka shumë shërbime në internet që ofrojnë VPS për çmime jashtëzakonisht të arsyeshme. Deri tani e kam gjetur dhe e përdor opsionin për 9$/vit, por edhe nëse nuk shqetësoheni shumë, ka shumë opsione për 1E/muaj në çdo cep. Çështja e zgjedhjes së një VPS qëndron shumë përtej qëllimit të këtij artikulli, kështu që nëse dikush nuk kupton diçka për këtë, pyesni në komente.

Nëse përdorni një VPS jo vetëm për shërbimin e rrugëzimit, por edhe për të përfunduar një tunel në të, duhet ta ngrini këtë tunel dhe, pothuajse me siguri, të konfiguroni NAT për të. Ka një numër të madh udhëzimesh për këto veprime në internet, nuk do t'i përsëris këtu. Kërkesa kryesore për një tunel të tillë është që ai duhet të krijojë një ndërfaqe të veçantë në ruterin tuaj që mbështet tunelin drejt VPS. Shumica e teknologjive të përdorura VPN plotësojnë këtë kërkesë - për shembull, OpenVPN në modalitetin tun është i përsosur.

Marrja e një kopje të regjistrit

Siç tha Xhebraili, "Ai që na pengon do të na ndihmojë." Meqenëse RKN po krijon një regjistër të burimeve të ndaluara, do të ishte mëkat të mos e përdornim këtë regjistër për të zgjidhur problemin tonë. Ne do të marrim një kopje të regjistrit nga github.

Ne shkojmë në serverin tuaj Linux, biem në kontekstin rrënjë (sudo su -) dhe instaloni git nëse nuk është instaluar tashmë.

apt install git

Shkoni te drejtoria juaj kryesore dhe nxirrni një kopje të regjistrit.

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

Ne vendosëm një përditësim të cron (e bëj një herë në 20 minuta, por ju mund të zgjidhni çdo interval që ju intereson). Për ta bërë këtë ne nisim crontab -e dhe shtoni rreshtin e mëposhtëm në të:

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

Ne lidhim një goditje që do të krijojë skedarë për shërbimin e rrugëzimit pas përditësimit të regjistrit. Për ta bërë këtë, krijoni një skedar /root/zi/.git/hooks/post-merge me përmbajtjen e mëposhtme:

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

dhe mos harroni ta bëni atë të ekzekutueshëm

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

Do të krijojmë skriptin makebgp të cilit i referohet hook pak më vonë.

Instalimi dhe konfigurimi i një shërbimi të rrugëtimit

Instaloni zogun. Fatkeqësisht, versioni i zogut i postuar aktualisht në magazinat e Ubuntu është i krahasueshëm në freski me fecesin Archeopteryx, kështu që së pari duhet të shtojmë APP-në zyrtare të zhvilluesve të softuerit në sistem.

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

Pas kësaj, ne çaktivizojmë menjëherë zogun për IPv6 - nuk do të na duhet në këtë instalim.

systemctl stop bird6
systemctl disable bird6

Më poshtë është një skedar konfigurimi minimalist i shërbimit të shpendëve (/etc/bird/bird.conf), e cila është mjaft e mjaftueshme për ne (dhe ju kujtoj edhe një herë se askush nuk e ndalon zhvillimin dhe akordimin e idesë për t'iu përshtatur nevojave tuaja)

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 i ruterit - identifikuesi i ruterit, i cili vizualisht duket si një adresë IPv4, por nuk është një. Në rastin tonë, mund të jetë çdo numër 32-bitësh në formatin e adresës IPv4, por është një formë e mirë të tregoni saktësisht adresën IPv4 të pajisjes tuaj (në këtë rast, VPS).

protokolli i drejtpërdrejtë përcakton se cilat ndërfaqe do të punojnë me procesin e rrugëzimit. Shembulli jep disa emra shembuj, ju mund të shtoni të tjerë. Ju thjesht mund të fshini linjën; në këtë rast, serveri do të dëgjojë të gjitha ndërfaqet e disponueshme me një adresë IPv4.

protokolli statik është magjia jonë që ngarkon listat e prefikseve dhe adresave IP (të cilat në fakt janë prefikse /32, natyrisht) nga skedarët për shpallje të mëvonshme. Nga vijnë këto lista do të diskutohet më poshtë. Ju lutemi vini re se ngarkimi i adresave IP komentohet si parazgjedhje, arsyeja për këtë është vëllimi i madh i ngarkimit. Për krahasim, në momentin e shkrimit, ka 78 rreshta në listën e prefikseve dhe 85898 në listën e adresave IP. Unë rekomandoj fuqimisht fillimin dhe korrigjimin e gabimeve vetëm në listën e prefikseve dhe nëse duhet të aktivizohet ose jo ngarkimi i IP-së në e ardhmja varet nga ju që të vendosni pasi të eksperimentoni me ruterin tuaj. Jo secili prej tyre mund të tretet lehtësisht 85 mijë hyrje në tabelën e rrugëtimit.

Protokolli bgp, në fakt, vendos bgp peering me ruterin tuaj. Adresa IP është adresa e ndërfaqes së jashtme të ruterit (ose adresa e ndërfaqes së tunelit në anën e ruterit), 64998 dhe 64999 janë numrat e sistemeve autonome. Në këtë rast, ato mund të caktohen në formën e çdo numri 16-bitësh, por është praktikë e mirë të përdoren numrat AS nga diapazoni privat i përcaktuar nga RFC6996 - 64512-65534 përfshirëse (ekziston një format për ASN-të 32-bitësh, por në rastin tonë kjo është padyshim e tepërt). Konfigurimi i përshkruar përdor eBGP peering, në të cilin numrat e sistemeve autonome të shërbimit të rrugëzimit dhe ruterit duhet të jenë të ndryshëm.

Siç mund ta shihni, shërbimi duhet të dijë adresën IP të ruterit, kështu që nëse keni një adresë private dinamike ose jo të rrugëzueshme (RFC1918) ose të përbashkët (RFC6598), nuk keni mundësinë për të rritur peering në pjesën e jashtme. ndërfaqe, por shërbimi do të vazhdojë të funksionojë brenda tunelit.

Është gjithashtu mjaft e qartë se nga një shërbim mund të ofroni rrugë në disa rutera të ndryshëm - thjesht dubliko cilësimet për ta duke kopjuar seksionin e protokollit bgp dhe duke ndryshuar adresën IP të fqinjit. Kjo është arsyeja pse shembulli tregon cilësimet për shikimin jashtë tunelit, si më universale. Është e lehtë t'i heqësh ato në tunel duke ndryshuar adresat IP në cilësimet në përputhje me rrethanat.

Përpunimi i regjistrit për shërbimin e rrugëzimit

Tani na duhet, në fakt, të krijojmë lista të prefikseve dhe adresave IP, të cilat u përmendën në statikën e protokollit në fazën e mëparshme. Për ta bërë këtë, ne marrim skedarin e regjistrit dhe krijojmë skedarët që na duhen prej tij duke përdorur skriptin e mëposhtëm, të vendosur në /root/lista e zezë/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'

Mos harroni ta bëni atë të ekzekutueshëm

chmod +x /root/blacklist/makebgp

Tani mund ta ekzekutoni manualisht dhe të vëzhgoni pamjen e skedarëve në /etc/bird.

Me shumë mundësi, zogu nuk po punon për ju në këtë moment, sepse në fazën e mëparshme ju i kërkuat të kërkonte skedarë që nuk ekzistonin ende. Prandaj, ne e nisim atë dhe kontrollojmë që ka filluar:

systemctl start bird
birdc show route

Prodhimi i komandës së dytë duhet të tregojë rreth 80 regjistrime (kjo është për momentin, por kur ta vendosni, gjithçka do të varet nga zelli i RKN në bllokimin e rrjeteve) diçka si kjo:

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

Ekip

birdc show protocol

do të tregojë statusin e protokolleve brenda shërbimit. Derisa të keni konfiguruar ruterin (shih pikën tjetër), protokolli OurRouter do të jetë në gjendjen e fillimit (faza e lidhjes ose aktive), dhe pas një lidhjeje të suksesshme do të shkojë në gjendjen lart (faza e krijuar). Për shembull, në sistemin tim dalja e kësaj komande duket si kjo:

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

Lidhja e një ruteri

Të gjithë ndoshta janë lodhur duke lexuar këtë mbulesë këmbësh, por kini zemër - fundi është afër. Për më tepër, në këtë seksion nuk do të jem në gjendje të jap udhëzime hap pas hapi - do të jetë e ndryshme për secilin prodhues.

Megjithatë, unë mund t'ju tregoj disa shembuj. Logjika kryesore është të ngrihet peering BGP dhe të caktohet nexthop për të gjitha prefikset e marra, duke treguar tunelin tonë (nëse duhet të dërgojmë trafik përmes një ndërfaqeje p2p) ose adresën IP të nexthop nëse trafiku do të shkojë në ethernet).

Për shembull, në Mikrotik në RouterOS kjo zgjidhet si më poshtë

/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

dhe në Cisco IOS - si kjo

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

Nëse i njëjti tunel përdoret si për peering BGP ashtu edhe për transmetimin e trafikut të dobishëm, nuk është e nevojshme të vendosni nexthop; ai do të vendoset saktë duke përdorur protokollin. Por nëse e vendosni manualisht, nuk do ta përkeqësojë as atë.

Në platformat e tjera, do të duhet të kuptoni vetë konfigurimin, por nëse keni ndonjë vështirësi, shkruani në komente, unë do të përpiqem të ndihmoj.

Pasi seanca juaj BGP ka filluar, rrugët drejt rrjeteve të mëdha kanë mbërritur dhe janë instaluar në tabelë, trafiku ka rrjedhur në adresat prej tyre dhe lumturia është afër, mund të ktheheni në shërbimin e shpendëve dhe të përpiqeni të hiqni komentin e hyrjes atje që lidh listën e adresave IP, ekzekutoni më pas

systemctl reload bird

dhe shikoni se si ruteri juaj i transferoi këto 85 mijë rrugë. Jini të përgatitur të shkëputeni dhe mendoni se çfarë të bëni me të :)

Në total

Thjesht teorikisht, pasi të keni përfunduar hapat e përshkruar më sipër, tani keni një shërbim që ridrejton automatikisht trafikun në adresat IP të ndaluara në Federatën Ruse pas sistemit të filtrimit.

Sigurisht, mund të përmirësohet. Për shembull, është mjaft e lehtë të përmblidhni një listë të adresave IP duke përdorur zgjidhje perl ose python. Një skrip i thjeshtë Perl që e bën këtë duke përdorur Net::CIDR::Lite kthen 85 mijë parashtesa në 60 (jo mijëra), por, natyrisht, mbulon një gamë shumë më të madhe adresash sesa është e bllokuar.

Meqenëse shërbimi funksionon në nivelin e tretë të modelit ISO/OSI, nuk do t'ju shpëtojë nga bllokimi i një sajti/faqeje nëse zgjidhet në adresën e gabuar siç është regjistruar në regjistër. Por së bashku me regjistrin, skedari nxdomain.txt vjen nga github, i cili me disa goditje të skriptit shndërrohet lehtësisht në një burim adresash, për shembull, shtesën SwitchyOmega në Chrome.

Është gjithashtu e nevojshme të përmendet se zgjidhja kërkon përpunim shtesë nëse nuk jeni thjesht një përdorues i Internetit, por gjithashtu publikoni disa burime vetë (për shembull, një faqe interneti ose server poste funksionon në këtë lidhje). Duke përdorur mjetet e ruterit, është e nevojshme të lidhni rreptësisht trafikun dalës nga ky shërbim me adresën tuaj publike, përndryshe do të humbni lidhjen me ato burime që mbulohen nga lista e prefikseve të marra nga ruteri.

Nëse keni ndonjë pyetje, pyesni, unë jam gati të përgjigjem.

UPD. Faleminderit navion и TerAnYu për parametrat për git që lejojnë reduktimin e vëllimeve të shkarkimit.

UPD2. Kolegë, duket se kam bërë një gabim duke mos shtuar në artikull udhëzime për vendosjen e një tuneli midis VPS dhe ruterit. Nga kjo lindin shumë pyetje.
Për çdo rast, do të vërej edhe një herë se përpara se të filloni këtë udhëzues, ju keni konfiguruar tashmë një tunel VPN në drejtimin që ju nevojitet dhe keni kontrolluar funksionalitetin e tij (për shembull, duke e kthyer trafikun atje si parazgjedhje ose statikisht). Nëse nuk e keni përfunduar ende këtë fazë, nuk ka shumë kuptim të ndiqni hapat në artikull. Unë nuk kam ende tekstin tim për këtë, por nëse google "konfigurimi i një serveri OpenVPN" së bashku me emrin e sistemit operativ të instaluar në VPS dhe "konfigurimin e një klienti OpenVPN" me emrin e ruterit tuaj , me shumë mundësi do të gjeni një numër artikujsh mbi këtë temë, duke përfshirë në Habré.

UPD3. I pasakrifikuar Shkrova një kod që e kthen dump.csv në një skedar rezultues për zog me përmbledhje opsionale të adresave IP. Prandaj, seksioni "Përpunimi i regjistrit për shërbimin e rrugëzimit" mund të zëvendësohet duke thirrur programin e tij. https://habr.com/post/354282/#comment_10782712

UPD4. Pak punë për gabimet (nuk i shtova ato në tekst):
1) në vend të kësaj systemctl reload zog ka kuptim të përdoret komanda konfigurimi i birdc.
2) në ruterin Mikrotik, në vend që të ndryshoni nexthop në IP të anës së dytë të tunelit /filtri i rrugëtimit shtoni veprim=pranoni zinxhirin=protokollin dinamik-në=bgp koment=»Cakto nexthop» set-in-nexthop=172.30.1.1 ka kuptim të specifikoni rrugën direkt në ndërfaqen e tunelit, pa adresë /filtri i rrugëtimit shto veprim=pranoj zinxhir=dinamik-në protokol=bgp koment=»Cakto nexthop» set-in-nexthop-direct=<emri i ndërfaqes>

UPD5. Një shërbim i ri është shfaqur https://antifilter.download, nga ku mund të merrni lista të gatshme të adresave IP. Përditësohet çdo gjysmë ore. Nga ana e klientit, gjithçka që mbetet është të kornizohen të dhënat me "rrugën... refuzo" përkatëse.
Dhe në këtë pikë, me siguri, mjafton të rreshësh gjyshen dhe të përditësosh artikullin.

UPD6. Një version i rishikuar i artikullit për ata që nuk duan ta kuptojnë, por duan të fillojnë - këtu.

Burimi: www.habr.com

Shto një koment