Engellemeyi atlamak için BGP'yi ayarlama veya "Korkmayı nasıl bıraktım ve RKN'ye nasıl aşık oldum"

Tamam, "sevilen" kelimesi abartıdır. Daha ziyade “bir arada var olmayı başardı.”

Hepinizin bildiği gibi, 16 Nisan 2018'den bu yana Roskomnadzor, İnternet'teki kaynaklara erişimi son derece geniş vuruşlarla engelliyor ve "Alan adlarının Birleşik Kaydına, İnternet'teki sitelerin sayfa dizinlerine ve siteleri tanımlamaya izin veren ağ adreslerine" ekliyor. İnternette “Rusya Federasyonu'nda dağıtımı yasak olan bilgileri içeren” (metinde - sadece bir kayıt) bazen /10'a kadar. Sonuç olarak, ihtiyaç duydukları tamamen yasal kaynaklara erişimlerini kaybeden Rusya Federasyonu vatandaşları ve işletmeler acı çekiyor.

Habré'deki makalelerden birine yaptığım yorumlarda mağdurlara baypas planı oluşturma konusunda yardım etmeye hazır olduğumu söyledikten sonra, birkaç kişi bana gelip böyle bir yardım istedi. Her şey onlar için işe yaradığında, içlerinden biri tekniği bir makalede açıklamayı önerdi. Biraz düşündükten sonra sitedeki sessizliğimi bozmaya ve bir kez olsun bir proje ile Facebook gönderisi arasında bir şeyler yazmayı denemeye karar verdim. habrapost. Sonuç önünüzde.

Feragatname

Rusya Federasyonu topraklarında yasaklanmış bilgilere erişimi engellemeyi atlamanın yollarını yayınlamak çok yasal olmadığından, bu makalenin amacı, Rusya Federasyonu topraklarında izin verilen kaynaklara erişimi otomatikleştirmenize olanak tanıyan bir yöntemden bahsetmek olacaktır. Rusya Federasyonu topraklarında, ancak başka birinin eylemleri nedeniyle sağlayıcınız aracılığıyla doğrudan erişilemez. Makaleden yapılan işlemler sonucunda elde edilen diğer kaynaklara erişim ise talihsiz bir yan etkidir ve hiçbir şekilde makalenin amacı değildir.

Ayrıca mesleğim, mesleğim ve yaşam tarzım itibariyle öncelikle bir ağ mimarı olduğum için programlama ve Linux benim güçlü noktalarım değil. Bu nedenle elbette komut dosyaları daha iyi yazılabilir, VPS'deki güvenlik sorunları daha derinlemesine çözülebilir vb. Önerileriniz yeterince ayrıntılıysa memnuniyetle kabul edilecektir - bunları makalenin metnine eklemekten mutluluk duyacağım.

TL; DR

Kayıt defterinin bir kopyasını ve BGP protokolünü kullanarak mevcut tüneliniz üzerinden kaynaklara erişimi otomatikleştiriyoruz. Amaç, engellenen kaynaklara yönelik tüm trafiği tünele kaldırmaktır. Minimum açıklamalar, çoğunlukla adım adım talimatlar.

Bunun için neye ihtiyacın var?

Ne yazık ki bu yazı herkese göre değil. Bu tekniği kullanmak için birkaç unsuru bir araya getirmeniz gerekecek:

  1. Engelleme alanının dışında bir yerde bir linux sunucunuzun olması gerekir. Veya en azından böyle bir sunucuya sahip olma arzusu - neyse ki maliyeti artık yıllık 9$'dan, hatta muhtemelen daha düşük. Bu yöntem, ayrı bir VPN tüneliniz varsa da uygundur, bu durumda sunucu, engelleme alanının içine yerleştirilebilir.
  2. Yönlendiriciniz bunu yapabilecek kadar akıllı olmalıdır
    • beğendiğiniz herhangi bir VPN istemcisi (Ben OpenVPN'i tercih ederim, ancak PPTP, L2TP, GRE+IPSec veya tünel arayüzü oluşturan başka herhangi bir seçenek olabilir);
    • BGPv4 protokolü. Bu, SOHO için Mikrotik veya Quagga veya Bird'ü kurmanıza izin veren OpenWRT/LEDE/benzer özel bellenime sahip herhangi bir yönlendirici olabileceği anlamına gelir. PC yönlendiricisinin kullanılması da yasak değildir. Bir kuruluş söz konusu olduğunda, sınır yönlendiricinizin belgelerinde BGP desteğini arayın.
  3. BGP protokolü de dahil olmak üzere Linux kullanımı ve ağ teknolojileri hakkında bilgi sahibi olmalısınız. Ya da en azından bu fikri edinmek istiyorum. Bu sefer enginliği kucaklamaya hazır olmadığım için, sizin için anlaşılmaz olan bazı yönleri kendi başınıza incelemeniz gerekecek. Ancak elbette yorumlardaki belirli soruları yanıtlayacağım ve yanıt veren tek kişi olmam pek olası değil, bu yüzden sormaya çekinmeyin.

Örnekte ne kullanılmış?

  • Kaydın bir kopyası - https://github.com/zapret-info/z-i 
  • VPS-Ubuntu 16.04
  • Yönlendirme hizmeti - kuş 1.6.3   
  • Yönlendirici - Mikrotik hAP ac
  • Çalışma klasörleri - root olarak çalıştığımız için her şeyin çoğu root'un ana klasöründe yer alacaktır. Sırasıyla:
    • /root/blacklist - derleme komut dosyasının bulunduğu çalışma klasörü
    • /root/zi - kayıt defterinin github'dan kopyası
    • /etc/bird - kuş hizmeti ayarları için standart klasör
  • Yönlendirme sunucusu ve tünel sonlandırma noktası ile VPS'nin harici IP adresi 194.165.22.146, ASN 64998'dir; yönlendiricinin harici IP adresi - 81.177.103.94, ASN 64999
  • Tünelin içindeki IP adresleri sırasıyla 172.30.1.1 ve 172.30.1.2'dir.

Engellemeyi atlamak için BGP'yi ayarlama veya "Korkmayı nasıl bıraktım ve RKN'ye nasıl aşık oldum"

Elbette, çözümü mantığına göre ayarlayarak diğer yönlendiricileri, işletim sistemlerini ve yazılım ürünlerini kullanabilirsiniz.

Kısaca - çözümün mantığı

  1. Hazırlık faaliyetleri
    1. VPS almak
    2. Yönlendiriciden VPS'ye bir tünel açmak
  2. Kayıt defterinin bir kopyasını alıyoruz ve düzenli olarak güncelliyoruz
  3. Yönlendirme hizmetini yükleme ve yapılandırma
  4. Kayıt defterini temel alarak yönlendirme hizmeti için statik yolların bir listesini oluşturuyoruz
  5. Yönlendiriciyi hizmete bağlarız ve tüm trafiğin tünel üzerinden gönderilmesini yapılandırırız.

Gerçek çözüm

Hazırlık faaliyetleri

İnternette son derece uygun fiyatlara VPS sağlayan birçok hizmet bulunmaktadır. Şu ana kadar yıllık 9 dolar olan seçeneği buldum ve kullanıyorum ama çok fazla uğraşmasanız bile her köşede ayda 1E karşılığında birçok seçenek var. Bir VPS seçme sorunu bu makalenin kapsamının çok ötesindedir, bu nedenle birisi bu konuda bir şey anlamıyorsa yorumlarda sorun.

VPS'yi yalnızca yönlendirme hizmeti için değil, aynı zamanda üzerindeki bir tüneli sonlandırmak için de kullanıyorsanız, bu tüneli yükseltmeniz ve neredeyse kesinlikle NAT'ı bunun için yapılandırmanız gerekir. İnternette bu eylemlerle ilgili çok sayıda talimat var, bunları burada tekrarlamayacağım. Böyle bir tünelin temel gereksinimi, yönlendiricinizde VPS'ye giden tüneli destekleyen ayrı bir arayüz oluşturmasıdır. Kullanılan VPN teknolojilerinin çoğu bu gereksinimi karşılar; örneğin, tun modundaki OpenVPN mükemmeldir.

Kayıt defterinin bir kopyasını alma

Cebrail'in dediği gibi, "Bize engel olan, bize yardım eder." RKN yasaklı kaynakların bir kaydını oluşturduğundan, sorunumuzu çözmek için bu kaydı kullanmamak günah olur. Kayıt defterinin bir kopyasını github'dan alacağız.

Linux sunucunuza gidiyoruz, kök bağlamına giriyoruz (sudo su —) ve henüz kurulu değilse git'i yükleyin.

apt install git

Ana dizininize gidin ve kayıt defterinin bir kopyasını çıkarın.

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

Cron güncellemesi ayarlıyoruz (Ben 20 dakikada bir yapıyorum ama siz ilginizi çeken herhangi bir aralığı seçebilirsiniz). Bunu yapmak için başlatıyoruz crontab -e ve aşağıdaki satırı buna ekleyin:

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

Kayıt defterini güncelledikten sonra yönlendirme hizmeti için dosyalar oluşturacak bir kanca bağlarız. Bunu yapmak için bir dosya oluşturun /root/zi/.git/hooks/post-merge aşağıdaki içerikle:

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

ve çalıştırılabilir yapmayı unutmayın

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

Biraz sonra kancanın ifade ettiği makebgp betiğini oluşturacağız.

Yönlendirme hizmetini yükleme ve yapılandırma

Kuşu yükleyin. Ne yazık ki, şu anda Ubuntu depolarında yayınlanan kuş sürümü, tazelik açısından Archaeopteryx dışkısıyla karşılaştırılabilir, bu nedenle ilk önce yazılım geliştiricilerin resmi PPA'sını sisteme eklememiz gerekiyor.

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

Bundan sonra Bird'ü IPv6 için hemen devre dışı bırakıyoruz - bu kurulumda ona ihtiyacımız olmayacak.

systemctl stop bird6
systemctl disable bird6

Aşağıda minimalist bir kuş hizmeti yapılandırma dosyası bulunmaktadır (/etc/bird/bird.conf), bu bizim için oldukça yeterli (ve kimsenin fikri kendi ihtiyaçlarınıza göre geliştirmeyi ve ayarlamayı yasaklamadığını bir kez daha hatırlatırım)

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

yönlendirici kimliği - görsel olarak bir IPv4 adresine benzeyen ancak bir olmayan yönlendirici tanımlayıcısı. Bizim durumumuzda, IPv32 adres formatında herhangi bir 4 bitlik sayı olabilir, ancak cihazınızın IPv4 adresini (bu durumda VPS) tam olarak belirtmek iyi bir yöntemdir.

doğrudan protokol, yönlendirme işlemiyle hangi arayüzlerin çalışacağını tanımlar. Örnekte birkaç örnek isim verilmiştir, siz başkalarını da ekleyebilirsiniz. Satırı kolayca silebilirsiniz; bu durumda sunucu, IPv4 adresine sahip tüm mevcut arayüzleri dinleyecektir.

protokol statiği, sonraki duyurular için dosyalardan öneklerin ve IP adreslerinin (tabii ki aslında /32 önektir) listelerini yükleyen sihrimizdir. Bu listelerin nereden geldiği aşağıda tartışılacaktır. Lütfen IP adreslerinin yüklenmesinin varsayılan olarak yorumlanmadığını unutmayın; bunun nedeni, yükleme hacminin büyük olmasıdır. Karşılaştırma için, bu yazının yazıldığı sırada önek listesinde 78 satır ve IP adresleri listesinde 85898 satır vardır. Yalnızca önek listesinde başlatmayı ve hata ayıklamayı ve IP yüklemesinin etkinleştirilip etkinleştirilmeyeceğini şiddetle tavsiye ederim. Yönlendiricinizle denemeler yaptıktan sonra geleceğe karar vermek size kalmış. Yönlendirme tablosundaki 85 bin girişi her biri kolaylıkla sindiremez.

protokol bgp aslında yönlendiricinizle bgp eşlemesini kurar. IP adresi, yönlendiricinin harici arayüzünün adresidir (veya yönlendirici tarafındaki tünel arayüzünün adresi), 64998 ve 64999 ise otonom sistemlerin numaralarıdır. Bu durumda, herhangi bir 16 bitlik sayı biçiminde atanabilirler, ancak RFC6996 - 64512-65534 dahil tarafından tanımlanan özel aralıktaki AS numaralarını kullanmak iyi bir uygulamadır (32 bitlik ASN'ler için bir format vardır, ancak bizim durumumuzda bu kesinlikle aşırıdır). Açıklanan konfigürasyon, yönlendirme hizmetinin ve yönlendiricinin otonom sistemlerinin sayısının farklı olması gereken eBGP eşlemesini kullanır.

Gördüğünüz gibi hizmetin yönlendiricinin IP adresini bilmesi gerekiyor; dolayısıyla dinamik veya yönlendirilemeyen özel (RFC1918) veya paylaşılan (RFC6598) adresiniz varsa, harici bağlantıda eşlemeyi yükseltme seçeneğiniz yoktur. arayüz, ancak hizmet tünelin içinde çalışmaya devam edecek.

Ayrıca, bir hizmetten birkaç farklı yönlendiriciye rota sağlayabileceğiniz de oldukça açıktır - sadece protokol bgp bölümünü kopyalayarak ve komşunun IP adresini değiştirerek onlar için ayarları çoğaltmanız yeterlidir. Bu nedenle örnek, en evrensel olan tünelin dışına bakma ayarlarını göstermektedir. Ayarlardaki IP adreslerini buna göre değiştirerek bunları tünele kaldırmak kolaydır.

Yönlendirme hizmeti için kayıt defteri işleniyor

Şimdi aslında önceki aşamada protokol statiğinde bahsedilen öneklerin ve IP adreslerinin listelerini oluşturmamız gerekiyor. Bunu yapmak için, kayıt defteri dosyasını alıyoruz ve aşağıdaki betiği kullanarak ihtiyacımız olan dosyaları oluşturuyoruz. /root/kara liste/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'

Çalıştırılabilir yapmayı unutmayın

chmod +x /root/blacklist/makebgp

Artık bunu manuel olarak çalıştırabilir ve /etc/bird.d dosyasındaki dosyaların görünümünü gözlemleyebilirsiniz.

Büyük olasılıkla, kuş şu anda sizin için çalışmıyor çünkü önceki aşamada ondan henüz var olmayan dosyaları aramasını istemiştiniz. Bu nedenle, onu başlatıyoruz ve başladığını kontrol ediyoruz:

systemctl start bird
birdc show route

İkinci komutun çıktısı yaklaşık 80 kayıt göstermelidir (bu şimdilik, ancak onu kurduğunuzda, her şey RKN'nin ağları engelleme konusundaki gayretine bağlı olacaktır) şunun gibi bir şey göstermelidir:

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

Ekip

birdc show protocol

hizmet içindeki protokollerin durumunu gösterecektir. Yönlendiriciyi yapılandırana kadar (bir sonraki noktaya bakın), OurRouter protokolü başlangıç ​​durumunda olacak (Bağlan veya Aktif aşama) ve başarılı bir bağlantıdan sonra yukarı duruma (Kurulu aşama) gidecektir. Örneğin, sistemimde bu komutun çıktısı şöyle görünür:

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

Yönlendirici bağlama

Muhtemelen herkes bu ayak örtüsünü okumaktan yorulmuştur, ama cesaretli olun; son yaklaşıyor. Üstelik bu bölümde adım adım talimat vermeyeceğim - her üretici için farklı olacaktır.

Ancak size birkaç örnek gösterebilirim. Ana mantık, BGP eşlemesini yükseltmek ve alınan tüm öneklere nexthop atayarak tünelimizi (trafiği bir p2p arayüzü üzerinden göndermemiz gerekiyorsa) veya trafik ethernet'e gidecekse nexthop IP adresini işaret etmektir.

Örneğin RouterOS'taki Mikrotik'te bu şu şekilde çözülür:

/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

ve Cisco IOS'ta - bunun gibi

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

Aynı tünel hem BGP eşlemesi hem de faydalı trafiğin iletimi için kullanılıyorsa, nexthop'un ayarlanması gerekli değildir; protokol kullanılarak doğru şekilde ayarlanacaktır. Ancak bunu manuel olarak ayarlarsanız, durumu daha da kötüleştirmez.

Diğer platformlarda konfigürasyonu kendiniz çözmeniz gerekecek, ancak herhangi bir zorlukla karşılaşırsanız yorumlara yazın, yardım etmeye çalışacağım.

BGP oturumunuz başladıktan, büyük ağlara giden rotalar geldikten ve tabloya kurulduktan, onlardan gelen adreslere trafik aktıktan ve mutluluk yaklaştıktan sonra kuş servisine geri dönebilir ve oradaki bağlantıyı bağlayan girişin yorumunu kaldırmayı deneyebilirsiniz. IP adreslerinin listesi, bundan sonra yürütülür

systemctl reload bird

ve yönlendiricinizin bu 85 bin rotayı nasıl aktardığını görün. Fişi çekmeye ve onunla ne yapacağınızı düşünmeye hazır olun :)

Toplam

Tamamen teorik olarak, yukarıda açıklanan adımları tamamladıktan sonra, artık trafiği, filtreleme sistemini geçerek Rusya Federasyonu'nda yasaklanan IP adreslerine otomatik olarak yönlendiren bir hizmete sahipsiniz.

Elbette geliştirilebilir. Örneğin, Perl veya Python çözümlerini kullanarak bir IP adresleri listesini özetlemek oldukça kolaydır. Bunu Net::CIDR::Lite kullanarak yapan basit bir Perl betiği, 85 bin öneki 60'a (bin değil) dönüştürür, ancak elbette engellenenden çok daha geniş bir adres aralığını kapsar.

Hizmet, ISO/OSI modelinin üçüncü seviyesinde çalıştığından, kayıt defterinde kayıtlı olan yanlış adrese çözümleme yapması durumunda sizi bir siteyi/sayfayı engellemekten kurtarmaz. Ancak kayıt defteriyle birlikte nxdomain.txt dosyası github'dan gelir ve bu dosya, birkaç komut dosyası vuruşuyla kolayca örneğin Chrome'daki SwitchyOmega eklentisi için bir adres kaynağına dönüşür.

Ayrıca, yalnızca bir İnternet kullanıcısı değilseniz, aynı zamanda bazı kaynakları kendi başınıza yayınlıyorsanız (örneğin, bir web sitesi veya posta sunucusu bu bağlantı üzerinde çalışıyorsa), çözümün ek iyileştirme gerektirdiğini de belirtmek gerekir. Yönlendiricinin araçlarını kullanarak, bu hizmetten giden trafiği genel adresinize sıkı bir şekilde bağlamak gerekir, aksi takdirde yönlendirici tarafından alınan öneklerin listesinin kapsadığı kaynaklarla bağlantınızı kaybedersiniz.

Sorularınız varsa sorun, cevaplamaya hazırım.

GÜNCELLEME. Teşekkür ederim navigasyon и TerAnYu git için indirme hacimlerinin azaltılmasına izin veren parametreler için.

GÜNCELLEME2. Meslektaşlarım, VPS ile yönlendirici arasında bir tünel kurma talimatlarını makaleye eklemeyerek bir hata yapmışım gibi görünüyor. Bununla ilgili birçok soru ortaya çıkıyor.
Her ihtimale karşı, bu kılavuza başlamadan önce, ihtiyacınız olan yönde bir VPN tüneli yapılandırdığınızı ve işlevselliğini kontrol ettiğinizi (örneğin, oradaki trafiği varsayılan olarak veya statik olarak çevirerek) bir kez daha not edeceğim. Eğer henüz bu aşamayı tamamlamadıysanız yazıdaki adımları takip etmenin pek bir anlamı yok. Bu konuda henüz kendi metnim yok, ancak VPS'de kurulu işletim sisteminin adıyla birlikte "OpenVPN sunucusu kurma" ve yönlendiricinizin adıyla "OpenVPN istemcisi kurma" ifadesini Google'da ararsanız , büyük olasılıkla Habré de dahil olmak üzere bu konuyla ilgili çok sayıda makale bulacaksınız.

GÜNCELLEME3. Kurban edilmemiş Dump.csv dosyasını, IP adreslerinin isteğe bağlı özetlenmesiyle kuş için sonuç dosyasına dönüştüren bir kod yazdım. Bu nedenle, “Yönlendirme hizmeti için kayıt defterinin işlenmesi” bölümü, programı çağrılarak değiştirilebilir. https://habr.com/post/354282/#comment_10782712

GÜNCELLEME4. Hatalar üzerinde küçük bir çalışma (bunları metne eklemedim):
1) bunun yerine systemctl kuşu yeniden yükle komutunu kullanmak mantıklıdır kuşc yapılandırması.
2) Mikrotik yönlendiricide nexthop'u tünelin ikinci tarafının IP'sine değiştirmek yerine /routing filter add action=zincir kabul et=dinamik giriş protokolü=bgp comment=»Sonraki atlamayı ayarla» set-in-nexthop=172.30.1.1 adres olmadan doğrudan tünel arayüzüne giden rotayı belirtmek mantıklıdır /routing filter add action=zincir kabul et=dinamik-in protokolü=bgp comment=»Nexthop'u ayarla» set-in-nexthop-direct=<arayüz adı>

GÜNCELLEME5. Yeni bir hizmet ortaya çıktı https://antifilter.download, hazır IP adresleri listelerini alabileceğiniz yerden. Her yarım saatte bir güncellenir. İstemci tarafında geriye kalan tek şey, kayıtları ilgili "rota... reddet" ile çerçevelemek.
Ve bu noktada muhtemelen büyükannenizi rahatsız etmek ve makaleyi güncellemek yeterlidir.

GÜNCELLEME6. Çözmek istemeyen ama başlamak isteyenler için makalenin gözden geçirilmiş versiyonu - burada.

Kaynak: habr.com

Yorum ekle