Setja upp BGP til að komast framhjá blokkun, eða "Hvernig ég hætti að vera hræddur og varð ástfanginn af RKN"

Jæja, allt í lagi, um „elskað“ er ofmælt. Frekar, "gæti verið sambúð með."

Eins og þið öll vitið, síðan 16. apríl 2018, hefur Roskomnadzor verið að loka fyrir aðgang að auðlindum á internetinu í mjög stórum dráttum og bætt við „sameinuðu skránni yfir lén, síðuskrár vefsvæða á internetinu og netföng sem gera kleift að auðkenna síður. á Netinu,“ sem inniheldur upplýsingar sem dreifing er bönnuð í Rússlandi“ (í textanum - bara skrá) með /10 stundum. Þess vegna þjást borgarar rússneska sambandsríkisins og fyrirtæki, hafa misst aðgang að fullkomlega löglegum úrræðum sem þeir þurfa.

Eftir að ég sagði í athugasemdum við eina af greinunum á Habré að ég væri tilbúinn að hjálpa fórnarlömbum við að setja upp hjáveitukerfi, komu nokkrir til mín og báðu um slíka hjálp. Þegar allt gekk upp hjá þeim mælti einn þeirra með að lýsa tækninni í grein. Eftir smá umhugsun ákvað ég að rjúfa þögn mína á síðunni og reyna í eitt skipti að skrifa eitthvað á milli verkefnis og Facebook-færslu, þ.e. habrapost. Niðurstaðan er fyrir framan þig.

Afneitun ábyrgðar

Þar sem það er ekki mjög löglegt að birta leiðir til að komast framhjá hindrun aðgangs að upplýsingum sem eru bannaðar á yfirráðasvæði Rússlands, mun tilgangur þessarar greinar vera að tala um aðferð sem gerir þér kleift að gera sjálfvirkan aðgang að auðlindum sem eru leyfðar á yfirráðasvæði Rússlands, en vegna aðgerða einhvers annars er ekki beint aðgengilegt í gegnum þjónustuveituna þína. Og aðgangur að öðrum úrræðum sem fást vegna aðgerða úr greininni er óheppilegur fylgifiskur og er á engan hátt tilgangur greinarinnar.

Þar sem ég er fyrst og fremst netarkitekt að atvinnu, köllun og lífsleið, eru forritun og Linux ekki mín sterku hlið. Þess vegna er auðvitað hægt að skrifa forskriftir betur, vinna dýpra í öryggismálum í VPS o.s.frv. Tillögum þínum verður tekið með þakklæti, ef þær eru nægilega ítarlegar - ég mun glaður bæta þeim við texta greinarinnar.

TL; DR

Við gerum sjálfvirkan aðgang að auðlindum í gegnum núverandi göng þín með því að nota afrit af skránni og BGP samskiptareglunum. Markmiðið er að fjarlægja alla umferð sem beint er að lokuðum auðlindum inn í göngin. Lágmarksskýringar, aðallega skref-fyrir-skref leiðbeiningar.

Hvað þarftu í þetta?

Því miður er þessi færsla ekki fyrir alla. Til þess að nota þessa tækni þarftu að setja saman nokkra þætti:

  1. Þú verður að hafa linux netþjón einhvers staðar fyrir utan blokkunarreitinn. Eða að minnsta kosti löngunin til að hafa slíkan netþjón - sem betur fer kostar hann núna frá $9/ári, og hugsanlega minna. Aðferðin hentar líka ef þú ert með sérstök VPN göng, þá getur netþjónninn verið staðsettur inni í lokunarreitnum.
  2. Routerinn þinn ætti að vera nógu klár til að geta það
    • hvaða VPN viðskiptavinur sem þú vilt (ég vil frekar OpenVPN, en það getur verið PPTP, L2TP, GRE+IPSec eða einhver annar valkostur sem býr til göngviðmót);
    • BGPv4 samskiptareglur. Sem þýðir að fyrir SOHO gæti það verið Mikrotik eða hvaða leið sem er með OpenWRT/LEDE/svipuðum sérsniðnum vélbúnaði sem gerir þér kleift að setja upp Quagga eða Bird. Notkun PC beini er heldur ekki bönnuð. Ef um fyrirtæki er að ræða, leitaðu að BGP stuðningi í skjölunum fyrir landamærabeini þinn.
  3. Þú ættir að hafa skilning á Linux notkun og nettækni, þar á meðal BGP siðareglur. Eða langar allavega að fá svona hugmynd. Þar sem ég er ekki tilbúinn að tileinka mér ómældina í þetta skiptið, verður þú að rannsaka nokkra þætti sem eru þér óskiljanlegir á eigin spýtur. Hins vegar mun ég að sjálfsögðu svara ákveðnum spurningum í athugasemdunum og það er ólíklegt að ég sé sá eini sem svarar, svo ekki hika við að spyrja.

Hvað er notað í dæminu

  • Afrit af skránni - frá https://github.com/zapret-info/z-i 
  • VPS - Ubuntu 16.04
  • Leiðarþjónusta - fugl 1.6.3   
  • Beini - Mikrotik hAP ac
  • Vinnumöppur - þar sem við erum að vinna sem rót verður flest allt staðsett í heimamöppu rótarinnar. Í sömu röð:
    • /root/blacklist - vinnumöppu með safnskriftinni
    • /root/zi - afrit af skránni frá github
    • /etc/bird - venjuleg mappa fyrir fuglaþjónustustillingar
  • Ytri IP-tala VPS með leiðarþjóninum og endapunkti ganganna er 194.165.22.146, ASN 64998; ytri IP-tala beinsins - 81.177.103.94, ASN 64999
  • IP tölurnar inni í göngunum eru 172.30.1.1 og 172.30.1.2, í sömu röð.

Setja upp BGP til að komast framhjá blokkun, eða "Hvernig ég hætti að vera hræddur og varð ástfanginn af RKN"

Auðvitað geturðu notað hvaða beina sem er, stýrikerfi og hugbúnaðarvörur til að laga lausnina að rökfræði þeirra.

Í stuttu máli - rökfræði lausnarinnar

  1. Undirbúningsstarfsemi
    1. Að fá VPS
    2. Að hækka göng frá beini til VPS
  2. Við fáum og uppfærum reglulega afrit af skránni
  3. Að setja upp og stilla leiðarþjónustuna
  4. Við búum til lista yfir kyrrstæðar leiðir fyrir leiðarþjónustuna á grundvelli skrárinnar
  5. Við tengjum beininn við þjónustuna og stillum upp á að senda alla umferð í gegnum göngin.

Raunveruleg lausnin

Undirbúningsstarfsemi

Það eru margar þjónustur á netinu sem veita VPS fyrir mjög sanngjarnt verð. Hingað til hef ég fundið og er að nota valkostinn fyrir $ 9 á ári, en jafnvel þó þú nennir ekki of mikið, þá eru margir valkostir fyrir 1E / mánuði á hverju horni. Spurningin um að velja VPS liggur langt utan gildissviðs þessarar greinar, svo ef einhver skilur ekki eitthvað um þetta, spyrðu í athugasemdunum.

Ef þú notar VPS ekki aðeins fyrir leiðarþjónustuna, heldur einnig til að slíta göng á henni, þarftu að hækka þessi göng og, næstum örugglega, stilla NAT fyrir þau. Það er mikill fjöldi leiðbeininga um þessar aðgerðir á netinu, ég mun ekki endurtaka þær hér. Aðalkrafan fyrir slík göng er að þau verði að búa til sérstakt viðmót á leiðinni þinni sem styður göngin í átt að VPS. Mest notaða VPN tæknin uppfyllir þessa kröfu - til dæmis er OpenVPN í tun mode fullkomið.

Að sækja afrit af skránni

Eins og Jabrail sagði: „Sá sem hindrar okkur mun hjálpa okkur. Þar sem RKN er að búa til skrá yfir bannaðar auðlindir væri synd að nota þessa skrá ekki til að leysa vandamál okkar. Við munum fá afrit af skránni frá github.

Við förum á Linux netþjóninn þinn, fallum inn í rótarsamhengið (sudo su —) og settu upp git ef það er ekki þegar uppsett.

apt install git

Farðu í heimaskrána þína og dragðu út afrit af skránni.

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

Við setjum upp cron uppfærslu (ég geri það einu sinni á 20 mínútna fresti, en þú getur valið hvaða bil sem þú hefur áhuga á). Til að gera þetta ræsum við crontab -e og bætið eftirfarandi línu við það:

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

Við tengjum krók sem mun búa til skrár fyrir leiðarþjónustuna eftir að skrásetningin hefur verið uppfærð. Til að gera þetta skaltu búa til skrá /root/zi/.git/hooks/post-merge með eftirfarandi innihaldi:

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

og ekki gleyma að gera það keyranlegt

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

Við munum búa til makebgp handritið sem krókurinn vísar til aðeins síðar.

Uppsetning og uppsetning leiðarþjónustu

Settu upp fugl. Því miður er útgáfan af fugli sem nú er birt í Ubuntu geymslunum sambærileg í ferskleika og Archeopteryx saur, svo við þurfum fyrst að bæta opinberu PPA hugbúnaðarframleiðenda við kerfið.

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

Eftir þetta slökkum við strax á fugl fyrir IPv6 - við munum ekki þurfa það í þessari uppsetningu.

systemctl stop bird6
systemctl disable bird6

Hér að neðan er mínimalísk fuglaþjónustu stillingarskrá (/etc/bird/bird.conf), sem er alveg nóg fyrir okkur (og ég minni enn og aftur á að enginn bannar að þróa og stilla hugmyndina að þínum þörfum)

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 - auðkenni leiðar, sem lítur sjónrænt út eins og IPv4 vistfang, en er ekki eitt. Í okkar tilviki getur það verið hvaða 32-bita númer sem er á IPv4 vistfangasniði, en það er gott form til að gefa nákvæmlega til kynna IPv4 vistfang tækisins þíns (í þessu tilfelli, VPS).

protocol direct skilgreinir hvaða viðmót munu vinna með leiðarferlinu. Dæmið gefur nokkur dæmi um nöfn, þú getur bætt öðrum við. Þú getur einfaldlega eytt línunni; í þessu tilviki mun þjónninn hlusta á öll tiltæk viðmót með IPv4 vistfangi.

protocol static er galdurinn okkar sem hleður lista yfir forskeyti og IP tölur (sem eru í raun /32 forskeyti, auðvitað) úr skrám fyrir síðari tilkynningu. Hér á eftir verður fjallað um hvaðan þessir listar koma. Vinsamlega athugaðu að sjálfgefið er að hleðsla IP tölur sé ekki skrifuð, ástæðan fyrir því er mikil upphleðsla. Til samanburðar, þegar þetta er skrifað, eru 78 línur í listanum yfir forskeyti og 85898 í listanum yfir IP-tölur. Ég mæli eindregið með því að byrja og kemba aðeins á listanum yfir forskeyti og hvort virkja eigi IP-hleðslu í framtíðin er undir þér komið að ákveða eftir tilraunir með beininn þinn. Ekki hver og einn þeirra getur auðveldlega melt 85 þúsund færslur í leiðartöflunni.

protocol bgp, í raun, setur bgp peering með beininum þínum. IP-talan er heimilisfang ytra viðmóts beinsins (eða heimilisfang gangnaviðmótsins á leiðarhliðinni), 64998 og 64999 eru númer sjálfstæðra kerfa. Í þessu tilviki er hægt að úthluta þeim í formi hvaða 16 bita númera sem er, en það er góð venja að nota AS númer frá einkasviðinu sem skilgreint er af RFC6996 - 64512-65534 að meðtöldum (það er snið fyrir 32 bita ASN, en í okkar tilfelli er þetta örugglega of mikið). Uppsetningin sem lýst er notar eBGP peering, þar sem númer sjálfstæðra kerfa leiðarþjónustunnar og beinisins verða að vera mismunandi.

Eins og þú sérð þarf þjónustan að vita IP tölu beinisins, þannig að ef þú ert með kraftmikið eða óbeinanlegt einka (RFC1918) eða deilt (RFC6598) heimilisfang, hefurðu ekki möguleika á að hækka peering á ytra viðmót, en þjónustan mun samt virka inni í göngunum.

Það er líka alveg ljóst að frá einni þjónustu er hægt að útvega leiðir til nokkurra mismunandi beina - bara afrita stillingarnar fyrir þá með því að afrita bgp-samskiptareglur og breyta IP-tölu nágrannans. Þess vegna sýnir dæmið stillingar fyrir skyggingu út fyrir göngin, sem þær alhliða. Það er auðvelt að fjarlægja þær inn í göngin með því að breyta IP tölunum í stillingunum í samræmi við það.

Að vinna úr skránni fyrir leiðarþjónustuna

Nú þurfum við í raun að búa til lista yfir forskeyti og IP-tölur, sem voru nefnd í samskiptareglunni á fyrra stigi. Til að gera þetta tökum við skráningarskrána og búum til þær skrár sem við þurfum úr henni með því að nota eftirfarandi skriftu, sett í /root/svartur listi/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'

Ekki gleyma að gera það keyranlegt

chmod +x /root/blacklist/makebgp

Nú geturðu keyrt það handvirkt og fylgst með útliti skráa í /etc/bird.

Líklegast er bird ekki að virka fyrir þig í augnablikinu, því á fyrra stigi baðstu það um að leita að skrám sem voru ekki til ennþá. Þess vegna ræsum við það og athugum að það hafi byrjað:

systemctl start bird
birdc show route

Framleiðsla seinni skipunarinnar ætti að sýna um það bil 80 færslur (þetta er í bili, en þegar þú setur það upp mun allt ráðast af vandlætingu RKN við að hindra netkerfi) eitthvað á þessa leið:

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

Team

birdc show protocol

mun sýna stöðu samskiptareglur innan þjónustunnar. Þar til þú hefur stillt beininn (sjá næsta lið), mun OurRouter samskiptareglan vera í upphafsstöðu (Connect eða Active phase), og eftir árangursríka tengingu fer hún í uppástand (Stofnaður áfangi). Til dæmis, á kerfinu mínu lítur úttak þessarar skipunar svona út:

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

Að tengja beini

Allir eru sennilega orðnir þreyttir á að lesa þennan fótaklæði, en hugsið ykkur - endirinn er í nánd. Þar að auki, í þessum hluta mun ég ekki geta gefið skref-fyrir-skref leiðbeiningar - það mun vera mismunandi fyrir hvern framleiðanda.

Hins vegar get ég sýnt þér nokkur dæmi. Helsta rökfræðin er að hækka BGP peering og úthluta nexthop á öll móttekin forskeyti, sem bendir á göngin okkar (ef við þurfum að senda umferð í gegnum p2p tengi) eða nexthop IP töluna ef umferðin fer á ethernet).

Til dæmis, á Mikrotik í RouterOS er þetta leyst sem hér segir

/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

og í Cisco IOS - svona

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

Ef sömu göng eru notuð bæði fyrir BGP-peering og til að senda gagnlega umferð, er ekki nauðsynlegt að stilla nexthop; það verður rétt stillt með samskiptareglunum. En ef þú stillir það handvirkt mun það ekki gera það verra heldur.

Á öðrum kerfum verður þú að finna út stillinguna sjálfur, en ef þú átt í erfiðleikum, skrifaðu í athugasemdirnar, ég mun reyna að hjálpa.

Eftir að BGP fundur þinn er hafinn, leiðir til stórra neta eru komnar og eru settar upp í töflunni, umferð hefur streymt á heimilisföngin frá þeim og hamingjan er í nánd, geturðu snúið aftur í fuglaþjónustuna og reynt að afskrifa færsluna þar sem tengir listi yfir IP tölur, framkvæma eftir það

systemctl reload bird

og sjáðu hvernig routerinn þinn flutti þessar 85 þúsund leiðir. Vertu tilbúinn að taka úr sambandi og hugsa um hvað á að gera við það :)

Alls

Hreint fræðilega séð, eftir að hafa lokið skrefunum sem lýst er hér að ofan, hefurðu nú þjónustu sem vísar umferð sjálfkrafa á IP tölur sem eru bannaðar í Rússlandi framhjá síunarkerfinu.

Það má auðvitað bæta. Til dæmis er auðvelt að draga saman lista yfir IP tölur með því að nota perl eða python lausnir. Einföld Perl forskrift sem gerir þetta með Net::CIDR::Lite breytir 85 þúsund forskeytum í 60 (ekki þúsund), en nær að sjálfsögðu yfir miklu stærra svið heimilisfanga en er lokað.

Þar sem þjónustan starfar á þriðja stigi ISO/OSI líkansins, mun hún ekki bjarga þér frá því að loka á síðu/síðu ef hún leysist á rangt heimilisfang eins og skráð er í skránni. En ásamt skrásetningunni kemur skráin nxdomain.txt frá github, sem með nokkrum strokum af handritinu breytist auðveldlega í uppsprettu vistfönga fyrir til dæmis SwitchyOmega viðbótina í Chrome.

Það er líka nauðsynlegt að nefna að lausnin krefst frekari betrumbóta ef þú ert ekki bara netnotandi, heldur birtir líka tilföng á eigin spýtur (til dæmis keyrir vefsíða eða póstþjónn á þessari tengingu). Með því að nota leiðina er nauðsynlegt að binda útleið frá þessari þjónustu stranglega við netfangið þitt, annars muntu missa tengingu við þær auðlindir sem falla undir lista yfir forskeyti sem beini berst.

Ef þú hefur einhverjar spurningar skaltu spyrja, ég er tilbúinn að svara.

UPD. Þakka þér fyrir sjóher и TerAnYu fyrir færibreytur fyrir git sem leyfa að draga úr niðurhalsmagni.

UPD2. Samstarfsmenn, það lítur út fyrir að ég hafi gert mistök með því að setja ekki leiðbeiningar um að setja upp göng milli VPS og beini við greinina. Margar spurningar vakna við þetta.
Til öryggis, þá tek ég enn og aftur fram að áður en þú byrjar þessa handbók hefur þú þegar stillt VPN göng í þá átt sem þú þarft og athugað virkni þess (til dæmis með því að snúa umferð þangað sjálfgefið eða kyrrstætt). Ef þú hefur ekki lokið þessum áfanga ennþá, þá er ekki mikið vit í að fylgja skrefunum í greininni. Ég er ekki með minn eigin texta um þetta ennþá, en ef þú googlar „setja upp OpenVPN netþjón“ ásamt nafni stýrikerfisins sem er uppsett á VPS og „setur upp OpenVPN biðlara“ með nafni beinisins. , þú munt líklegast finna fjölda greina um þetta efni, þar á meðal um Habré.

UPD3. Ófórnuð Ég skrifaði kóða sem breytir dump.csv í myndaskrá fyrir fugl með valfrjálsu samantekt á IP tölum. Þess vegna er hægt að skipta út hlutanum „Að vinna úr skránni fyrir leiðarþjónustuna“ með því að hringja í forritið hans. https://habr.com/post/354282/#comment_10782712

UPD4. Smá vinna með villur (ég bætti þeim ekki við textann):
1) í staðinn systemctl endurhlaða fugl það er skynsamlegt að nota skipunina birdc stilla.
2) í Mikrotik beininum, í stað þess að breyta nexthop í IP seinni hlið ganganna /routing filter add action=accept chain=dynamic-in protocol=bgp comment=»Set nexthop» set-in-nexthop=172.30.1.1 skynsamlegt er að tilgreina leiðina beint að viðmóti ganganna, án heimilisfangs /routing filter add action=accept chain=dynamic-in protocol=bgp comment=»Set nexthop» set-in-nexthop-direct=<viðmótsheiti>

UPD5. Ný þjónusta hefur birst https://antifilter.download, þaðan sem þú getur sótt tilbúna lista yfir IP tölur. Uppfært á hálftíma fresti. Hjá viðskiptavininum er allt sem eftir er að ramma inn færslurnar með tilheyrandi „leið...hafna“.
Og á þessum tímapunkti er líklega nóg að tuska ömmu þína og uppfæra greinina.

UPD6. Endurskoðuð útgáfa af greininni fyrir þá sem vilja ekki átta sig á því, en vilja byrja - hér.

Heimild: www.habr.com

Bæta við athugasemd