Menyediakan BGP untuk memintas penyekatan, atau "Bagaimana saya berhenti takut dan jatuh cinta dengan RKN"

Baiklah, tentang "disayangi" adalah keterlaluan. Sebaliknya, "dapat hidup bersama."

Seperti yang anda semua tahu, sejak 16 April 2018, Roskomnadzor telah menyekat akses kepada sumber di Internet dengan sangat luas, menambah kepada "Daftar Bersatu nama domain, indeks halaman tapak di Internet dan alamat rangkaian yang membolehkan tapak mengenal pasti. di Internet," yang mengandungi maklumat yang pengedarannya dilarang di Persekutuan Rusia" (dalam teks - hanya daftar) oleh /10 kadang-kadang. Akibatnya, rakyat Persekutuan Rusia dan perniagaan menderita, kehilangan akses kepada sumber undang-undang sepenuhnya yang mereka perlukan.

Selepas saya berkata dalam komen kepada salah satu artikel mengenai Habré bahawa saya bersedia membantu mangsa dengan menubuhkan skim pintasan, beberapa orang datang kepada saya meminta bantuan sedemikian. Apabila semuanya berfungsi untuk mereka, salah seorang daripada mereka mengesyorkan menerangkan teknik dalam artikel. Selepas beberapa pemikiran, saya memutuskan untuk memecah kesunyian saya di laman web dan mencuba sekali untuk menulis sesuatu perantaraan antara projek dan siaran Facebook, i.e. habrapost. Hasilnya di hadapan anda.

Penafian

Memandangkan tidak terlalu sah untuk menerbitkan cara untuk memintas menyekat akses kepada maklumat yang dilarang di wilayah Persekutuan Rusia, tujuan artikel ini adalah untuk membincangkan kaedah yang membolehkan anda mengautomasikan mendapatkan akses kepada sumber yang dibenarkan pada wilayah Persekutuan Rusia, tetapi disebabkan oleh tindakan orang lain tidak boleh diakses secara langsung melalui pembekal anda. Dan akses kepada sumber lain yang diperoleh hasil daripada tindakan daripada artikel adalah kesan sampingan yang malang dan sama sekali bukan tujuan artikel itu.

Selain itu, kerana saya terutamanya seorang arkitek rangkaian mengikut profesion, kerjaya dan laluan hidup, pengaturcaraan dan Linux bukanlah titik kuat saya. Oleh itu, sudah tentu, skrip boleh ditulis dengan lebih baik, isu keselamatan dalam VPS boleh diselesaikan dengan lebih mendalam, dsb. Cadangan anda akan diterima dengan penuh rasa terima kasih, jika ia cukup terperinci - Saya dengan senang hati akan menambahkannya pada teks artikel.

TL; DR

Kami mengautomasikan akses kepada sumber melalui terowong sedia ada anda menggunakan salinan pendaftaran dan protokol BGP. Matlamatnya adalah untuk mengalih keluar semua trafik yang ditujukan kepada sumber yang disekat ke dalam terowong. Penjelasan minimum, kebanyakannya arahan langkah demi langkah.

Apa yang anda perlukan untuk ini?

Malangnya, siaran ini bukan untuk semua orang. Untuk menggunakan teknik ini, anda perlu menggabungkan beberapa elemen:

  1. Anda mesti mempunyai pelayan linux di suatu tempat di luar medan penyekatan. Atau sekurang-kurangnya keinginan untuk memiliki pelayan sedemikian - mujurlah harganya kini dari $9/tahun, dan mungkin kurang. Kaedah ini juga sesuai jika anda mempunyai terowong VPN yang berasingan, maka pelayan boleh ditempatkan di dalam medan penyekatan.
  2. Penghala anda harus cukup pintar untuk dapat melakukannya
    • mana-mana klien VPN yang anda suka (saya lebih suka OpenVPN, tetapi boleh jadi PPTP, L2TP, GRE+IPSec atau sebarang pilihan lain yang mencipta antara muka terowong);
    • Protokol BGPv4. Ini bermakna bahawa untuk SOHO ia boleh menjadi Mikrotik atau mana-mana penghala dengan perisian tegar tersuai OpenWRT/LEDE/serupa yang membolehkan anda memasang Quagga atau Bird. Menggunakan penghala PC juga tidak dilarang. Dalam kes perusahaan, cari sokongan BGP dalam dokumentasi untuk penghala sempadan anda.
  3. Anda harus mempunyai pemahaman tentang penggunaan Linux dan teknologi rangkaian, termasuk protokol BGP. Atau sekurang-kurangnya ingin mendapatkan idea sedemikian. Oleh kerana saya tidak bersedia untuk menerima kehebatan kali ini, anda perlu mengkaji beberapa aspek yang anda tidak dapat memahaminya sendiri. Walau bagaimanapun, saya akan, sudah tentu, menjawab soalan khusus dalam ulasan dan saya tidak mungkin menjadi satu-satunya yang menjawab, jadi jangan teragak-agak untuk bertanya.

Apa yang digunakan dalam contoh

  • Salinan daftar - daripada https://github.com/zapret-info/z-i 
  • VPS - Ubuntu 16.04
  • Perkhidmatan penghalaan - burung 1.6.3   
  • Penghala - Mikrotik hAP ac
  • Folder berfungsi - memandangkan kami berfungsi sebagai root, kebanyakan semuanya akan terletak dalam folder rumah root. Masing-masing:
    • /root/blacklist - folder berfungsi dengan skrip kompilasi
    • /root/zi - salinan pendaftaran daripada github
    • /etc/bird - folder standard untuk tetapan perkhidmatan burung
  • Alamat IP luaran VPS dengan pelayan penghalaan dan titik penamat terowong ialah 194.165.22.146, ASN 64998; alamat IP luaran penghala - 81.177.103.94, ASN 64999
  • Alamat IP di dalam terowong ialah 172.30.1.1 dan 172.30.1.2, masing-masing.

Menyediakan BGP untuk memintas penyekatan, atau "Bagaimana saya berhenti takut dan jatuh cinta dengan RKN"

Sudah tentu, anda boleh menggunakan mana-mana penghala, sistem pengendalian dan produk perisian lain, melaraskan penyelesaian kepada logiknya.

Secara ringkas - logik penyelesaian

  1. Tindakan persediaan
    1. Mendapatkan VPS
    2. Menaikkan terowong dari penghala ke VPS
  2. Kami menerima dan mengemas kini salinan pendaftaran secara kerap
  3. Memasang dan mengkonfigurasi perkhidmatan penghalaan
  4. Kami membuat senarai laluan statik untuk perkhidmatan penghalaan berdasarkan pendaftaran
  5. Kami menyambungkan penghala ke perkhidmatan dan mengkonfigurasi menghantar semua lalu lintas melalui terowong.

Penyelesaian sebenar

Tindakan persediaan

Terdapat banyak perkhidmatan di Internet yang menyediakan VPS dengan harga yang sangat berpatutan. Setakat ini saya telah menemui dan menggunakan pilihan untuk $9/tahun, tetapi walaupun anda tidak terlalu risau, terdapat banyak pilihan untuk 1E/bulan di setiap sudut. Persoalan memilih VPS terletak jauh di luar skop artikel ini, jadi jika seseorang tidak memahami sesuatu tentang ini, tanya dalam komen.

Jika anda menggunakan VPS bukan sahaja untuk perkhidmatan penghalaan, tetapi juga untuk menamatkan terowong di atasnya, anda perlu menaikkan terowong ini dan, hampir pasti, mengkonfigurasi NAT untuknya. Terdapat sejumlah besar arahan mengenai tindakan ini di Internet, saya tidak akan mengulanginya di sini. Keperluan utama untuk terowong sedemikian ialah ia mesti mencipta antara muka berasingan pada penghala anda yang menyokong terowong ke arah VPS. Kebanyakan teknologi VPN yang digunakan memenuhi keperluan ini - contohnya, OpenVPN dalam mod tun adalah sempurna.

Mendapatkan salinan pendaftaran

Seperti kata Jabrail, "Siapa yang menghalangi kami akan menolong kami." Memandangkan RKN sedang mencipta daftar sumber terlarang, adalah berdosa jika tidak menggunakan daftar ini untuk menyelesaikan masalah kita. Kami akan menerima salinan pendaftaran daripada github.

Kami pergi ke pelayan Linux anda, jatuh ke dalam konteks akar (sudo su -) dan pasang git jika ia belum dipasang.

apt install git

Pergi ke direktori rumah anda dan tarik keluar salinan pendaftaran.

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

Kami menyediakan kemas kini cron (saya melakukannya sekali setiap 20 minit, tetapi anda boleh memilih mana-mana selang yang menarik minat anda). Untuk melakukan ini, kami melancarkan crontab -e dan tambahkan baris berikut kepadanya:

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

Kami menyambungkan cangkuk yang akan mencipta fail untuk perkhidmatan penghalaan selepas mengemas kini pendaftaran. Untuk melakukan ini, buat fail /root/zi/.git/hooks/post-merge dengan kandungan berikut:

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

dan jangan lupa untuk menjadikannya boleh dilaksanakan

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

Kami akan mencipta skrip makebgp yang dirujuk oleh cangkuk sedikit kemudian.

Memasang dan mengkonfigurasi perkhidmatan penghalaan

Pasang burung. Malangnya, versi burung yang disiarkan pada masa ini dalam repositori Ubuntu adalah setanding kesegarannya dengan najis Archaeopteryx, jadi kami perlu terlebih dahulu menambah PPA rasmi pembangun perisian pada sistem.

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

Selepas ini, kami segera melumpuhkan burung untuk IPv6 - kami tidak memerlukannya dalam pemasangan ini.

systemctl stop bird6
systemctl disable bird6

Di bawah ialah fail konfigurasi perkhidmatan burung minimalis (/etc/bird/bird.conf), yang cukup untuk kami (dan saya mengingatkan anda sekali lagi bahawa tiada siapa yang melarang membangunkan dan menyesuaikan idea untuk memenuhi keperluan anda sendiri)

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 penghala - pengecam penghala, yang secara visual kelihatan seperti alamat IPv4, tetapi bukan satu. Dalam kes kami, ia boleh menjadi sebarang nombor 32-bit dalam format alamat IPv4, tetapi ia adalah bentuk yang baik untuk menunjukkan alamat IPv4 peranti anda dengan tepat (dalam kes ini, VPS).

protokol langsung mentakrifkan antara muka yang akan berfungsi dengan proses penghalaan. Contoh memberikan beberapa nama contoh, anda boleh menambah yang lain. Anda hanya boleh memadamkan talian; dalam kes ini, pelayan akan mendengar semua antara muka yang tersedia dengan alamat IPv4.

protokol statik ialah keajaiban kami yang memuatkan senarai awalan dan alamat IP (yang sebenarnya /32 awalan, sudah tentu) daripada fail untuk pengumuman seterusnya. Dari mana senarai ini datang akan dibincangkan di bawah. Sila ambil perhatian bahawa memuatkan alamat IP diulas secara lalai, sebab untuk ini adalah jumlah muat naik yang besar. Sebagai perbandingan, pada masa penulisan, terdapat 78 baris dalam senarai awalan dan 85898 dalam senarai alamat IP. Saya amat mengesyorkan memulakan dan menyahpepijat hanya pada senarai awalan dan sama ada untuk mendayakan pemuatan IP dalam atau tidak. masa depan terpulang kepada anda untuk membuat keputusan selepas bereksperimen dengan penghala anda. Tidak setiap satu daripada mereka boleh mencerna 85 ribu entri dalam jadual laluan dengan mudah.

protokol bgp, sebenarnya, menyediakan peering bgp dengan penghala anda. Alamat IP ialah alamat antara muka luaran penghala (atau alamat antara muka terowong di bahagian penghala), 64998 dan 64999 ialah nombor sistem autonomi. Dalam kes ini, ia boleh ditetapkan dalam bentuk mana-mana nombor 16-bit, tetapi adalah amalan yang baik untuk menggunakan nombor AS daripada julat peribadi yang ditakrifkan oleh RFC6996 - 64512-65534 termasuk (terdapat format untuk ASN 32-bit, tetapi dalam kes kami ini pasti berlebihan). Konfigurasi yang diterangkan menggunakan peering eBGP, di mana nombor sistem autonomi perkhidmatan penghalaan dan penghala mestilah berbeza.

Seperti yang anda lihat, perkhidmatan perlu mengetahui alamat IP penghala, jadi jika anda mempunyai alamat peribadi dinamik atau tidak boleh hala (RFC1918) atau dikongsi (RFC6598), anda tidak mempunyai pilihan untuk meningkatkan peering pada luaran antara muka, tetapi perkhidmatan masih akan berfungsi di dalam terowong.

Ia juga agak jelas bahawa dari satu perkhidmatan anda boleh menyediakan laluan ke beberapa penghala yang berbeza - hanya menduplikasi tetapan untuk mereka dengan menyalin bahagian protokol bgp dan menukar alamat IP jiran. Itulah sebabnya contoh menunjukkan tetapan untuk mengintip di luar terowong, sebagai yang paling universal. Sangat mudah untuk mengalihkannya ke dalam terowong dengan menukar alamat IP dalam tetapan dengan sewajarnya.

Memproses pendaftaran untuk perkhidmatan penghalaan

Sekarang kita perlu, sebenarnya, untuk membuat senarai awalan dan alamat IP, yang disebut dalam protokol statik pada peringkat sebelumnya. Untuk melakukan ini, kami mengambil fail pendaftaran dan membuat fail yang kami perlukan daripadanya menggunakan skrip berikut, diletakkan di dalam /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'

Jangan lupa untuk menjadikannya boleh dilaksanakan

chmod +x /root/blacklist/makebgp

Kini anda boleh menjalankannya secara manual dan memerhatikan penampilan fail dalam /etc/bird.

Kemungkinan besar, burung tidak berfungsi untuk anda pada masa ini, kerana pada peringkat sebelumnya anda memintanya untuk mencari fail yang belum wujud lagi. Oleh itu, kami melancarkannya dan menyemak sama ada ia telah bermula:

systemctl start bird
birdc show route

Output arahan kedua harus menunjukkan kira-kira 80 rekod (ini buat masa ini, tetapi apabila anda menyediakannya, semuanya bergantung pada kesungguhan RKN dalam menyekat rangkaian) seperti ini:

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

Pasukan

birdc show protocol

akan menunjukkan status protokol dalam perkhidmatan. Sehingga anda telah mengkonfigurasi penghala (lihat titik seterusnya), protokol OurRouter akan berada dalam keadaan mula (Fasa Sambung atau Aktif), dan selepas sambungan berjaya ia akan pergi ke keadaan atas (Fasa Ditubuhkan). Sebagai contoh, pada sistem saya output arahan ini kelihatan seperti ini:

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

Menyambung penghala

Semua orang mungkin bosan membaca alas kaki ini, tetapi berhati-hatilah - penghujungnya sudah dekat. Lebih-lebih lagi, dalam bahagian ini saya tidak akan dapat memberikan arahan langkah demi langkah - ia akan berbeza untuk setiap pengeluar.

Walau bagaimanapun, saya boleh menunjukkan kepada anda beberapa contoh. Logik utama adalah untuk meningkatkan peering BGP dan menetapkan nexthop kepada semua awalan yang diterima, menunjuk ke terowong kami (jika kami perlu menghantar trafik melalui antara muka p2p) atau alamat IP nexthop jika trafik akan pergi ke ethernet).

Sebagai contoh, pada Mikrotik dalam RouterOS ini diselesaikan seperti berikut

/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

dan dalam Cisco IOS - seperti ini

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

Jika terowong yang sama digunakan untuk peering BGP dan untuk menghantar trafik berguna, ia tidak perlu untuk menetapkan nexthop; ia akan ditetapkan dengan betul menggunakan protokol. Tetapi jika anda menetapkannya secara manual, ia tidak akan memburukkan lagi.

Pada platform lain, anda perlu memikirkan konfigurasi sendiri, tetapi jika anda menghadapi sebarang kesulitan, tulis dalam komen, saya akan cuba membantu.

Selepas sesi BGP anda dimulakan, laluan ke rangkaian besar telah tiba dan dipasang dalam jadual, lalu lintas telah mengalir ke alamat daripada mereka dan kebahagiaan hampir, anda boleh kembali ke perkhidmatan burung dan cuba menyahkomen entri di sana yang menghubungkan senarai alamat IP, laksanakan selepas itu

systemctl reload bird

dan lihat cara penghala anda memindahkan 85 ribu laluan ini. Bersedia untuk mencabut plag dan fikirkan apa yang perlu dilakukan dengannya :)

Dalam jumlah

Secara teorinya, selepas melengkapkan langkah yang diterangkan di atas, anda kini mempunyai perkhidmatan yang mengubah hala secara automatik lalu lintas ke alamat IP yang dilarang di Persekutuan Rusia melepasi sistem penapisan.

Sudah tentu, ia boleh diperbaiki. Sebagai contoh, agak mudah untuk meringkaskan senarai alamat IP menggunakan penyelesaian perl atau python. Skrip Perl mudah melakukan ini menggunakan Net::CIDR::Lite menukar 85 ribu awalan kepada 60 (bukan ribu), tetapi, sudah tentu, meliputi julat alamat yang lebih besar daripada yang disekat.

Memandangkan perkhidmatan beroperasi pada tahap ketiga model ISO/OSI, ia tidak akan menyelamatkan anda daripada menyekat tapak/halaman jika ia menyelesaikan ke alamat yang salah seperti yang direkodkan dalam pendaftaran. Tetapi bersama dengan pendaftaran, fail nxdomain.txt tiba dari github, yang dengan beberapa pukulan skrip dengan mudah bertukar menjadi sumber alamat, sebagai contoh, pemalam SwitchyOmega dalam Chrome.

Perlu juga dinyatakan bahawa penyelesaian itu memerlukan penghalusan tambahan jika anda bukan hanya pengguna Internet, tetapi juga menerbitkan beberapa sumber sendiri (contohnya, tapak web atau pelayan mel berjalan pada sambungan ini). Menggunakan cara penghala, adalah perlu untuk mengikat trafik keluar dari perkhidmatan ini dengan ketat ke alamat awam anda, jika tidak, anda akan kehilangan sambungan dengan sumber tersebut yang diliputi oleh senarai awalan yang diterima oleh penghala.

Jika anda mempunyai sebarang soalan, tanya, saya sedia menjawab.

UPD. Terima kasih pelayaran и TerAnYu untuk parameter untuk git yang membolehkan mengurangkan volum muat turun.

UPD2. Rakan sekerja, nampaknya saya telah membuat kesilapan dengan tidak menambah arahan untuk menyediakan terowong antara VPS dan penghala pada artikel. Banyak persoalan yang ditimbulkan oleh perkara ini.
Sekiranya berlaku, saya akan ambil perhatian sekali lagi bahawa sebelum memulakan panduan ini, anda telah mengkonfigurasi terowong VPN ke arah yang anda perlukan dan menyemak kefungsiannya (contohnya, dengan mengubah trafik ke sana secara lalai atau statik). Jika anda belum menyelesaikan fasa ini lagi, tidak masuk akal untuk mengikuti langkah-langkah dalam artikel. Saya belum mempunyai teks saya sendiri mengenai perkara ini, tetapi jika anda google "menyediakan pelayan OpenVPN" bersama-sama dengan nama sistem pengendalian yang dipasang pada VPS, dan "menyediakan klien OpenVPN" dengan nama penghala anda , kemungkinan besar anda akan menjumpai beberapa artikel mengenai subjek ini, termasuk mengenai Habré.

UPD3. Tidak berkorban Saya menulis kod yang menukar dump.csv menjadi fail terhasil untuk burung dengan ringkasan pilihan alamat IP. Oleh itu, bahagian "Memproses pendaftaran untuk perkhidmatan penghalaan" boleh digantikan dengan memanggil programnya. https://habr.com/post/354282/#comment_10782712

UPD4. Sedikit kerja mengenai ralat (saya tidak menambahkannya pada teks):
1) sebaliknya burung muat semula systemctl masuk akal untuk menggunakan arahan konfigurasi birdc.
2) dalam penghala Mikrotik, bukannya menukar nexthop kepada IP bahagian kedua terowong /routing filter add action=accept chain=dynamic-in protocol=bgp comment=»Tetapkan nexthop» set-in-nexthop=172.30.1.1 masuk akal untuk menentukan laluan terus ke antara muka terowong, tanpa alamat /routing filter add action=accept chain=dynamic-in protocol=bgp comment=»Tetapkan nexthop» set-in-nexthop-direct=<nama antara muka>

UPD5. Perkhidmatan baharu telah muncul https://antifilter.download, dari mana anda boleh mengambil senarai alamat IP sedia ada. Dikemas kini setiap setengah jam. Di sisi pelanggan, yang tinggal hanyalah membingkai rekod dengan "laluan... tolak" yang sepadan.
Dan pada ketika ini, mungkin, sudah cukup untuk mengoyak nenek anda dan mengemas kini artikel itu.

UPD6. Versi artikel yang disemak semula untuk mereka yang tidak mahu memikirkannya, tetapi ingin bermula - di sini.

Sumber: www.habr.com

Tambah komen