Menyiapkan BGP untuk melewati pemblokiran, atau "Bagaimana saya berhenti takut dan jatuh cinta dengan RKN"

Baiklah, tentang "dicintai" itu berlebihan. Sebaliknya, “dapat hidup berdampingan dengan.”

Seperti yang Anda semua ketahui, sejak 16 April 2018, Roskomnadzor telah memblokir akses ke sumber daya di Internet dengan cara yang sangat luas, menambahkan ke “Daftar Terpadu nama domain, indeks halaman situs di Internet dan alamat jaringan yang memungkinkan identifikasi situs di Internet,” berisi informasi yang distribusinya dilarang di Federasi Rusia” (dalam teks - hanya sebuah register) kadang-kadang di /10. Akibatnya, warga Federasi Rusia dan dunia usaha menderita karena kehilangan akses terhadap sumber daya legal yang mereka butuhkan.

Setelah saya mengatakan dalam komentar di salah satu artikel di Habré bahwa saya siap membantu para korban dengan membuat skema bypass, beberapa orang mendatangi saya untuk meminta bantuan tersebut. Ketika semuanya berhasil untuk mereka, salah satu dari mereka merekomendasikan untuk menjelaskan teknik ini dalam sebuah artikel. Setelah berpikir beberapa lama, saya memutuskan untuk memecah kesunyian saya di situs tersebut dan mencoba sekali ini untuk menulis sesuatu yang perantara antara proyek dan postingan Facebook, yaitu. habrapost. Hasilnya ada di depan Anda.

Penolakan tanggung jawab

Karena mempublikasikan cara untuk melewati pemblokiran akses ke informasi yang dilarang di wilayah Federasi Rusia sangatlah tidak sah, tujuan artikel ini adalah untuk membicarakan metode yang memungkinkan Anda mengotomatiskan perolehan akses ke sumber daya yang diizinkan di wilayah Federasi Rusia, namun karena tindakan orang lain tidak dapat diakses secara langsung melalui penyedia Anda. Dan akses ke sumber daya lain yang diperoleh sebagai hasil tindakan dari artikel tersebut merupakan efek samping yang disayangkan dan sama sekali bukan tujuan dari artikel tersebut.

Selain itu, karena saya pada dasarnya adalah seorang arsitek jaringan berdasarkan profesi, pekerjaan, dan jalur hidup, pemrograman dan Linux bukanlah kelebihan saya. Oleh karena itu, tentu saja skrip dapat ditulis dengan lebih baik, masalah keamanan di VPS dapat diatasi lebih dalam, dan sebagainya. Saran Anda akan diterima dengan rasa terima kasih jika cukup rinci - saya akan dengan senang hati menambahkannya ke teks artikel.

TL; DR

Kami mengotomatiskan akses ke sumber daya melalui terowongan Anda yang ada menggunakan salinan registri dan protokol BGP. Tujuannya adalah untuk menghapus semua lalu lintas yang ditujukan ke sumber daya yang diblokir ke dalam terowongan. Penjelasan minimal, sebagian besar petunjuk langkah demi langkah.

Apa yang Anda perlukan untuk ini?

Sayangnya, postingan ini bukan untuk semua orang. Untuk menggunakan teknik ini, Anda perlu menggabungkan beberapa elemen:

  1. Anda harus memiliki server linux di suatu tempat di luar bidang pemblokiran. Atau setidaknya keinginan untuk memiliki server seperti itu - untungnya sekarang biayanya mulai dari $9/tahun, dan mungkin lebih murah. Metode ini juga cocok jika Anda memiliki terowongan VPN terpisah, maka server dapat ditempatkan di dalam bidang pemblokiran.
  2. Router Anda harus cukup pintar untuk bisa melakukannya
    • klien VPN apa pun yang Anda suka (saya lebih suka OpenVPN, tetapi bisa berupa PPTP, L2TP, GRE+IPSec atau opsi lain apa pun yang membuat antarmuka terowongan);
    • Protokol BGPv4. Artinya untuk SOHO bisa berupa Mikrotik atau router apa pun dengan firmware kustom OpenWRT/LEDE/serupa yang memungkinkan Anda menginstal Quagga atau Bird. Menggunakan router PC juga tidak dilarang. Untuk perusahaan, cari dukungan BGP di dokumentasi router perbatasan Anda.
  3. Anda harus memiliki pemahaman tentang penggunaan Linux dan teknologi jaringan, termasuk protokol BGP. Atau setidaknya ingin mendapatkan ide seperti itu. Karena saya belum siap menerima besarnya kali ini, Anda harus mempelajari sendiri beberapa aspek yang tidak dapat Anda pahami. Namun, tentu saja saya akan menjawab pertanyaan spesifik di komentar dan sepertinya saya bukan satu-satunya yang menjawab, jadi jangan ragu untuk bertanya.

Apa yang digunakan dalam contoh tersebut

  • Salinan register - dari https://github.com/zapret-info/z-i 
  • VPS - Ubuntu 16.04
  • Layanan perutean - burung 1.6.3   
  • Perute - Mikrotik hAP ac
  • Folder yang berfungsi - karena kita bekerja sebagai root, sebagian besar semuanya akan ditempatkan di folder utama root. Masing-masing:
    • /root/blacklist - folder kerja dengan skrip kompilasi
    • /root/zi - salinan registri dari github
    • /etc/bird - folder standar untuk pengaturan layanan burung
  • Alamat IP eksternal VPS dengan server perutean dan titik terminasi terowongan adalah 194.165.22.146, ASN 64998; alamat IP eksternal router - 81.177.103.94, ASN 64999
  • Alamat IP di dalam terowongan masing-masing adalah 172.30.1.1 dan 172.30.1.2.

Menyiapkan BGP untuk melewati pemblokiran, atau "Bagaimana saya berhenti takut dan jatuh cinta dengan RKN"

Tentu saja, Anda dapat menggunakan router, sistem operasi, dan produk perangkat lunak lain, menyesuaikan solusi dengan logikanya.

Secara singkat - logika solusinya

  1. Tindakan persiapan
    1. Mendapatkan VPS
    2. Menaikkan terowongan dari router ke VPS
  2. Kami menerima dan memperbarui salinan registri secara rutin
  3. Menginstal dan mengkonfigurasi layanan perutean
  4. Kami membuat daftar rute statis untuk layanan perutean berdasarkan registri
  5. Kami menghubungkan router ke layanan dan mengonfigurasi pengiriman semua lalu lintas melalui terowongan.

Solusi sebenarnya

Tindakan persiapan

Ada banyak layanan di Internet yang menyediakan VPS dengan harga yang sangat wajar. Sejauh ini saya telah menemukan dan menggunakan opsi untuk $9/tahun, tetapi meskipun Anda tidak terlalu repot, ada banyak opsi untuk 1E/bulan di setiap sudut. Pertanyaan tentang memilih VPS berada jauh di luar cakupan artikel ini, jadi jika ada yang belum memahaminya, tanyakan di komentar.

Jika Anda menggunakan VPS tidak hanya untuk layanan perutean, tetapi juga untuk menghentikan terowongan di dalamnya, Anda perlu menaikkan terowongan ini dan, hampir pasti, mengkonfigurasi NAT untuknya. Ada banyak instruksi tentang tindakan ini di Internet, saya tidak akan mengulanginya di sini. Persyaratan utama untuk terowongan semacam itu adalah harus membuat antarmuka terpisah di router Anda yang mendukung terowongan menuju VPS. Sebagian besar teknologi VPN yang digunakan memenuhi persyaratan ini - misalnya, OpenVPN dalam mode tun adalah sempurna.

Mendapatkan salinan registri

Seperti yang dikatakan Jabrail, “Siapa yang menghalangi kita, dialah yang akan menolong kita.” Karena RKN membuat daftar sumber daya terlarang, adalah dosa jika tidak menggunakan daftar ini untuk menyelesaikan masalah kita. Kami akan menerima salinan registri dari github.

Kami pergi ke server Linux Anda, masuk ke konteks root (sudo su —) dan instal git jika belum diinstal.

apt install git

Buka direktori home Anda dan keluarkan salinan registri.

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

Kami menyiapkan pembaruan cron (saya melakukannya setiap 20 menit sekali, tetapi Anda dapat memilih interval mana pun yang Anda minati). Untuk melakukan ini, kami meluncurkannya -e crontab dan tambahkan baris berikut ke dalamnya:

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

Kami menghubungkan kait yang akan membuat file untuk layanan perutean setelah memperbarui registri. Untuk melakukan ini, buat file /root/zi/.git/hooks/post-merge dengan konten sebagai 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 membuatnya dapat dieksekusi

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

Kita akan membuat skrip makebgp yang dirujuk oleh hook nanti.

Menginstal dan mengkonfigurasi layanan perutean

Pasang burung. Sayangnya, versi burung yang saat ini diposting di repositori Ubuntu memiliki kesegaran yang sebanding dengan kotoran Archaeopteryx, jadi kita perlu menambahkan PPA resmi dari pengembang perangkat lunak ke sistem terlebih dahulu.

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

Setelah ini, kami segera menonaktifkan bird untuk IPv6 - kami tidak memerlukannya dalam instalasi ini.

systemctl stop bird6
systemctl disable bird6

Di bawah ini adalah file konfigurasi servis burung minimalis (/etc/bird/bird.conf), yang bagi kami sudah cukup (dan saya ingatkan sekali lagi bahwa tidak ada yang melarang mengembangkan dan menyempurnakan ide agar sesuai dengan kebutuhan Anda)

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 - pengidentifikasi router, yang secara visual terlihat seperti alamat IPv4, tetapi bukan alamat IPv32. Dalam kasus kami, ini bisa berupa nomor 4-bit apa pun dalam format alamat IPv4, tetapi sebaiknya tunjukkan dengan tepat alamat IPvXNUMX perangkat Anda (dalam hal ini, VPS).

protokol langsung menentukan antarmuka mana yang akan bekerja dengan proses perutean. Contoh tersebut memberikan beberapa contoh nama, Anda dapat menambahkan yang lain. Anda cukup menghapus baris tersebut; dalam hal ini, server akan mendengarkan semua antarmuka yang tersedia dengan alamat IPv4.

protokol statis adalah keajaiban kami yang memuat daftar awalan dan alamat IP (yang sebenarnya merupakan awalan /32, tentu saja) dari file untuk pengumuman selanjutnya. Dari mana daftar ini berasal akan dibahas di bawah. Harap dicatat bahwa memuat alamat IP dikomentari secara default, alasannya adalah besarnya volume pengunggahan. Sebagai perbandingan, pada saat penulisan, ada 78 baris dalam daftar awalan, dan 85898 dalam daftar alamat IP. Saya sangat menyarankan memulai dan men-debug hanya pada daftar awalan, dan apakah akan mengaktifkan pemuatan IP di atau tidak masa depan terserah Anda untuk memutuskan setelah bereksperimen dengan router Anda. Tidak semuanya bisa dengan mudah mencerna 85 ribu entri di tabel routing.

protokol bgp, pada kenyataannya, mengatur bgp peering dengan router Anda. Alamat IP adalah alamat antarmuka eksternal router (atau alamat antarmuka terowongan di sisi router), 64998 dan 64999 adalah nomor sistem otonom. Dalam hal ini, mereka dapat ditetapkan dalam bentuk angka 16-bit apa pun, tetapi praktik yang baik adalah menggunakan nomor AS dari rentang pribadi yang ditentukan oleh RFC6996 - 64512-65534 inklusif (ada format untuk ASN 32-bit, tapi dalam kasus kami ini jelas berlebihan). Konfigurasi yang dijelaskan menggunakan peering eBGP, di mana jumlah sistem otonom layanan perutean dan router harus berbeda.

Seperti yang Anda lihat, layanan perlu mengetahui alamat IP router, jadi jika Anda memiliki alamat pribadi yang dinamis atau tidak dapat dirutekan (RFC1918) atau bersama (RFC6598), Anda tidak memiliki opsi untuk meningkatkan peering pada eksternal antarmuka, namun layanan akan tetap berfungsi di dalam terowongan.

Juga cukup jelas bahwa dari satu layanan Anda dapat menyediakan rute ke beberapa router yang berbeda - cukup duplikat pengaturannya dengan menyalin bagian protokol bgp dan mengubah alamat IP tetangga. Itulah sebabnya contoh menunjukkan pengaturan untuk mengintip ke luar terowongan, sebagai yang paling universal. Sangat mudah untuk menghapusnya ke dalam terowongan dengan mengubah alamat IP di pengaturan yang sesuai.

Memproses registri untuk layanan perutean

Sekarang kita perlu membuat daftar awalan dan alamat IP, yang disebutkan dalam protokol statis pada tahap sebelumnya. Untuk melakukan ini, kami mengambil file registri dan membuat file yang kami butuhkan menggunakan skrip berikut yang ditempatkan di /root/daftar hitam/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 membuatnya dapat dieksekusi

chmod +x /root/blacklist/makebgp

Sekarang Anda dapat menjalankannya secara manual dan mengamati tampilan file di /etc/bird.

Kemungkinan besar, bird tidak bekerja untuk Anda saat ini, karena pada tahap sebelumnya Anda memintanya untuk mencari file yang belum ada. Oleh karena itu, kami meluncurkannya dan memeriksa apakah sudah dimulai:

systemctl start bird
birdc show route

Output dari perintah kedua akan menampilkan sekitar 80 catatan (ini untuk saat ini, tetapi ketika Anda mengaturnya, semuanya akan tergantung pada semangat RKN dalam memblokir jaringan) kira-kira seperti ini:

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

Tim

birdc show protocol

akan menampilkan status protokol dalam layanan. Sampai Anda mengkonfigurasi router (lihat poin berikutnya), protokol OurRouter akan berada dalam status awal (fase Hubungkan atau Aktif), dan setelah koneksi berhasil, protokol tersebut akan masuk ke status aktif (fase Didirikan). Misalnya, di sistem saya, output dari perintah ini terlihat 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

Menghubungkan router

Semua orang mungkin bosan membaca alas kaki ini, tapi berhati-hatilah - akhir sudah dekat. Selain itu, di bagian ini saya tidak akan dapat memberikan petunjuk langkah demi langkah - ini akan berbeda untuk setiap pabrikan.

Namun, saya dapat menunjukkan beberapa contoh kepada Anda. Logika utamanya adalah menaikkan peering BGP dan menetapkan nexthop ke semua awalan yang diterima, menunjuk ke terowongan kita (jika kita perlu mengirim lalu lintas melalui antarmuka p2p) atau alamat IP nexthop jika lalu lintas akan menuju ke ethernet).

Misalnya pada Mikrotik di RouterOS diselesaikan sebagai 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 di 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 terowongan yang sama digunakan untuk peering BGP dan untuk mentransmisikan lalu lintas yang berguna, nexthop tidak perlu disetel; itu akan disetel dengan benar menggunakan protokol. Namun jika Anda mengaturnya secara manual, itu juga tidak akan memperburuk keadaan.

Di platform lain, Anda harus mengetahui sendiri konfigurasinya, tetapi jika Anda mengalami kesulitan, tulis di komentar, saya akan mencoba membantu.

Setelah sesi BGP Anda dimulai, rute ke jaringan besar telah tiba dan dipasang di tabel, lalu lintas telah mengalir ke alamat dari jaringan tersebut dan kebahagiaan sudah dekat, Anda dapat kembali ke layanan burung dan mencoba menghapus komentar pada entri di sana yang menghubungkan daftar alamat IP, jalankan setelah itu

systemctl reload bird

dan lihat bagaimana router Anda mentransfer 85 ribu rute ini. Bersiaplah untuk mencabut dan memikirkan apa yang harus dilakukan dengannya :)

Total

Secara teoritis murni, setelah menyelesaikan langkah-langkah yang dijelaskan di atas, Anda sekarang memiliki layanan yang secara otomatis mengalihkan lalu lintas ke alamat IP yang dilarang di Federasi Rusia melewati sistem penyaringan.

Tentu saja hal ini dapat ditingkatkan. Misalnya, cukup mudah untuk meringkas daftar alamat IP menggunakan solusi Perl atau python. Skrip Perl sederhana yang melakukan ini menggunakan Net::CIDR::Lite mengubah 85 ribu awalan menjadi 60 (bukan ribuan), tetapi, tentu saja, mencakup rentang alamat yang jauh lebih besar daripada yang diblokir.

Karena layanan ini beroperasi pada tingkat ketiga model ISO/OSI, layanan ini tidak akan menyelamatkan Anda dari pemblokiran situs/halaman jika layanan tersebut mengarah ke alamat yang salah seperti yang dicatat dalam registri. Namun seiring dengan registri, file nxdomain.txt berasal dari github, yang dengan beberapa goresan skrip dengan mudah berubah menjadi sumber alamat, misalnya, plugin SwitchyOmega di Chrome.

Perlu juga disebutkan bahwa solusi tersebut memerlukan penyempurnaan tambahan jika Anda bukan hanya pengguna Internet, tetapi juga menerbitkan beberapa sumber daya sendiri (misalnya, situs web atau server email berjalan melalui koneksi ini). Dengan menggunakan sarana router, lalu lintas keluar dari layanan ini harus diikat dengan ketat ke alamat publik Anda, jika tidak, Anda akan kehilangan konektivitas dengan sumber daya yang tercakup dalam daftar awalan yang diterima oleh router.

Jika Anda memiliki pertanyaan, tanyakan, saya siap menjawab.

UPD. Terima kasih angkatan laut и TerAnYu untuk parameter git yang memungkinkan pengurangan volume unduhan.

UPD2. Rekan-rekan, sepertinya saya melakukan kesalahan dengan tidak menambahkan petunjuk pengaturan terowongan antara VPS dan router ke artikel. Banyak pertanyaan yang muncul karena hal ini.
Untuk berjaga-jaga, saya perhatikan sekali lagi bahwa sebelum memulai panduan ini, Anda telah mengonfigurasi terowongan VPN ke arah yang Anda perlukan dan memeriksa fungsinya (misalnya, dengan mengubah lalu lintas di sana secara default atau statis). Jika Anda belum menyelesaikan fase ini, tidak masuk akal untuk mengikuti langkah-langkah dalam artikel. Saya belum memiliki teks sendiri tentang ini, tetapi jika Anda mencari di Google "menyiapkan server OpenVPN" bersama dengan nama sistem operasi yang diinstal pada VPS, dan "menyiapkan klien OpenVPN" dengan nama router Anda , kemungkinan besar Anda akan menemukan sejumlah artikel tentang subjek ini, termasuk di Habré.

UPD3. Tidak dikorbankan Saya menulis kode yang mengubah dump.csv menjadi file yang dihasilkan untuk bird dengan ringkasan alamat IP opsional. Oleh karena itu, bagian “Memproses registri untuk layanan perutean” dapat diganti dengan memanggil programnya. https://habr.com/post/354282/#comment_10782712

UPD4. Sedikit perbaikan pada kesalahan (saya tidak menambahkannya ke teks):
1) sebagai gantinya systemctl memuat ulang burung masuk akal untuk menggunakan perintah itu konfigurasi birdc.
2) di router Mikrotik, alih-alih mengubah nexthop ke IP terowongan sisi kedua /filter perutean tambahkan tindakan=terima rantai=protokol dinamis-in=bgp komentar=»Atur nexthop» set-in-nexthop=172.30.1.1 masuk akal untuk menentukan rute langsung ke antarmuka terowongan, tanpa alamat /filter perutean tambahkan tindakan=terima rantai=protokol dinamis-in=bgp komentar=»Atur nexthop» set-in-nexthop-direct=<nama antarmuka>

UPD5. Layanan baru telah muncul https://antifilter.download, dari mana Anda dapat mengambil daftar alamat IP yang sudah jadi. Diperbarui setiap setengah jam. Di sisi klien, yang tersisa hanyalah membingkai catatan dengan "rute... penolakan" yang sesuai.
Dan pada titik ini, mungkin, cukup dengan membuat nenek Anda marah dan memperbarui artikelnya.

UPD6. Versi artikel yang direvisi untuk mereka yang tidak ingin memahaminya, tetapi ingin memulai - di sini.

Sumber: www.habr.com

Tambah komentar