BGP ynstelle om blokkearjen te omgean, of "Hoe't ik ophâlde bang te wêzen en fereale waard op RKN"

No, goed, oer "leafde" is in oerdriuwing. Leaver, "koe tegearre bestean mei."

Sa't jo allegear witte, hat Roskomnadzor sûnt 16 april 2018 tagong ta boarnen op it ynternet yn ekstreem brede streken blokkearre, en tafoege oan it "Unified Register of domeinnammen, side-yndeksen fan siden op it ynternet en netwurkadressen wêrmei't siden identifisearje kinne. op it ynternet," befettet ynformaasje wêrfan ferdieling is ferbean yn 'e Russyske Federaasje" (yn' e tekst - gewoan in register) troch /10 soms. As gefolch, boargers fan 'e Russyske Federaasje en bedriuwen lije, hawwe ferlern tagong ta de folslein juridyske middels dy't se nedich hawwe.

Nei't ik yn 'e opmerkingen op ien fan' e artikels oer Habré sei dat ik ree wie om slachtoffers te helpen mei it opsetten fan in rûnweiskema, kamen ferskate minsken nei my om sa'n help te freegjen. Doe't alles wurke foar harren, ien fan harren oan te rieden om te beskriuwen de technyk yn in artikel. Nei wat tinken haw ik besletten om myn stilte op de side te brekken en in kear te besykjen wat tusken in projekt en in Facebook-post te skriuwen, d.w.s. habrapost. It resultaat is foar jo.

Disclaimer

Om't it net heul legaal is om manieren te publisearjen om blokkearjen fan tagong ta ynformaasje dy't ferbean is op it grûngebiet fan 'e Russyske Federaasje te omgean, sil it doel fan dit artikel wêze om te praten oer in metoade wêrmei jo it automatisearjen fan tagong krije ta middels dy't tastien binne op' e grûngebiet fan 'e Russyske Federaasje, mar troch de aksjes fan immen binne net direkt tagonklik fia jo provider. En tagong ta oare boarnen krigen as gefolch fan aksjes út it artikel is in ûngelokkige side-effekt en is op gjin inkelde manier it doel fan it artikel.

Ek, om't ik primêr in netwurkarsjitekt bin fan berop, berop en libbenspaad, programmearring en Linux binne net myn sterke punten. Dêrom kinne fansels skripts better skreaun wurde, feiligensproblemen yn VPS kinne djipper útwurke wurde, ensfh. Jo suggestjes wurde mei tankberens akseptearre, as se genôch detaillearre binne - ik sil se graach tafoegje oan 'e tekst fan it artikel.

TL; DR

Wy automatisearje tagong ta boarnen fia jo besteande tunnel mei in kopy fan it register en it BGP-protokol. It doel is om alle ferkear te ferwiderjen dat rjochte is oan blokkearre boarnen yn 'e tunnel. Minimale ferklearrings, meast stap-foar-stap ynstruksjes.

Wat hawwe jo hjirfoar nedich?

Spitigernôch is dizze post net foar elkenien. Om dizze technyk te brûken, moatte jo ferskate eleminten byinoar sette:

  1. Jo moatte in linux-tsjinner earne bûten it blokkearjende fjild hawwe. Of op syn minst de winsk om sa'n server te hawwen - gelokkich kostet it no fan $ 9 / jier, en mooglik minder. De metoade is ek geskikt as jo in aparte VPN-tunnel hawwe, dan kin de tsjinner yn it blokkearjende fjild lizze.
  2. Jo router moat tûk genôch wêze om dat te kinnen
    • elke VPN-kliïnt dy't jo wolle (ik leaver OpenVPN, mar it kin PPTP, L2TP, GRE + IPSec of in oare opsje wêze dy't in tunnelynterface makket);
    • BGPv4 protokol. Wat betsjut dat it foar SOHO Mikrotik kin wêze as elke router mei OpenWRT / LEDE / ferlykbere oanpaste firmware wêrmei jo Quagga of Bird kinne ynstallearje. It brûken fan in PC-router is ek net ferbean. Yn it gefal fan in ûndernimming, sykje nei BGP-stipe yn 'e dokumintaasje foar jo grinsrouter.
  3. Jo moatte in begryp hawwe fan Linux-gebrûk en netwurktechnologyen, ynklusyf it BGP-protokol. Of teminsten wol sa'n idee krije. Om't ik dizze kear net ree bin om de ûnbidigeens te omearmjen, sille jo guon aspekten moatte studearje dy't foar jo ûnbegryplik binne op jo eigen. Ik sil lykwols, fansels, spesifike fragen beäntwurdzje yn 'e opmerkingen en ik bin nei alle gedachten de iennichste dy't antwurdet, dus aarzelje net om te freegjen.

Wat wurdt brûkt yn it foarbyld

  • In kopy fan it register - fan https://github.com/zapret-info/z-i 
  • VPS - Ubuntu 16.04
  • Routing tsjinst - fûgel 1.6.3   
  • Router - Mikrotik hAP ac
  • Wurkmappen - om't wy as root wurkje, sil it measte fan alles yn 'e thúsmap fan' e root sitte. Respektivelik:
    • /root/blacklist - wurkmap mei it kompilaasjeskript
    • /root/zi - kopy fan it register fan github
    • /etc/bird - standert map foar fûgeltsjinstynstellingen
  • It eksterne IP-adres fan 'e VPS mei de routing-tsjinner en it tunnelbeëinigingspunt is 194.165.22.146, ASN 64998; eksterne IP-adres fan de router - 81.177.103.94, ASN 64999
  • De IP-adressen yn 'e tunnel binne respektivelik 172.30.1.1 en 172.30.1.2.

BGP ynstelle om blokkearjen te omgean, of "Hoe't ik ophâlde bang te wêzen en fereale waard op RKN"

Fansels kinne jo alle oare routers, bestjoeringssystemen en softwareprodukten brûke, de oplossing oanpasse oan har logika.

Koartsein - de logika fan 'e oplossing

  1. Tariedende aksjes
    1. Krij in VPS
    2. Ferheegje in tunnel fan 'e router nei de VPS
  2. Wy ûntfange en regelmjittich bywurkje in kopy fan it register
  3. Ynstallearje en konfigurearje de routingtsjinst
  4. Wy meitsje in list mei statyske rûtes foar de rûtetsjinst basearre op it register
  5. Wy ferbine de router mei de tsjinst en konfigurearje it ferstjoeren fan alle ferkear troch de tunnel.

De eigentlike oplossing

Tariedende aksjes

D'r binne in protte tsjinsten op it ynternet dy't VPS leverje foar ekstreem ridlike prizen. Oant no haw ik fûn en brûk de opsje foar $ 9 / jier, mar sels as jo net tefolle lestich falle, binne d'r in protte opsjes foar 1E / moanne op elke hoeke. De fraach fan it kiezen fan in VPS leit fier bûten it berik fan dit artikel, dus as immen net begrypt wat oer dit, freegje yn 'e kommentaren.

As jo ​​​​in VPS brûke net allinich foar de routingtsjinst, mar ek om in tunnel dêryn te beëinigjen, moatte jo dizze tunnel ferheegje en, hast wis, NAT dêrfoar ynstelle. D'r binne in grut oantal ynstruksjes oer dizze aksjes op it ynternet, ik sil se hjir net werhelje. De wichtichste eask foar sa'n tunnel is dat it in aparte ynterface moat meitsje op jo router dy't de tunnel nei de VPS stipet. Meast brûkte VPN-technologyen foldogge oan dizze eask - bygelyks OpenVPN yn tun-modus is perfekt.

Krij in kopy fan it register

Lykas Jabrail sei: "Hy dy't ús hinderet sil ús helpe." Om't de RKN in register fan ferbeane middels oanmeitsje, soe it in sûnde wêze om dit register net te brûken om ús probleem op te lossen. Wy krije in kopy fan it register fan github.

Wy geane nei jo Linux-tsjinner, falle yn 'e root-kontekst (sudo su —) en ynstallearje git as it net al ynstalleare is.

apt install git

Gean nei jo thúsmap en lûk in kopy fan it register út.

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

Wy sette in cron update (Ik doch it ien kear elke 20 minuten, mar jo kinne kieze eltse ynterval dat ynteresseart dy). Om dit te dwaan lansearje wy crontab -e en foegje de folgjende rigel ta:

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

Wy ferbine in heak dy't bestannen sil meitsje foar de routingtsjinst nei it bywurkjen fan it register. Om dit te dwaan, meitsje in bestân /root/zi/.git/hooks/post-merge mei de folgjende ynhâld:

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

en ferjit net om it útfierber te meitsjen

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

Wy sille it makebgp-skript meitsje wêr't de heak in bytsje letter nei ferwiist.

Ynstallearje en konfigurearje in routingtsjinst

Ynstallearje fûgel. Spitigernôch is de ferzje fan fûgel op it stuit pleatst yn 'e Ubuntu-repositories fergelykber yn frisheid mei Archeopteryx feces, dus moatte wy earst de offisjele PPA fan' e software-ûntwikkelders tafoegje oan it systeem.

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

Hjirnei skeakelje wy fûgel fuortendaliks út foar IPv6 - wy sille it net nedich wêze yn dizze ynstallaasje.

systemctl stop bird6
systemctl disable bird6

Hjirûnder is in minimalistysk konfiguraasjetriem foar fûgeltsjinst (/etc/bird/bird.conf), wat foar ús genôch is (en ik herinner jo nochris dat gjinien it ûntwikkeljen en ôfstimmen fan it idee ferbiedt om oan jo eigen behoeften te passen)

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 identifier, dy't visueel liket op in IPv4 adres, mar is net ien. Yn ús gefal kin it elk 32-bit nûmer wêze yn it IPv4-adresformaat, mar it is in goede foarm om krekt it IPv4-adres fan jo apparaat oan te jaan (yn dit gefal VPS).

protokol direkt definiearret hokker ynterfaces sille wurkje mei it routingproses. It foarbyld jout in pear foarbyldnammen, jo kinne oaren tafoegje. Jo kinne de line gewoan wiskje; yn dit gefal sil de tsjinner harkje nei alle beskikbere ynterfaces mei in IPv4-adres.

protokol statysk is ús magy dy't laden listen mei foarheaksels en IP-adressen (dy't eins /32 foarheaksels, fansels) út triemmen foar folgjende oankundiging. Wêr't dizze listen wei komme sille hjirûnder besprutsen wurde. Tink derom dat it laden fan IP-adressen standert wurdt kommentearre, de reden hjirfoar is it grutte folume fan upload. Foar fergeliking, op it stuit fan dit skriuwen, binne d'r 78 rigels yn 'e list mei foarheaksels, en 85898 yn' e list fan IP-adressen. Ik advisearje sterk te begjinnen en te debuggen allinich op 'e list mei foarheaksels, en it al dan net ynskeakelje fan IP-laden yn de takomst is oan jo om te besluten nei it eksperimintearjen mei jo router. Net elk fan har kin maklik 85 tûzen yngongen yn 'e routingtabel fertarje.

protokol bgp, yn feite, stelt bgp peering op mei jo router. It IP-adres is it adres fan 'e eksterne ynterface fan' e router (as it adres fan 'e tunnel-ynterface oan 'e routerkant), 64998 en 64999 binne de nûmers fan autonome systemen. Yn dit gefal kinne se wurde tawiisd yn 'e foarm fan elke 16-bit nûmers, mar it is in goede praktyk om AS-nûmers te brûken út it priveeberik definieare troch RFC6996 - 64512-65534 ynklusyf (der is in opmaak foar 32-bit ASN's, mar yn ús gefal is dit perfoarst overkill). De beskreaune konfiguraasje brûkt eBGP-peering, wêrby't de nûmers fan 'e autonome systemen fan' e routingtsjinst en de router oars moatte wêze.

Sa't jo sjen kinne, moat de tsjinst it IP-adres fan 'e router witte, dus as jo in dynamysk of net-routerber privee (RFC1918) of dield (RFC6598) adres hawwe, hawwe jo gjin opsje om peering op 'e eksterne te ferheegjen ynterface, mar de tsjinst sil noch wurkje binnen de tunnel.

It is ek frij dúdlik dat jo fan ien tsjinst rûtes kinne leverje oan ferskate ferskillende routers - gewoan duplikearje de ynstellings foar har troch it protokol bgp-seksje te kopiearjen en it IP-adres fan 'e buorman te feroarjen. Dêrom toant it foarbyld ynstellings foar peering bûten de tunnel, as de meast universele. It is maklik om se yn 'e tunnel te ferwiderjen troch de IP-adressen yn' e ynstellings neffens te feroarjen.

Ferwurkjen fan it register foar de routingtsjinst

No moatte wy, yn feite, listen meitsje fan foarheaksels en IP-adressen, dy't waarden neamd yn it statyske protokol yn 'e foarige poadium. Om dit te dwaan, nimme wy it registerbestân en meitsje de bestannen dy't wy nedich binne mei it folgjende skript, pleatst yn /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'

Ferjit net om it útfierber te meitsjen

chmod +x /root/blacklist/makebgp

No kinne jo it manuell útfiere en it uterlik fan bestannen yn /etc/bird observearje.

Meast wierskynlik wurket fûgel op dit stuit net foar jo, om't jo yn 'e foarige etappe frege hawwe om te sykjen nei bestannen dy't noch net bestienen. Dêrom lansearje wy it en kontrolearje dat it is begon:

systemctl start bird
birdc show route

De útfier fan it twadde kommando moat sa'n 80 records sjen litte (dit is foar no, mar as jo it ynstelle, sil alles ôfhingje fan 'e iverens fan' e RKN yn blokkearjen fan netwurken) soksawat:

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

team

birdc show protocol

sil de status fan protokollen binnen de tsjinst sjen litte. Oant jo de router konfigureare hawwe (sjoch it folgjende punt), sil it OurRouter-protokol yn 'e startstatus wêze (Ferbine of Aktive faze), en nei in suksesfolle ferbining sil it gean nei de omheech steat (Fêststelde faze). Bygelyks, op myn systeem sjocht de útfier fan dit kommando der sa ú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

Ferbine in router

Elkenien is wierskynlik wurch fan it lêzen fan dit fuotkleed, mar nim hert oan - it ein is tichtby. Boppedat sil ik yn dizze seksje gjin stap-foar-stap ynstruksjes kinne jaan - it sil oars wêze foar elke fabrikant.

Ik kin jo lykwols in pear foarbylden sjen litte. De wichtichste logika is om BGP-peering te ferheegjen en nexthop ta te jaan oan alle ûntfongen foarheaksels, wiist op ús tunnel (as wy ferkear moatte stjoere fia in p2p-ynterface) of it nexthop IP-adres as it ferkear nei ethernet giet.

Bygelyks, op Mikrotik yn RouterOS dit wurdt oplost as folget

/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

en yn Cisco IOS - like this

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

As deselde tunnel wurdt brûkt sawol foar BGP-peering as foar it ferstjoeren fan nuttich ferkear, is it net nedich om nexthop yn te stellen; it sil goed ynsteld wurde mei it protokol. Mar as jo it manuell ynstelle, sil it it ek net slimmer meitsje.

Op oare platfoarms sille jo de konfiguraasje sels moatte útfine, mar as jo swierrichheden hawwe, skriuw dan yn 'e opmerkingen, ik sil besykje te helpen.

Nei't jo BGP-sesje begon is, binne rûtes nei grutte netwurken oankommen en binne ynstalleare yn 'e tabel, ferkear is streamd nei de adressen fan har en it lok is tichtby, kinne jo weromgean nei de fûgeltsjinst en besykje de yngong dêr't de yngong ferbynt list fan IP-adressen, útfiere dêrnei

systemctl reload bird

en sjoch hoe't jo router dizze 85 tûzen rûtes oerbrocht. Wês ree om de stekker út te lûken en tinke oer wat jo dermei dwaan moatte :)

Totaal

Suver teoretysk, nei it foltôgjen fan de hjirboppe beskreaune stappen, hawwe jo no in tsjinst dy't it ferkear automatysk omliedt nei IP-adressen ferbean yn 'e Russyske Federaasje foarby it filtersysteem.

It kin fansels ferbettere wurde. Bygelyks, it is frij maklik om in list fan IP-adressen gear te nimmen mei perl- as python-oplossingen. In ienfâldich Perl-skript dat dit docht mei Net :: CIDR :: Lite feroaret 85 tûzen foarheaksels yn 60 (net tûzen), mar beslacht fansels in folle grutter berik fan adressen dan is blokkearre.

Sûnt de tsjinst wurket op it tredde nivo fan it ISO / OSI-model, sil it jo net rêde fan it blokkearjen fan in side / side as it oplost nei it ferkearde adres lykas opnommen yn 'e registraasje. Mar tegearre mei it register komt it bestân nxdomain.txt fan github, dat mei in pear streken fan it skript maklik feroaret yn in boarne fan adressen foar bygelyks de SwitchyOmega-plugin yn Chrome.

It is ek nedich om te neamen dat de oplossing ekstra ferfining fereasket as jo net allinich in ynternetbrûker binne, mar ek guon boarnen op jo eigen publisearje (bygelyks in webside of e-posttsjinner rint op dizze ferbining). Mei help fan 'e router's middels is it nedich om útgeande ferkear fan dizze tsjinst strikt te binen oan jo iepenbiere adres, oars sille jo de ferbining ferlieze mei dy boarnen dy't wurde dekt troch de list mei foarheaksels ûntfongen troch de router.

As jo ​​​​fragen hawwe, freegje dan, ik bin ree om te beantwurdzjen.

UPD. Dankewol navion и TerAnYu foar parameters foar git dy't it ferminderjen fan downloadvoluminten mooglik meitsje.

UPD2. Kollega's, it liket derop dat ik in flater makke troch gjin ynstruksjes ta te foegjen foar it ynstellen fan in tunnel tusken de VPS en de router oan it artikel. Hjirmei wurde in protte fragen opsmiten.
Foar it gefal sil ik nochris opmerke dat jo foardat jo dizze hantlieding begjinne, al in VPN-tunnel konfigureare hawwe yn 'e rjochting dy't jo nedich binne en de funksjonaliteit kontroleare (bygelyks troch it ferkear dêr standert of statysk te draaien). As jo ​​dizze faze noch net foltôge hawwe, makket it net folle sin om de stappen yn it artikel te folgjen. Ik haw noch gjin eigen tekst hjiroer, mar as jo google "in OpenVPN-tsjinner ynstelle" tegearre mei de namme fan it bestjoeringssysteem ynstalleare op 'e VPS, en "in OpenVPN-kliïnt ynstelle" mei de namme fan jo router , sille jo nei alle gedachten in oantal artikels fine oer dit ûnderwerp, ynklusyf oer Habré.

UPD3. Net opoffere Ik skreau in koade dy't feroaret dump.csv yn in resultearjende triem foar fûgel mei opsjoneel gearfetting fan IP-adressen. Dêrom kin de seksje "It register ferwurkje foar de routingtsjinst" wurde ferfongen troch it programma te roppen. https://habr.com/post/354282/#comment_10782712

UPD4. In bytsje wurk oan flaters (ik haw se net tafoege oan de tekst):
1) ynstee systemctl reload fûgel it makket sin om it kommando te brûken birdc konfigurearje.
2) yn 'e Mikrotik-router, ynstee fan' e nexthop te feroarjen nei it IP fan 'e twadde kant fan' e tunnel / routing filter tafoegje aksje = akseptearje ketting = dynamic-in protokol = bgp comment =»Nexthop ynstelle» set-in-nexthop=172.30.1.1 it makket sin om de rûte direkt nei de tunnelynterface oan te jaan, sûnder adres / routing filter tafoegje aksje = akseptearje ketting = dynamic-in protocol = bgp comment =»Nexthop ynstelle» set-in-nexthop-direct=<interface namme>

UPD5. In nije tsjinst is ferskynd https://antifilter.download, wêrfan jo klearmakke listen mei IP-adressen ophelje kinne. Updated elk heal oere. Oan 'e kant fan' e kliïnt bliuwt it allinich om de records te frame mei de oerienkommende "rûte ... ôfwize".
En op dit punt, wierskynlik, is it genôch om jo beppe te lappen en it artikel te aktualisearjen.

UPD6. In feroare ferzje fan it artikel foar dyjingen dy't it net wolle útfine, mar wolle begjinne - hjir.

Boarne: www.habr.com

Add a comment