Подешавање БГП-а да заобиђе блокирање, или „Како сам престао да се плашим и заљубио се у РКН“

Па, у реду, у вези са „вољеним“ је претеривање. Уместо тога, „био је у стању да коегзистира са“.

Као што сви знате, Роскомнадзор је од 16. априла 2018. блокирао приступ ресурсима на Интернету у изузетно широким потезима, додајући у „Јединствени регистар имена домена, индекса страница сајтова на Интернету и мрежних адреса који омогућавају идентификацију сајтова на Интернету”, који садржи информације чија је дистрибуција забрањена у Руској Федерацији” (у тексту – само регистар) од /10 понекад. Као резултат тога, трпе грађани Руске Федерације и предузећа, јер су изгубили приступ потпуно легалним ресурсима који су им потребни.

Након што сам у коментарима на један од чланака на Хабреу рекао да сам спреман да помогнем жртвама око постављања бајпас шеме, дошло ми је неколико људи који су тражили такву помоћ. Када им је све успело, један од њих је препоручио да опише технику у чланку. После неког размишљања, одлучио сам да прекинем ћутање на сајту и покушам већ једном да напишем нешто средње између пројекта и објаве на Фејсбуку, тј. хабрапост. Резултат је пред вама.

Одрицање од одговорности

Пошто није баш легално објављивати начине за заобилажење блокирања приступа информацијама које су забрањене на територији Руске Федерације, сврха овог чланка ће бити да говори о методи која вам омогућава да аутоматизујете приступ ресурсима који су дозвољени на територији Руске Федерације. територије Руске Федерације, али због нечијих радњи нису директно доступни преко вашег провајдера. А приступ другим ресурсима добијеним као резултат радњи из чланка је несрећна нуспојава и ни на који начин није сврха чланка.

Такође, пошто сам првенствено мрежни архитекта по професији, вокацији и животном путу, програмирање и Линук ми нису јача страна. Стога, наравно, скрипте се могу боље написати, безбедносна питања у ВПС-у могу се дубље разрадити, итд. Ваше сугестије ће бити прихваћене са захвалношћу, ако буду довољно детаљне - радо ћу их додати у текст чланка.

ТЛ; ДР

Аутоматизујемо приступ ресурсима кроз ваш постојећи тунел користећи копију регистра и БГП протокола. Циљ је да се сав саобраћај упућен блокираним ресурсима уклони у тунел. Минимум објашњења, углавном упутства корак по корак.

Шта ти треба за ово?

Нажалост, овај пост није за свакога. Да бисте користили ову технику, мораћете да спојите неколико елемената:

  1. Морате имати линук сервер негде изван поља за блокирање. Или барем жеља да имате такав сервер - на срећу он сада кошта од 9 долара годишње, а можда и мање. Метода је такође погодна ако имате посебан ВПН тунел, тада се сервер може налазити унутар поља за блокирање.
  2. Ваш рутер би требао бити довољно паметан да може
    • било који ВПН клијент који вам се свиђа (ја више волим ОпенВПН, али то може бити ППТП, Л2ТП, ГРЕ+ИПСец или било која друга опција која креира тунелски интерфејс);
    • БГПв4 протокол. Што значи да за СОХО то може бити Микротик или било који рутер са ОпенВРТ/ЛЕДЕ/сличним прилагођеним фирмвером који вам омогућава да инсталирате Куагга или Бирд. Такође није забрањено коришћење ПЦ рутера. У случају предузећа, потражите БГП подршку у документацији за ваш гранични рутер.
  3. Требало би да имате разумевање коришћења Линук-а и мрежних технологија, укључујући БГП протокол. Или бар желите да добијете такву идеју. Пошто овог пута нисам спреман да прихватим неизмерност, неке аспекте који су вам неразумљиви мораћете сами да проучите. Међутим, ја ћу, наравно, одговорити на конкретна питања у коментарима и мало је вероватно да ћу ја бити једини који ће одговорити, тако да не оклевајте да питате.

Шта се користи у примеру

  • Копија регистра – од https://github.com/zapret-info/z-i 
  • ВПС - Убунту 16.04
  • Услуга рутирања - птица 1.6.3   
  • рутер - Микротик хАП ак
  • Радни директоријуми – пошто радимо као роот, већина свега ће се налазити у роот директоријуму. Редом:
    • /роот/блацклист - радна фасцикла са скриптом за компилацију
    • /роот/зи - копија регистра са гитхуб-а
    • /етц/бирд - стандардна фасцикла за подешавања услуге птица
  • Екстерна ИП адреса ВПС-а са сервером за рутирање и терминалном тачком тунела је 194.165.22.146, АСН 64998; спољна ИП адреса рутера - 81.177.103.94, АСН 64999
  • ИП адресе унутар тунела су 172.30.1.1 и 172.30.1.2, респективно.

Подешавање БГП-а да заобиђе блокирање, или „Како сам престао да се плашим и заљубио се у РКН“

Наравно, можете користити било које друге рутере, оперативне системе и софтверске производе, прилагођавајући решење њиховој логици.

Укратко - логика решења

  1. Припремне радње
    1. Добијање ВПС-а
    2. Подизање тунела од рутера до ВПС-а
  2. Примамо и редовно ажурирамо копију регистра
  3. Инсталирање и конфигурисање услуге рутирања
  4. Креирамо листу статичких рута за услугу рутирања на основу регистра
  5. Повезујемо рутер са сервисом и конфигуришемо слање целог саобраћаја кроз тунел.

Стварно решење

Припремне радње

На Интернету постоји много услуга које пружају ВПС по изузетно повољним ценама. До сада сам пронашао и користим опцију за 9 долара годишње, али чак и ако се не трудите превише, постоји много опција за 1Е месечно на сваком углу. Питање избора ВПС-а је далеко изван оквира овог чланка, па ако неко не разуме нешто о томе, питајте у коментарима.

Ако користите ВПС не само за услугу рутирања, већ и за завршетак тунела на њему, потребно је да подигнете овај тунел и, готово сигурно, конфигуришете НАТ за њега. На интернету постоји велики број упутстава о овим радњама, овде их нећу понављати. Главни захтев за такав тунел је да мора да креира посебан интерфејс на вашем рутеру који подржава тунел према ВПС-у. Већина коришћених ВПН технологија испуњава овај захтев – на пример, ОпенВПН у режиму тун је савршен.

Добијање копије регистра

Као што је Џабраил рекао: „Онај ко нас омета, помоћи ће нам. Пошто РКН прави регистар забрањених ресурса, био би грех не искористити овај регистар за решавање нашег проблема. Добићемо копију регистра са гитхуб-а.

Идемо на ваш Линук сервер, улазимо у основни контекст (судо су —) и инсталирајте гит ако већ није инсталиран.

apt install git

Идите у свој кућни именик и извуците копију регистра.

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

Поставили смо ажурирање црона (ја то радим једном на сваких 20 минута, али можете одабрати било који интервал који вас занима). Да бисмо то урадили, покрећемо цронтаб -е и додајте му следећи ред:

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

Повезујемо куку која ће креирати датотеке за услугу рутирања након ажурирања регистра. Да бисте то урадили, креирајте датотеку /роот/зи/.гит/хоокс/пост-мерге са следећим садржајем:

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

и не заборавите да га учините извршним

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

Направићемо макебгп скрипту на коју се кука позива мало касније.

Инсталирање и конфигурисање услуге рутирања

Инсталирај птицу. Нажалост, верзија бирд-а која је тренутно објављена у Убунту репозиторијуму је упоредива по свежини са изметом Арцхеоптерика, тако да морамо прво да додамо званични ППА програмера софтвера у систем.

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

Након овога, одмах деактивирамо бирд за ИПв6 - неће нам требати у овој инсталацији.

systemctl stop bird6
systemctl disable bird6

Испод је минималистичка конфигурациона датотека услуге птица (/етц/бирд/бирд.цонф), што нам је сасвим довољно (и још једном вас подсећам да нико не забрањује да идеју развијате и прилагођавате својим потребама)

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;
}

ид рутера - идентификатор рутера, који визуелно изгледа као ИПв4 адреса, али није. У нашем случају, то може бити било који 32-битни број у формату ИПв4 адресе, али је добро да наведете тачно ИПв4 адресу вашег уређаја (у овом случају ВПС).

Протоцол дирецт дефинише који интерфејси ће радити са процесом рутирања. Пример даје неколико примера имена, можете додати и друга. Можете једноставно да избришете линију; у овом случају, сервер ће слушати све доступне интерфејсе са ИПв4 адресом.

Протоцол статиц је наша магија која учитава листе префикса и ИП адреса (које су у ствари /32 префикса, наравно) из датотека за накнадну најаву. Одакле долазе ове листе, биће речи у наставку. Имајте на уму да је учитавање ИП адреса подразумевано коментарисано, разлог за то је велика количина отпремања. Поређења ради, у тренутку писања, на листи префикса има 78 редова, а на листи ИП адреса 85898. Препоручујем вам да почнете и отклањате грешке само на листи префикса и да ли да омогућите учитавање ИП-а у будућност је на вама да одлучите након експериментисања са вашим рутером. Не може сваки од њих лако сварити 85 хиљада уноса у табели рутирања.

протокол бгп, у ствари, поставља бгп пееринг са вашим рутером. ИП адреса је адреса екстерног интерфејса рутера (или адреса тунелског интерфејса на страни рутера), 64998 и 64999 су бројеви аутономних система. У овом случају, они се могу доделити у облику било којих 16-битних бројева, али је добра пракса користити АС бројеве из приватног опсега дефинисаног РФЦ6996 - 64512-65534 укључујући (постоји формат за 32-битне АСН-ове, али у нашем случају ово је дефинитивно претерано). Описана конфигурација користи еБГП пееринг, при чему бројеви аутономних система услуге рутирања и рутера морају бити различити.

Као што видите, услуга треба да зна ИП адресу рутера, тако да ако имате динамичку или неусмјерљиву приватну (РФЦ1918) или заједничку (РФЦ6598) адресу, немате опцију да покренете пееринг на екстерној интерфејс, али ће услуга и даље радити унутар тунела.

Такође је сасвим јасно да из једне услуге можете обезбедити руте до неколико различитих рутера - само дуплирајте подешавања за њих копирањем бгп одељка протокола и променом ИП адресе суседа. Зато су у примеру приказана подешавања за завиривање ван тунела, као најуниверзалнија. Лако их је уклонити у тунел тако што ћете у складу са тим променити ИП адресе у подешавањима.

Обрада регистра за услугу рутирања

Сада нам је, у ствари, потребно да направимо листе префикса и ИП адреса, које су поменуте у статици протокола у претходној фази. Да бисмо то урадили, узимамо датотеку регистра и од ње правимо датотеке које су нам потребне користећи следећу скрипту, смештену у /роот/блацклист/макебгп

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

Не заборавите да га учините извршним

chmod +x /root/blacklist/makebgp

Сада га можете покренути ручно и посматрати изглед датотека у /етц/бирд.

Највероватније, бирд у овом тренутку не ради за вас, јер сте у претходној фази тражили од њега да тражи датотеке које још нису постојале. Стога га покрећемо и проверавамо да ли је покренут:

systemctl start bird
birdc show route

Излаз друге команде би требало да прикаже око 80 записа (ово је за сада, али када га подесите, све ће зависити од ревности РКН-а у блокирању мрежа) отприлике овако:

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

Тим

birdc show protocol

ће приказати статус протокола у оквиру сервиса. Док не конфигуришете рутер (погледајте следећу тачку), ОурРоутер протокол ће бити у почетном стању (Повежи се или Активна фаза), а након успешне везе прећи ће у стање горе (Фаза Успостављена). На пример, на мом систему излаз ове команде изгледа овако:

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

Повезивање рутера

Вероватно су сви уморни од читања ове крпе за ноге, али охрабрите се - крај је близу. Штавише, у овом одељку нећу моћи да дам упутства корак по корак - биће различита за сваког произвођача.

Међутим, могу вам показати пар примера. Главна логика је да се подигне БГП пееринг и додели нектхоп свим примљеним префиксима, указујући на наш тунел (ако треба да шаљемо саобраћај преко п2п интерфејса) или нектхоп ИП адресу ако ће саобраћај ићи на етернет).

На пример, на Микротику у РоутерОС-у ово се решава на следећи начин

/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

а у Цисцо ИОС - овако

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

Ако се исти тунел користи и за БГП пееринг и за пренос корисног саобраћаја, није потребно постављати нектхоп, он ће бити исправно подешен користећи протокол. Али ако га подесите ручно, ни то неће погоршати ситуацију.

На другим платформама, мораћете сами да схватите конфигурацију, али ако имате потешкоћа, напишите у коментарима, покушаћу да помогнем.

Након што је ваша БГП сесија почела, руте до великих мрежа су стигле и инсталиране су у табели, саобраћај је текао на адресе са њих и срећа је близу, можете се вратити на услугу птица и покушати да декоментирате унос који повезује листу ИП адреса, извршите након тога

systemctl reload bird

и видите како је ваш рутер пренео ових 85 хиљада рута. Будите спремни да искључите и размислите шта да радите са тим :)

Укупно

Чисто теоретски, након што сте обавили горе описане кораке, сада имате услугу која аутоматски преусмерава саобраћај на ИП адресе забрањене у Руској Федерацији мимо система филтрирања.

Може се, наравно, побољшати. На пример, прилично је лако сумирати листу ИП адреса користећи перл или питхон решења. Једноставна Перл скрипта која то ради користећи Нет::ЦИДР::Лите претвара 85 хиљада префикса у 60 (не хиљаду), али, наравно, покрива много већи опсег адреса него што је блокирано.

Пошто услуга функционише на трећем нивоу ИСО/ОСИ модела, неће вас спасити од блокирања сајта/странице ако се реши на погрешну адресу као што је забележено у регистру. Али заједно са регистратором, са гитхуб-а стиже и датотека нкдомаин.ткт, која се са неколико потеза скрипте лако претвара у извор адреса за, на пример, додатак СвитцхиОмега у Цхроме-у.

Такође је потребно напоменути да решење захтева додатну дораду ако нисте само корисник Интернета, већ и сами објављујете неке ресурсе (на пример, веб локација или маил сервер ради на овој конекцији). Користећи средства рутера, потребно је стриктно везати одлазни саобраћај са овог сервиса на вашу јавну адресу, иначе ћете изгубити конекцију са оним ресурсима који су покривени листом префикса које рутер прима.

Ако имате питања, питајте, спреман сам да одговорим.

УПД. Хвала вам навион и ТерАнИу за параметре за гит који омогућавају смањење обима преузимања.

УПД2. Колеге, изгледа да сам погрешио што у чланак нисам додао упутства за постављање тунела између ВПС-а и рутера. Ово поставља многа питања.
За сваки случај, још једном ћу приметити да сте пре него што започнете овај водич већ конфигурисали ВПН тунел у смеру који вам је потребан и проверили његову функционалност (на пример, подразумевано или статички окрећући саобраћај тамо). Ако још нисте завршили ову фазу, нема много смисла пратити кораке у чланку. Још немам свој текст о овоме, али ако гоогле „подешавање ОпенВПН сервера“ заједно са именом оперативног система инсталираног на ВПС-у, и „подешавање ОпенВПН клијента“ са именом вашег рутера , највероватније ћете пронаћи бројне чланке на ову тему, укључујући и на Хабре.

УПД3. Непожртвовано Написао сам код који претвара думп.цсв у резултујућу датотеку за птицу са опционим сумирањем ИП адреса. Стога се одељак „Обрада регистра за услугу рутирања“ може заменити позивањем његовог програма. https://habr.com/post/354282/#comment_10782712

УПД4. Мало порадите на грешкама (нисам их додао у текст):
1) уместо тога системцтл птица поновног учитавања има смисла користити команду бирдц цонфигуре.
2) у Микротик рутеру, уместо да промените нектхоп на ИП друге стране тунела /филтер рутирања адд ацтион=аццепт цхаин=динамиц-ин протоцол=бгп цоммент=»Сет нектхоп» сет-ин-нектхоп=172.30.1.1 има смисла одредити руту директно до интерфејса тунела, без адресе /филтер рутирања адд ацтион=аццепт цхаин=динамиц-ин протоцол=бгп цоммент=»Сет нектхоп» сет-ин-нектхоп-дирецт=<име интерфејса>

УПД5. Појавила се нова услуга https://antifilter.download, одакле можете преузети готове листе ИП адреса. Ажурира се сваких пола сата. На страни клијента, остаје само да се уоквире записи са одговарајућим „руте... рејецт“.
И у овом тренутку, вероватно, довољно је да отрцате своју баку и ажурирате чланак.

УПД6. Ревидирана верзија чланка за оне који то не желе да схвате, али желе да почну - овде.

Извор: ввв.хабр.цом

Додај коментар