Поставување BGP за да се заобиколи блокирањето или „Како престанав да се плашам и се заљубив во RKN“

Па, во ред, за „сакана“ е претерување. Наместо тоа, „беше во можност да коегзистира со“.

Како што сите знаете, од 16 април 2018 година, Роскомнадзор го блокира пристапот до ресурсите на Интернет во екстремно широки движења, додавајќи во „Унифициран регистар на имиња на домени, индекси на страници на страници на Интернет и мрежни адреси кои овозможуваат идентификација на сајтови на Интернет“, што содржи информации чија дистрибуција е забранета во Руската Федерација“ (во текстот - само регистар) од /10 понекогаш. Како резултат на тоа, граѓаните на Руската Федерација и бизнисите страдаат, бидејќи го изгубиле пристапот до целосно легалните ресурси што им се потребни.

Откако во коментарите на една од написите на Хабре реков дека сум подготвен да им помогнам на жртвите при поставувањето на шема за бајпас, неколку луѓе дојдоа кај мене барајќи таква помош. Кога сè им помогна, еден од нив препорача да ја опише техниката во статија. По малку размислување, решив да го скршам молкот на страницата и да се обидам еднаш да напишам нешто посредно помеѓу проект и објава на Фејсбук, т.е. хабрапост. Резултатот е пред вас.

Општи услови

Бидејќи не е многу легално да се објавуваат начини за заобиколување на блокирање пристап до информации забранети на територијата на Руската Федерација, целта на овој напис ќе биде да се зборува за метод кој ви овозможува да го автоматизирате добивањето пристап до ресурсите што се дозволени на територија на Руската Федерација, но поради туѓи постапки не се директно достапни преку вашиот провајдер. И пристапот до други ресурси добиени како резултат на дејствијата од статијата е несреќен несакан ефект и во никој случај не е целта на статијата.

Исто така, бидејќи јас сум првенствено мрежен архитект по професија, струка и животен пат, програмирањето и Linux не ми се силни страни. Затоа, се разбира, скриптите можат да се напишат подобро, безбедносните прашања во VPS може да се разработат подлабоко, итн. Вашите предлози ќе бидат прифатени со благодарност, доколку се доволно детални - со задоволство ќе ги додадам во текстот на статијата.

TL; ДР

Ние го автоматизираме пристапот до ресурсите преку вашиот постоечки тунел користејќи копија од регистарот и протоколот BGP. Целта е да се отстрани целиот сообраќај насочен кон блокираните ресурси во тунелот. Минимум објаснувања, главно чекор-по-чекор инструкции.

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

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

  1. Мора да имате линукс сервер некаде надвор од полето за блокирање. Или барем желбата да се има таков сервер - за среќа сега чини од 9 долари/годишно, а можеби и помалку. Методот е исто така погоден ако имате посебен VPN тунел, тогаш серверот може да се наоѓа во полето за блокирање.
  2. Вашиот рутер треба да биде доволно паметен за да може
    • кој било VPN клиент што ви се допаѓа (преферирам OpenVPN, но може да биде PPTP, L2TP, GRE+IPSec или која било друга опција што создава интерфејс во тунел);
    • BGPv4 протокол. Што значи дека за SOHO може да биде Mikrotik или било кој рутер со OpenWRT/LEDE/сличен прилагоден фирмвер кој ви овозможува да инсталирате Quagga или Bird. Користењето рутер за компјутер исто така не е забрането. Во случај на претпријатие, побарајте поддршка за BGP во документацијата за вашиот граничен рутер.
  3. Треба да имате разбирање за користењето на Linux и мрежни технологии, вклучувајќи го и протоколот BGP. Или барем сакате да добиете таква идеја. Бидејќи овој пат не сум подготвен да ја прифатам неизмерноста, ќе треба сами да проучите некои аспекти кои ви се неразбирливи. Сепак, јас, се разбира, ќе одговорам на конкретни прашања во коментарите и веројатно нема да бидам единствениот што ќе одговара, затоа не двоумете се да прашате.

Што е употребено во примерот

  • Копија од регистарот - од https://github.com/zapret-info/z-i 
  • VPS - Ubuntu 16.04
  • Услуга за рутирање - птица 1.6.3   
  • Рутер - Mikrotik hAP ac
  • Работни папки - бидејќи работиме како root, најмногу од сè ќе се наоѓа во домашната папка на root. Соодветно:
    • /root/црна листа - работна папка со скрипта за компилација
    • /root/zi - копија од регистарот од github
    • /etc/bird - стандардна папка за поставки за птичји сервиси
  • Надворешната IP адреса на VPS со рутирачкиот сервер и точката на завршување на тунелот е 194.165.22.146, ASN 64998; надворешна IP адреса на рутерот - 81.177.103.94, ASN 64999
  • IP адресите во тунелот се 172.30.1.1 и 172.30.1.2, соодветно.

Поставување BGP за да се заобиколи блокирањето или „Како престанав да се плашам и се заљубив во RKN“

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

Накратко - логиката на решението

  1. Подготвителни активности
    1. Добивање VPS
    2. Подигнување на тунел од рутерот до VPS
  2. Добиваме и редовно ажурираме копија од регистарот
  3. Инсталирање и конфигурирање на услугата за насочување
  4. Ние создаваме листа на статични правци за услугата за насочување врз основа на регистарот
  5. Го поврзуваме рутерот со услугата и го конфигурираме испраќањето на целиот сообраќај низ тунелот.

Вистинското решение

Подготвителни активности

Постојат многу услуги на Интернет кои обезбедуваат VPS за исклучително поволни цени. Досега ја најдов и ја користам опцијата за 9$/годишно, но дури и ако не се мачите премногу, има многу опции за 1E/месец на секој агол. Прашањето за избор на VPS лежи многу подалеку од опсегот на овој напис, па ако некој не разбира нешто за ова, прашајте во коментарите.

Ако користите VPS не само за услугата за насочување, туку и за да го прекинете тунелот на него, треба да го подигнете овој тунел и, речиси сигурно, да го конфигурирате NAT за него. Има голем број инструкции за овие дејства на Интернет, нема да ги повторувам овде. Главниот услов за таков тунел е тоа што мора да создаде посебен интерфејс на вашиот рутер кој го поддржува тунелот кон VPS. Најчесто користените VPN технологии го задоволуваат ова барање - на пример, OpenVPN во режимот Tun е совршен.

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

Како што рече Џебраил: „Оној што ни попречува ќе ни помогне“. Бидејќи РКН создава регистар на забранети ресурси, би било грев да не го користиме овој регистар за да го решиме нашиот проблем. Ќе добиеме копија од регистарот од github.

Одиме на вашиот Linux сервер, спаѓаме во коренскиот контекст (судо су -) и инсталирај git ако не е веќе инсталиран.

apt install git

Одете во вашиот домашен директориум и извадете копија од регистарот.

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

Поставивме ажурирање на cron (го правам еднаш на секои 20 минути, но можете да изберете кој било интервал што ве интересира). За да го направите ова, стартуваме crontab-e и додадете ја следната линија на неа:

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

Поврзуваме кука што ќе создаде датотеки за услугата за рутирање по ажурирањето на регистарот. За да го направите ова, креирајте датотека /root/zi/.git/hooks/post-merge со следнава содржина:

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

Ќе ја креираме скриптата makebgp на која се однесува куката малку подоцна.

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

Инсталирајте птица. За жал, верзијата на птица која моментално е објавена во складиштата на Ubuntu е споредлива по свежина со изметот Archeopteryx, така што прво треба да ја додадеме официјалната PPA на развивачите на софтвер во системот.

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

После ова, веднаш ја оневозможуваме птицата за IPv6 - нема да ни треба во оваа инсталација.

systemctl stop bird6
systemctl disable bird6

Подолу е минималистичка конфигурациска датотека за услуга за птици (/etc/bird/bird.conf), што ни е сосема доволно (и уште еднаш ве потсетувам дека никој не забранува развивање и прилагодување на идејата за да одговара на вашите потреби)

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

ИД на рутер - идентификатор на рутер, кој визуелно изгледа како IPv4 адреса, но не е таков. Во нашиот случај, може да биде кој било 32-битен број во форматот на адресата IPv4, но добра форма е да се наведе точно IPv4 адресата на вашиот уред (во овој случај, VPS).

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

протокол статика е нашата магија што вчитува списоци со префикси и IP адреси (кои всушност се /32 префикси, се разбира) од датотеките за последователно објавување. Од каде доаѓаат овие списоци ќе се дискутира подолу. Ве молиме имајте предвид дека вчитувањето на IP-адресите е стандардно коментирано, причината за ова е големиот обем на поставување. За споредба, во моментот на пишување, има 78 линии во списокот со префикси, а 85898 во списокот со IP адреси. Силно препорачувам да се стартува и дебагира само на списокот со префикси и дали да се овозможи или не вчитувањето на IP во иднината зависи од вас да одлучите откако ќе експериментирате со вашиот рутер. Не секој од нив може лесно да свари 85 илјади записи во рутирачката табела.

протоколот bgp, всушност, поставува bgp peering со вашиот рутер. IP адресата е адресата на надворешниот интерфејс на рутерот (или адресата на интерфејсот на тунелот од страната на рутерот), 64998 и 64999 се броевите на автономните системи. Во овој случај, тие може да се доделат во форма на какви било 16-битни броеви, но добра практика е да се користат AS броеви од приватниот опсег дефиниран со RFC6996 - 64512-65534 вклучително (постои формат за 32-битни ASN, но во нашиот случај ова е дефинитивно претерано). Опишаната конфигурација користи eBGP peering, во која броевите на автономните системи на услугата за насочување и рутерот мора да бидат различни.

Како што можете да видите, услугата треба да ја знае IP адресата на рутерот, па ако имате динамична или не-рутирачка приватна (RFC1918) или споделена (RFC6598) адреса, немате опција да го зголемите вртењето на надворешната интерфејс, но услугата сепак ќе работи внатре во тунелот.

Исто така, сосема е јасно дека од една услуга можете да обезбедите правци до неколку различни рутери - само дуплирајте ги поставките за нив со копирање на делот за протокол bgp и менување на IP адресата на соседот. Затоа примерот ги прикажува поставките за ѕиркање надвор од тунелот, како најуниверзални. Лесно е да ги отстраните во тунелот со соодветно менување на IP адресите во поставките.

Обработка на регистарот за услугата за насочување

Сега ни треба, всушност, да креираме списоци со префикси и IP адреси, кои беа споменати во статиката на протоколот во претходната фаза. За да го направите ова, ја земаме датотеката во регистарот и ги правиме датотеките што ни се потребни од неа користејќи ја следнава скрипта, сместена во /root/црна листа/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'

Не заборавајте да го направите извршно

chmod +x /root/blacklist/makebgp

Сега можете да го извршите рачно и да го набљудувате изгледот на датотеките во /etc/bird.

Најверојатно, птица не работи за вас во овој момент, бидејќи во претходната фаза побаравте од неа да бара датотеки што сè уште не постоеле. Затоа, го стартуваме и проверуваме дали е започнато:

systemctl start bird
birdc show route

Излезот од втората команда треба да покаже околу 80 записи (ова е засега, но кога ќе го поставите, сè ќе зависи од ревноста на RKN во блокирањето на мрежите) вака:

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

Тим

birdc show protocol

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

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

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

На сите веројатно им е здодевно да ја читаат оваа крпа за нозе, но смирете се - крајот е близу. Покрај тоа, во овој дел нема да можам да дадам инструкции чекор-по-чекор - тоа ќе биде различно за секој производител.

Сепак, можам да ви покажам неколку примери. Главната логика е да се подигне BGP peering и да се додели nexthop на сите примени префикси, покажувајќи кон нашиот тунел (ако треба да испратиме сообраќај преку интерфејс p2p) или следната IP адреса ако сообраќајот оди на етернет).

На пример, на Mikrotik во RouterOS ова е решено на следниов начин

/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

а во Cisco IOS - вака

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

Ако истиот тунел се користи и за BGP peering и за пренос на корисен сообраќај, не е неопходно да се постави nexthop; тој ќе биде правилно поставен со помош на протоколот. Но, ако го поставите рачно, нема да го влоши ниту.

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

Откако ќе започне вашата BGP сесија, маршрутите до големите мрежи пристигнаа и се инсталирани во табелата, сообраќајот тече до адресите од нив и среќата е блиску, можете да се вратите во службата за птици и да се обидете да го откоментирате влезот таму што ги поврзува листа на IP адреси, извршете после тоа

systemctl reload bird

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

Во вкупен

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

Се разбира, може да се подобри. На пример, прилично е лесно да се сумира список на IP адреси користејќи решенија за perl или python. Едноставна скрипта на Perl што го прави ова користејќи Net::CIDR::Lite претвора 85 илјади префикси во 60 (не илјада), но, се разбира, покрива многу поголем опсег на адреси отколку што е блокирано.

Бидејќи услугата работи на третото ниво на моделот ISO/OSI, нема да ве спаси од блокирање на страница/страница ако се реши на погрешна адреса како што е запишана во регистарот. Но, заедно со регистарот, датотеката nxdomain.txt пристигнува од github, која со неколку потези на скриптата лесно се претвора во извор на адреси за, на пример, додатокот SwitchyOmega во Chrome.

Исто така, неопходно е да се спомене дека решението бара дополнителна доработка доколку не сте само корисник на Интернет, туку и сами објавувате некои ресурси (на пример, веб-локација или сервер за пошта работи на оваа врска). Користејќи ги средствата на рутерот, неопходно е строго да се поврзе појдовниот сообраќај од оваа услуга со вашата јавна адреса, во спротивно ќе ја изгубите поврзаноста со оние ресурси што се опфатени со списокот на префикси што ги добива рутерот.

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

UPD. Ви благодарам навионија и TerAnYu за параметри за git кои овозможуваат намалување на обемот на преземање.

UPD2. Колеги, изгледа згрешив што не додадов инструкции за поставување тунел помеѓу VPS и рутерот во статијата. Со ова се поставуваат многу прашања.
За секој случај, уште еднаш ќе забележам дека пред да го започнете овој водич, веќе сте конфигурирале VPN тунел во насока што ви треба и ја проверивте неговата функционалност (на пример, со вртење на сообраќајот таму стандардно или статички). Ако сè уште не сте ја завршиле оваа фаза, нема многу смисла да ги следите чекорите во статијата. Сè уште немам свој текст за ова, но ако гуглате „поставување сервер OpenVPN“ заедно со името на оперативниот систем инсталиран на VPS и „поставување клиент OpenVPN“ со името на вашиот рутер , најверојатно ќе најдете голем број написи на оваа тема, вклучително и на Habré.

UPD3. Нежртвуван Напишав код што го претвора dump.csv во добиена датотека за птица со опционално сумирање на IP адреси. Затоа, делот „Обработка на регистарот за услугата за насочување“ може да се замени со повикување на неговата програма. https://habr.com/post/354282/#comment_10782712

UPD4. Малку работа на грешки (не ги додадов во текстот):
1) наместо тоа systemctl повторно вчитај птица има смисла да се користи командата birdc конфигурирање.
2) во рутерот Mikrotik, наместо да го смените nexthop на IP на втората страна на тунелот /филтер за насочување додадете акција=прифати синџир=динамички-во протокол=bgp коментар=»Постави nexthop» set-in-nexthop=172.30.1.1 има смисла да се одреди маршрутата директно до интерфејсот на тунелот, без адреса /филтер за насочување додадете акција=прифати синџир=динамички-во протокол=bgp коментар=»Постави nexthop» set-in-nexthop-direct=<име на интерфејс>

UPD5. Се појави нова услуга https://antifilter.download, од каде што можете да подигнете готови списоци со IP адреси. Се ажурира на секои половина час. На страната на клиентот, останува само да ги врамите записите со соодветната „рута... одбие“.
И во овој момент, веројатно, доволно е да ја парталите баба ви и да ја ажурирате статијата.

UPD6. Ревидирана верзија на статијата за оние кои не сакаат да го сфатат, но сакаат да започнат - тука.

Извор: www.habr.com

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