Nyetel BGP kanggo ngliwati pamblokiran, utawa "Carane aku mandheg wedi lan tresna karo RKN"

Inggih, oke, bab "tresna" iku exaggeration. Nanging, "bisa urip bebarengan karo".

Kaya sing sampeyan ngerteni, wiwit tanggal 16 April 2018, Roskomnadzor wis ngalangi akses menyang sumber daya ing Internet kanthi stroke sing amba banget, nambahake menyang "Dhaptar jeneng domain terpadu, indeks kaca situs ing Internet lan alamat jaringan sing ngidini ngenali situs. ing Internet," ngemot informasi distribusi sing dilarang ing Federasi Rusia" (ing teks - mung ndhaftar) dening /10 kadhangkala. Akibaté, warga Federasi Rusia lan bisnis nandhang sangsara, wis ilang akses menyang sumber daya legal sing dibutuhake.

Sawise aku ujar ing komentar ing salah sawijining artikel babagan Habré manawa aku siap mbantu para korban kanthi nyetel skema bypass, sawetara wong teka aku njaluk bantuan kasebut. Nalika kabeh makarya kanggo wong-wong mau, salah siji saka wong-wong mau dianjurake kanggo njlèntrèhaké technique ing artikel. Sawise sawetara pamikiran, Aku mutusaké kanggo break kasepen ing situs lan nyoba kanggo sapisan kanggo nulis soko penengah antarane project lan kirim Facebook, i.e. habrapost. Asil ana ing ngarep sampeyan.

Nolak tanggung jawab

Amarga ora sah nerbitake cara kanggo ngliwati pamblokiran akses menyang informasi sing dilarang ing wilayah Federasi Rusia, tujuane artikel iki yaiku kanggo ngomong babagan cara sing ngidini sampeyan ngotomatisasi entuk akses menyang sumber daya sing diidini ing wilayah Federasi Rusia, nanging amarga tumindak wong liya ora bisa diakses langsung liwat panyedhiya sampeyan. Lan akses menyang sumber daya liyane sing dipikolehi minangka asil saka tumindak saka artikel kasebut minangka efek samping sing ora nyenengake lan ora dadi tujuan artikel kasebut.

Uga, amarga aku utamane dadi arsitek jaringan kanthi profesi, pakaryan lan dalan urip, pemrograman lan Linux dudu titik sing kuwat. Mulane, mesthine, skrip bisa ditulis luwih apik, masalah keamanan ing VPS bisa digarap luwih jero, lsp. Saran sampeyan bakal ditampa kanthi matur nuwun, yen cukup rinci - aku bakal seneng nambahake menyang teks artikel kasebut.

TL; DR

Kita ngotomatisasi akses menyang sumber daya liwat trowongan sing wis ana nggunakake salinan registri lan protokol BGP. Tujuane kanggo mbusak kabeh lalu lintas sing ditujokake menyang sumber daya sing diblokir menyang trowongan. Penjelasan minimal, biasane instruksi langkah demi langkah.

Apa sing sampeyan butuhake kanggo iki?

Sayange, kiriman iki ora kanggo kabeh wong. Kanggo nggunakake teknik iki, sampeyan kudu nggabungake sawetara unsur:

  1. Sampeyan kudu duwe server linux nang endi wae ing njaba lapangan pamblokiran. Utawa paling ora kepinginan duwe server kaya ngono - untung saiki regane saka $ 9 / taun, lan bisa uga kurang. Cara kasebut uga cocog yen sampeyan duwe trowongan VPN sing kapisah, mula server kasebut bisa ditemokake ing lapangan pamblokiran.
  2. Router sampeyan kudu cukup pinter supaya bisa
    • klien VPN apa wae sing disenengi (Aku luwih seneng OpenVPN, nanging bisa dadi PPTP, L2TP, GRE + IPSec utawa pilihan liyane sing nggawe antarmuka trowongan);
    • protokol BGPv4. Tegese kanggo SOHO bisa uga Mikrotik utawa router apa wae karo OpenWRT / LEDE / firmware khusus sing padha sing ngidini sampeyan nginstal Quagga utawa Bird. Nggunakake router PC uga ora dilarang. Ing kasus perusahaan, goleki dhukungan BGP ing dokumentasi kanggo router wates sampeyan.
  3. Sampeyan kudu ngerti babagan panggunaan Linux lan teknologi jaringan, kalebu protokol BGP. Utawa ing paling pengin njaluk idea kuwi. Awit aku durung siyap ngrangkul immensity wektu iki, sampeyan kudu nyinaoni sawetara aspek sing ora bisa dingerteni sampeyan dhewe. Nanging, aku mesthi bakal mangsuli pitakon tartamtu ing komentar lan aku ora mung siji-sijine sing mangsuli, mula aja ragu-ragu takon.

Apa sing digunakake ing conto

  • Salinan ndhaptar - saka https://github.com/zapret-info/z-i 
  • VPS - Ubuntu 16.04
  • Layanan rute - manuk 1.6.3   
  • Router - Mikrotik hAP ac
  • Folder sing digunakake - amarga kita digunakake minangka root, umume kabeh bakal ana ing folder asal root. Mungguh:
    • /root/blacklist - folder kerja karo skrip kompilasi
    • /root/zi - salinan registri saka github
    • /etc/bird - folder standar kanggo setelan layanan manuk
  • Alamat IP eksternal VPS karo server routing lan titik mandap trowongan yaiku 194.165.22.146, ASN 64998; alamat IP eksternal router - 81.177.103.94, ASN 64999
  • Alamat IP ing jero trowongan yaiku 172.30.1.1 lan 172.30.1.2.

Nyetel BGP kanggo ngliwati pamblokiran, utawa "Carane aku mandheg wedi lan tresna karo RKN"

Mesthi, sampeyan bisa nggunakake router liyane, sistem operasi lan produk piranti lunak, nyetel solusi kanggo logika.

Sedhela - logika solusi

  1. Kegiatan Nyiapkeun
    1. Njupuk VPS
    2. Ngunggahake trowongan saka router menyang VPS
  2. Kita nampa lan ajeg nganyari salinan pendaptaran
  3. Nginstal lan ngatur layanan nuntun
  4. Kita nggawe dhaptar rute statis kanggo layanan nuntun adhedhasar pendaptaran
  5. Kita nyambungake router menyang layanan lan ngatur ngirim kabeh lalu lintas liwat trowongan.

Solusi nyata

Kegiatan Nyiapkeun

Ana akeh layanan ing Internet sing nyedhiyakake VPS kanthi rega sing cukup terjangkau. Nganti saiki aku wis nemokake lan nggunakake pilihan kanggo $ 9 / taun, nanging sanajan sampeyan ora keganggu banget, ana akeh pilihan kanggo 1E / sasi ing saben pojok. Pitakonan kanggo milih VPS dumunung adoh ngluwihi ruang lingkup artikel iki, dadi yen ana sing ora ngerti babagan iki, takon ing komentar.

Yen sampeyan nggunakake VPS ora mung kanggo layanan nuntun, nanging uga kanggo mungkasi trowongan ing, sampeyan kudu ngunggahake trowongan iki lan, meh mesthi, ngatur NAT kanggo. Ana akeh pandhuan babagan tumindak kasebut ing Internet, aku ora bakal mbaleni maneh ing kene. Syarat utama kanggo trowongan kasebut yaiku kudu nggawe antarmuka sing kapisah ing router sampeyan sing ndhukung trowongan menyang VPS. Teknologi VPN sing paling akeh digunakake nyukupi syarat iki - contone, OpenVPN ing mode tun sampurna.

Njupuk salinan registri

Jabrail ngandika, "Sapa sing ngalangi kita bakal nulungi kita." Wiwit RKN nggawe registrasi sumber daya sing dilarang, dadi dosa yen ora nggunakake register iki kanggo ngatasi masalah kita. Kita bakal nampa salinan registri saka github.

Kita menyang server Linux sampeyan, mlebu ing konteks root (sudo su -) lan instal git yen durung diinstal.

apt install git

Pindhah menyang direktori ngarep lan tarik metu salinan pendaptaran.

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

Kita nyiyapake nganyari cron (Aku nindakake sapisan saben 20 menit, nanging sampeyan bisa milih interval apa wae sing sampeyan minat). Kanggo nindakake iki, kita miwiti crontab -e lan tambahake baris ing ngisor iki:

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

Kita nyambungake pancing sing bakal nggawe file kanggo layanan nuntun sawise nganyari pendaptaran. Kanggo nindakake iki, nggawe file /root/zi/.git/hooks/post-merge kanthi isi ing ngisor iki:

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

lan aja lali supaya bisa dieksekusi

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

Kita bakal nggawe script makebgp sing pancing nuduhake sethitik mengko.

Nginstal lan ngatur layanan nuntun

Pasang manuk. Sayange, versi manuk sing saiki dikirim ing repositori Ubuntu padha karo kesegaran kanggo feces Archaeopteryx, mula kita kudu nambah PPA resmi pangembang piranti lunak menyang sistem kasebut.

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

Sawise iki, kita langsung mateni manuk kanggo IPv6 - kita ora perlu ing instalasi iki.

systemctl stop bird6
systemctl disable bird6

Ing ngisor iki minangka file konfigurasi layanan manuk minimalis (/etc/bird/bird.conf), sing cukup kanggo kita (lan aku ngelingake maneh yen ora ana sing nglarang ngembangake lan nyetel ide sing cocog karo kabutuhan sampeyan)

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 router - pengenal router, sing katon kaya alamat IPv4, nanging ora siji. Ing kasus kita, bisa dadi nomer 32-bit ing format alamat IPv4, nanging luwih becik kanggo nuduhake alamat IPv4 piranti sampeyan (ing kasus iki, VPS).

protokol langsung nemtokake antarmuka sing bakal bisa digunakake karo proses nuntun. Conto menehi saperangan conto jeneng, sampeyan bisa nambah liyane. Sampeyan mung bisa mbusak baris kasebut; ing kasus iki, server bakal ngrungokake kabeh antarmuka sing kasedhiya kanthi alamat IPv4.

Protokol statis yaiku sihir sing ngemot dhaptar prefiks lan alamat IP (sing bener / 32 prefiks, mesthi) saka file kanggo woro-woro sabanjure. Saka ngendi dhaptar kasebut bakal dirembug ing ngisor iki. Wigati dimangerteni manawa ngemot alamat IP dikomentari kanthi standar, alesan iki amarga volume unggahan sing akeh. Kanggo mbandhingake, nalika nulis, ana 78 baris ing dhaptar ater-ater, lan 85898 ing dhaptar alamat IP. Aku banget nyaranake miwiti lan debugging mung ing dhaptar ater-ater, lan apa utawa ora kanggo ngaktifake IP loading ing mangsa iku nganti sampeyan arep sawise nyobi karo router. Ora saben wong bisa gampang nyerna 85 ewu entri ing tabel routing.

protokol bgp, nyatane, nyetel bgp peering karo router. Alamat IP minangka alamat antarmuka eksternal router (utawa alamat antarmuka terowongan ing sisih router), 64998 lan 64999 minangka nomer sistem otonom. Ing kasus iki, padha bisa diutus ing wangun sembarang nomer 16-dicokot, nanging iku laku apik nggunakake nomer AS saka sawetara pribadi ditetepake dening RFC6996 - 64512-65534 klebu (ana format kanggo 32-dicokot ASNs, nanging ing kasus kita iki mesthi overkill). Konfigurasi sing diterangake nggunakake peering eBGP, sing nomer sistem otonomi layanan routing lan router kudu beda.

Kaya sing sampeyan ngerteni, layanan kasebut kudu ngerti alamat IP router, dadi yen sampeyan duwe alamat pribadi dinamis utawa non-routable (RFC1918) utawa bareng (RFC6598), sampeyan ora duwe pilihan kanggo ngunggahake peering eksternal. antarmuka, nanging layanan isih bakal bisa nang trowongan.

Sampeyan uga cukup jelas yen saka siji layanan sampeyan bisa nyedhiyakake rute menyang sawetara router sing beda - mung duplikat setelan kasebut kanthi nyalin bagean bgp protokol lan ngganti alamat IP pepadhamu. Pramila conto kasebut nuduhake setelan kanggo ndeleng ing njaba trowongan, minangka sing paling universal. Gampang kanggo nyopot menyang trowongan kanthi ngganti alamat IP ing setelan kasebut.

Ngolah pendaptaran kanggo layanan nuntun

Saiki kita kudu, nyatane, nggawe dhaptar awalan lan alamat IP, sing kasebut ing statis protokol ing tahap sadurunge. Kanggo nindakake iki, kita njupuk file pendaptaran lan nggawe file sing kita butuhake saka nggunakake script ing ngisor iki, diselehake ing /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'

Aja lali supaya bisa dieksekusi

chmod +x /root/blacklist/makebgp

Saiki sampeyan bisa mbukak kanthi manual lan mirsani tampilan file ing /etc/bird.

Paling kamungkinan, manuk ora bisa digunakake kanggo sampeyan saiki, amarga ing tataran sadurunge sampeyan takon kanggo nggoleki file sing durung ana. Mula, kita miwiti lan priksa manawa wis diwiwiti:

systemctl start bird
birdc show route

Output saka printah kapindho kudu nuduhake babagan 80 cathetan (iki saiki, nanging yen sampeyan nyetel iku, kabeh bakal gumantung ing zealousness saka RKN ing mblokir jaringan) kaya iki:

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

tim

birdc show protocol

bakal nuduhake status protokol ing layanan kasebut. Nganti sampeyan wis ngatur router (ndeleng titik sabanjure), protokol OurRouter bakal ing negara wiwitan (Sambungake utawa fase Aktif), lan sawise sambungan sukses bakal pindhah menyang negara munggah (Fase Madeg). Contone, ing sistemku, output printah iki katon kaya iki:

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

Nyambungake router

Saben uwong mesthi kesel maca footcloth iki, nanging ati-ati - pungkasane wis cedhak. Kajaba iku, ing bagean iki aku ora bakal bisa menehi pandhuan langkah-langkah - bakal beda kanggo saben pabrikan.

Nanging, aku bisa nuduhake sawetara conto. Logika utama yaiku ngunggahake peering BGP lan nemtokake nexthop kanggo kabeh prefiks sing ditampa, nuding menyang trowongan kita (yen kita kudu ngirim lalu lintas liwat antarmuka p2p) utawa alamat IP nexthop yen lalu lintas bakal menyang ethernet).

Contone, ing Mikrotik ing RouterOS iki ditanggulangi kaya ing ngisor iki

/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

lan ing Cisco IOS - kaya iki

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

Yen trowongan sing padha digunakake kanggo peering BGP lan kanggo ngirim lalu lintas sing migunani, ora perlu nyetel nexthop; bakal disetel kanthi bener nggunakake protokol kasebut. Nanging yen sampeyan nyetel kanthi manual, ora bakal dadi luwih elek.

Ing platform liyane, sampeyan kudu nemtokake konfigurasi dhewe, nanging yen sampeyan duwe kesulitan, tulis ing komentar, aku bakal nyoba nulungi.

Sawise sesi BGP sampeyan wis diwiwiti, rute menyang jaringan gedhe wis teka lan diinstal ing meja, lalu lintas wis mili menyang alamat saka wong-wong mau lan rasa seneng cedhak, sampeyan bisa bali menyang layanan manuk lan nyoba uncomment entri ana sing nyambungake dhaptar alamat IP, eksekusi sawise iku

systemctl reload bird

lan deleng carane router sampeyan nransfer 85 ewu rute kasebut. Disiapake kanggo nyopot lan mikir babagan apa sing kudu ditindakake :)

Total

Secara teoritis, sawise ngrampungake langkah-langkah sing diterangake ing ndhuwur, sampeyan saiki duwe layanan sing kanthi otomatis ngarahake lalu lintas menyang alamat IP sing dilarang ing Federasi Rusia liwat sistem panyaring.

Bisa, mesthi, bisa ditingkatake. Contone, cukup gampang kanggo ngringkes dhaptar alamat IP nggunakake solusi perl utawa python. Skrip Perl prasaja sing nindakake iki nggunakake Net :: CIDR :: Lite ngowahi 85 ewu awalan dadi 60 (ora ewu), nanging, mesthi, kalebu sawetara alamat sing luwih gedhe tinimbang sing diblokir.

Wiwit layanan kasebut beroperasi ing tingkat katelu model ISO/OSI, ora bakal nylametake sampeyan saka mblokir situs/kaca yen alamat sing salah kaya sing dicathet ing registri. Nanging bebarengan karo registri, file nxdomain.txt teka saka github, sing kanthi sawetara stroke script gampang dadi sumber alamat, contone, plugin SwitchyOmega ing Chrome.

Sampeyan uga perlu kanggo sebutno solusi kasebut mbutuhake refinement tambahan yen sampeyan ora mung pangguna Internet, nanging uga nerbitake sawetara sumber daya dhewe (contone, situs web utawa server mail nganggo sambungan iki). Nggunakake sarana router, sampeyan kudu ngikat lalu lintas metu saka layanan iki menyang alamat umum sampeyan, yen ora, sampeyan bakal kelangan konektivitas karo sumber daya sing dilindhungi dening dhaptar prefiks sing ditampa dening router.

Yen sampeyan duwe pitakon, takon, aku siap mangsuli.

UPD. matur nuwun pandhu arah и TerAnYu kanggo paramèter kanggo git sing ngidini ngurangi volume download.

UPD2. Kanca-kanca, kayane aku salah amarga ora nambah instruksi kanggo nyetel trowongan antarane VPS lan router menyang artikel kasebut. A akèh pitakonan sing wungu dening iki.
Yen ngono, aku bakal nyathet maneh yen sadurunge miwiti pandhuan iki, sampeyan wis ngonfigurasi trowongan VPN menyang arah sing dibutuhake lan mriksa fungsine (contone, kanthi ngowahi lalu lintas ing kana kanthi standar utawa statis). Yen sampeyan durung ngrampungake tahap iki, ora ana gunane kanggo ngetutake langkah-langkah ing artikel kasebut. Aku durung duwe teks dhewe babagan iki, nanging yen sampeyan google "nyiyapake server OpenVPN" bebarengan karo jeneng sistem operasi sing diinstal ing VPS, lan "nyiyapake klien OpenVPN" kanthi jeneng router sampeyan. , sampeyan bakal nemokake sawetara artikel babagan topik iki, kalebu ing Habré.

UPD3. Ora dikurbanake Aku wrote kode sing dadi dump.csv menyang file asil kanggo manuk karo ringkesan opsional saka alamat IP. Mulane, bagean "Ngolah pendaptaran kanggo layanan rute" bisa diganti kanthi nelpon program kasebut. https://habr.com/post/354282/#comment_10782712

UPD4. A little work on errors (Aku ora nambah menyang teks):
1) tinimbang systemctl reload manuk iku ndadekake pangertèn kanggo nggunakake printah birdc ngatur.
2) ing router Mikrotik, tinimbang ngganti nexthop menyang IP sisih loro trowongan / routing filter add action=accept chain=dynamic-in protocol=bgp comment=»Setel nexthop»set-in-nexthop=172.30.1.1 iku ndadekake pangertèn kanggo nemtokake rute langsung menyang antarmuka trowongan, tanpa alamat / routing filter add action=accept chain=dynamic-in protocol=bgp comment=»Setel nexthop» set-in-nexthop-direct=<jeneng antarmuka>

UPD5. Layanan anyar wis katon https://antifilter.download, saka ngendi sampeyan bisa njupuk dhaptar alamat IP sing wis siap. Dianyari saben setengah jam. Ing sisih klien, kabeh sing isih ana yaiku pigura rekaman kanthi "rute ... nolak" sing cocog.
Lan ing wektu iki, mbokmenawa, cukup kanggo ngobong mbah putri lan nganyari artikel kasebut.

UPD6. Versi artikel sing wis diowahi kanggo wong sing ora pengin ngerti, nanging pengin miwiti - kene.

Source: www.habr.com

Add a comment