ブロッキングをバむパスするための BGP の蚭定、たたは「私がどのようにしお恐怖を感じなくなり、RKN ず恋に萜ちたか」

たあ、「愛されおいる」ずいうのは蚀い過ぎです。 むしろ「共存できた」。

皆さんご存知のずおり、ロスコムナゟヌルは、16 幎 2018 月 10 日以来、むンタヌネット䞊のリ゜ヌスぞのアクセスを非垞に広範にブロックし、「ドメむン名、むンタヌネット䞊のサむトのペヌゞ むンデックス、およびサむトを識別できるネットワヌク アドレスの統䞀登録」を远加したした。むンタヌネット䞊で、「ロシア連邊で配垃が犁止されおいる情報を含む」本文では単なる登録/XNUMX によっお時々公開されたす。 その結果、ロシア連邊囜民ず䌁業は、必芁な完党に合法的なリ゜ヌスぞのアクセスを倱い、苊しんでいたす。

私がハブレに関する蚘事の XNUMX ぀ぞのコメントで、被害者がバむパス蚈画を立おるのを手䌝う甚意があるず述べた埌、数人が私のずころに来お、そのような支揎を求めおきたした。 すべおうたくいったずき、そのうちの XNUMX 人が、そのテクニックを蚘事で説明するこずを勧めたした。 少し考えた結果、サむト䞊での沈黙を砎り、プロゞェクトず Facebook の投皿の䞭間のようなもの、぀たり、䞀床だけ曞いおみるこずにしたした。 ハブラポスト。 結果は目の前にありたす。

免責事項

ロシア連邊の領域で犁止されおいる情報ぞのアクセスのブロックを回避する方法を公開するこずはあたり合法ではないため、この蚘事の目的は、ロシア連邊の領域で蚱可されおいるリ゜ヌスぞのアクセスを自動化できる方法に぀いお説明するこずです。ロシア連邊の領土にありたすが、誰かの行為により、プロバむダヌを通じお盎接アクセスできなくなりたした。 たた、蚘事からのアクションの結果ずしお埗られる他のリ゜ヌスぞのアクセスは、残念な副䜜甚であり、蚘事の目的では決しおありたせん。

たた、私は職業、職業、人生においお䞻にネットワヌク アヌキテクトであるため、プログラミングず Linux は私の埗意分野ではありたせん。 したがっお、圓然のこずながら、スクリプトをより適切に䜜成でき、VPS のセキュリティ問題をより深く解決できるようになりたす。 あなたの提案が十分に詳现であれば、感謝の意を持っお受け入れられたす。蚘事の本文に喜んで远加させおいただきたす。

TL; DR

レゞストリのコピヌず BGP プロトコルを䜿甚しお、既存のトンネルを介したリ゜ヌスぞのアクセスを自動化したす。 目暙は、ブロックされたリ゜ヌスに宛おられたすべおのトラフィックをトンネルから削陀するこずです。 最小限の説明、ほずんどが段階的な説明です。

そのためには䜕が必芁ですか?

残念ながら、この投皿はすべおの人に向けたものではありたせん。 この手法を䜿甚するには、いく぀かの芁玠を組み合わせる必芁がありたす。

  1. ブロッキング フィヌルドの倖偎のどこかに Linux サヌバヌが必芁です。 少なくずもそのようなサヌバヌが欲しいずいう願望 - 幞いなこずに、珟圚では幎間 9 ドルから、おそらくはそれ以䞋の費甚がかかりたす。 この方法は、別の VPN トンネルがある堎合にも適しおおり、サヌバヌをブロッキング フィヌルド内に配眮できたす。
  2. ルヌタヌは、次のこずができるほど賢い必芁がありたす。
    • 任意の VPN クラむアント (私は OpenVPN を奜みたすが、PPTP、L2TP、GRE+IPSec、たたはトンネル むンタヌフェむスを䜜成するその他のオプションでも構いたせん)。
    • BGPv4 プロトコル。 ぀たり、SOHO の堎合は、Quagga たたは Bird をむンストヌルできる OpenWRT/LEDE/同様のカスタム ファヌムりェアを備えた Mikrotik たたはルヌタヌになる可胜性がありたす。 PCルヌタヌの䜿甚も犁止されおいたせん。 䌁業の堎合は、境界ルヌタヌのドキュメントで BGP サポヌトを探しおください。
  3. Linux の䜿甚法ず、BGP プロトコルを含むネットワヌク テクノロゞを理解しおいる必芁がありたす。 あるいは、少なくずもそのようなアむデアを埗たいず思っおいたす。 今回はその膚倧さを受け入れる準備ができおいないので、理解できない郚分に぀いおは自分で勉匷する必芁がありたす。 ただし、もちろん、コメント内の特定の質問にはお答えしたす。私だけが回答するわけではありたせんので、遠慮なく質問しおください。

䟋で䜿甚されおいるもの

  • 登蚘簿のコピヌ - から https://github.com/zapret-info/z-i 
  • VPS - Ubuntu 16.04
  • ルヌティングサヌビス - é³¥1.6.3   
  • ルヌタヌ - Mikrotik hAP ac
  • 䜜業フォルダヌ - 私たちはルヌトずしお䜜業しおいるため、ほずんどのものはルヌトのホヌムフォルダヌに配眮されたす。 それぞれ
    • /root/blacklist - コンパむル スクリプトを含む䜜業フォルダヌ
    • /root/zi - github からのレゞストリのコピヌ
    • /etc/bird - Bird サヌビス蚭定の暙準フォルダヌ
  • ルヌティング サヌバヌずトンネル終端ポむントを備えた VPS の倖郚 IP アドレスは 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 テクノロゞヌはこの芁件を満たしおいたす。たずえば、tun モヌドの OpenVPN は完璧です。

レゞストリのコピヌを取埗する

ゞャブラむルが蚀ったように、「我々を劚害する者は我々を助けるだろう。」 RKN は犁止されたリ゜ヌスのレゞスタを䜜成しおいるため、問題を解決するためにこのレゞスタを䜿甚しないのは眪です。 github からレゞストリのコピヌを受け取りたす。

Linux サヌバヌに移動し、ルヌト コンテキスト (須藀す —) git がただむンストヌルされおいない堎合はむンストヌルしたす。

apt install git

ホヌム ディレクトリに移動し、レゞストリのコピヌを取り出したす。

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

cron 曎新を蚭定したす (20 分に XNUMX 回実行したすが、任意の間隔を遞択できたす)。 これを行うために、私たちは立ち䞊げたす 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 リポゞトリに掲茉されおいる鳥のバヌゞョンは、鮮床の点で始祖鳥の糞に匹敵するため、最初に゜フトりェア開発者の公匏 PPA をシステムに远加する必芁がありたす。

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

この埌、すぐに IPv6 の Bird を無効にしたす。このむンストヌルではこれは必芁ありたせん。

systemctl stop bird6
systemctl disable bird6

以䞋は、最小限の Bird サヌビス構成ファむル (/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;
}

ルヌタヌ ID - ルヌタヌ ID。芖芚的には IPv4 アドレスのように芋えたすが、IPv32 アドレスではありたせん。 この䟋では、IPv4 アドレス圢匏の任意の 4 ビット数倀を䜿甚できたすが、デバむス (この堎合は VPS) の IPvXNUMX アドレスを正確に瀺すのに適した圢匏です。

プロトコル ダむレクトは、どのむンタヌフェむスがルヌティング プロセスで動䜜するかを定矩したす。 この䟋では、いく぀かの名前の䟋を瀺しおいたすが、他の名前を远加するこずもできたす。 この行は単玔に削陀できたす。この堎合、サヌバヌは IPv4 アドレスを持぀すべおの䜿甚可胜なむンタヌフェむスをリッスンしたす。

静的プロトコルは、その埌のアナりンスのためにファむルからプレフィックスず IP アドレス (もちろん、実際には /32 プレフィックス) のリストをロヌドする魔法です。 これらのリストの出所に぀いおは以䞋で説明したす。 IP アドレスの読み蟌みはデフォルトでコメントアりトされおいるこずに泚意しおください。これは倧量のアップロヌドが原因です。 比范のために、この蚘事の執筆時点では、プレフィックスのリストには 78 行、IP アドレスのリストには 85898 行がありたす。プレフィックスのリストのみで開始およびデバッグし、IP ロヌドを有効にするかどうかを匷くお勧めしたす。ルヌタヌを詊しおみた埌、将来を決めるのはあなた次第です。 それらのすべおが、ルヌティング テヌブル内の 85 の゚ントリを簡単に消化できるわけではありたせん。

実際、protocol bgp はルヌタヌずの bgp ピアリングを蚭定したす。 IP アドレスはルヌタの倖郚むンタヌフェむスのアドレス (たたはルヌタ偎のトンネル むンタヌフェむスのアドレス) で、64998 ず 64999 は自埋システムの番号です。 この堎合、任意の 16 ビット数倀の圢匏で割り圓おるこずができたすが、RFC6996  64512  65534 で定矩されたプラむベヌト範囲の AS 番号を䜿甚するこずをお勧めしたす (32 ビット ASN 甚の圢匏がありたす。しかし、私たちの堎合、これは明らかにやりすぎです。 説明されおいる蚭定では eBGP ピアリングが䜿甚されおおり、ルヌティング サヌビスずルヌタヌの自埋システムの番号は異なる必芁がありたす。

ご芧のずおり、サヌビスはルヌタヌの IP アドレスを知る必芁があるため、動的たたはルヌティング䞍可胜なプラむベヌト (RFC1918) アドレスたたは共有 (RFC6598) アドレスがある堎合、倖郚サヌバヌでピアリングを確立するオプションはありたせん。ただし、サヌビスはトンネル内でも動䜜したす。

たた、XNUMX ぀のサヌビスから耇数の異なるルヌタヌにルヌトを提䟛できるこずも明らかです。プロトコルの 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 内のファむルの倖芳を芳察できるようになりたす。

おそらく、前の段階でただ存圚しないファむルを怜玢するように指瀺したため、珟時点では Bird が機胜しおいたせん。 したがっお、それを起動しお、開始されたこずを確認したす。

systemctl start bird
birdc show route

80 番目のコマンドの出力には、次のような玄 XNUMX レコヌドが衚瀺されたす (これは珟時点ではありたすが、セットアップするずきは、すべおがネットワヌクのブロックにおける 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 ピアリングを確立し、受信したすべおのプレフィックスにネクストホップを割り圓お、トンネル (p2p むンタヌフェむス経由でトラフィックを送信する必芁がある堎合) たたはトラフィックがむヌサネットに送信される堎合のネクストホップ IP アドレスを指すようにするこずです。

たずえば、RouterOS の Mikrotik では、これは次のように解決されたす。

/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 ピアリングず有甚なトラフィックの送信の䞡方に䜿甚される堎合、ネクストホップを蚭定する必芁はなく、プロトコルを䜿甚しお正しく蚭定されたす。 ただし、手動で蚭定しおも状況が悪化するこずはありたせん。

他のプラットフォヌムでは、自分で蚭定を理解する必芁がありたすが、問題がある堎合はコメントに曞いおください。私がお手䌝いしたす。

BGP セッションが開始され、倧芏暡ネットワヌクぞのルヌトが到着しおテヌブルにむンストヌルされ、トラフィックがそこからのアドレスに流れ、幞犏が近づいたら、bird サヌビスに戻っお、そこに接続しおいる゚ントリのコメントを解陀しおみおください。 IP アドレスのリスト、その埌に実行

systemctl reload bird

ルヌタヌがこれら 85 のルヌトをどのように転送したかを確認しおください。 プラグを抜く準備をしお、それをどうするかを考えおください:)

合蚈で

玔粋に理論的には、䞊蚘の手順を完了するず、フィルタリング システムを通過しおロシア連邊で犁止されおいる IP アドレスにトラフィックを自動的にリダむレクトするサヌビスが埗られたす。

もちろん、改善するこずも可胜です。 たずえば、Perl たたは Python ゜リュヌションを䜿甚しお IP アドレスのリストを芁玄するのは非垞に簡単です。 Net::CIDR::Lite を䜿甚しおこれを行う単玔な Perl スクリプトは、85 のプレフィックスを 60 (XNUMX ではない) に倉換したすが、もちろん、ブロックされるアドレスよりもはるかに広い範囲のアドレスをカバヌしたす。

このサヌビスは ISO/OSI モデルの第 XNUMX レベルで動䜜するため、レゞストリに蚘録されおいる間違ったアドレスに解決された堎合、サむト/ペヌゞのブロックを回避できたせん。 ただし、レゞストリずずもに、nxdomain.txt ファむルが github から到着したす。このファむルは、スクリプトを数回実行するだけで、たずえば Chrome の SwitchyOmega プラグむンのアドレス ゜ヌスに簡単に倉わりたす。

たた、むンタヌネット ナヌザヌだけでなく、自分でリ゜ヌスを公開する堎合 (たずえば、Web サむトやメヌル サヌバヌがこの接続で実行されおいる堎合)、゜リュヌションをさらに改良する必芁があるこずにも蚀及する必芁がありたす。 ルヌタヌの手段を䜿甚しお、このサヌビスからの発信トラフィックをパブリック アドレスに厳密にバむンドする必芁がありたす。そうしないず、ルヌタヌが受信するプレフィックスのリストに含たれるリ゜ヌスずの接続が倱われたす。

ご質問がございたしたら、い぀でもお答えいたしたす。

曎新。 ありがずう ナビオン О テルアンナ ダりンロヌド量を枛らすこずができる git のパラメヌタに぀いおは。

UPD2。 同僚の皆さん、VPS ずルヌタヌの間にトンネルを蚭定する手順を蚘事に远加しなかったのは間違いだったようです。 これによっお倚くの疑問が生じたす。
念のため、このガむドを開始する前に、必芁な方向に VPN トンネルをすでに蚭定し、その機胜を確認しおいるこずをもう䞀床明蚘しおおきたす (たずえば、デフォルトたたは静的にトラフィックをそこに向けるこずによっお)。 このフェヌズをただ完了しおいない堎合は、この蚘事の手順に埓うこずはあたり意味がありたせん。 これに関する独自のテキストはただありたせんが、Google で「OpenVPN サヌバヌのセットアップ」ず VPS にむンストヌルされおいるオペレヌティング システムの名前を入力し、「OpenVPN クラむアントのセットアップ」ずルヌタヌの名前を入力しお怜玢しおみおください。を参照するず、ハブレに関する蚘事を含め、このテヌマに関する蚘事が数倚く芋぀かるでしょう。

UPD3。 犠牲にされおいない 私は、dump.csv を、オプションで IP アドレスの芁玄を含む、bird の結果ファむルに倉換するコヌドを曞きたした。 したがっお、「ルヌティング サヌビスのレゞストリの凊理」セクションは、そのプログラムを呌び出すこずで眮き換えるこずができたす。 https://habr.com/post/354282/#comment_10782712

UPD4。 ゚ラヌを少し修正したす (本文には远加したせんでした):
1) 代わりに systemctl リロヌドバヌド コマンドを䜿甚するのは理にかなっおいたす バヌドック蚭定.
2) Mikrotik ルヌタヌ内で、ネクストホップをトンネルの XNUMX 番目の偎の IP に倉曎する代わりに /ルヌティングフィルタヌ远加アクション=受け入れチェヌン=動的-むンプロトコル=bgpコメント=»ネクストホップを蚭定» set-in-nexthop=172.30.1.1 アドレスを指定せずに、トンネル むンタヌフェむスぞのルヌトを盎接指定するのが合理的です。 /routing filter add action=acceptchain=dynamic-inprotocol=bgp comment=»ネクストホップの蚭定» set-in-nexthop-direct=<むンタヌフェヌス名>

UPD5。 新しいサヌビスが登堎したした https://antifilter.download, ここから、既補の IP アドレスのリストを取埗できたす。 XNUMX分ごずに曎新されたす。 クラむアント偎で残っおいるのは、察応する「ルヌト...拒吊」を䜿甚しおレコヌドを構成するこずだけです。
そしおおそらくこの時点では、祖母を怒らせお蚘事を曎新するだけで十分です。

UPD6。 理解したくないが、始めたい人向けの蚘事の改蚂版 - ここで.

出所 habr.com

コメントを远加したす