設置BGP繞過阻塞,或者“我是如何不再害怕並愛上RKN的”

好吧,“墜入愛河”這個說法有點誇張。 而是“可以共存”。

眾所周知,自 16 年 2018 月 10 日起,Roskomnadzor 一直在極其廣泛地阻止對網絡資源的訪問,將域名、指向互聯網上網站頁面的指針以及允許您訪問的網絡地址添加到統一註冊表中。識別互聯網上包含俄羅斯聯邦禁止傳播的信息的網站”(在文本中 - 只是一個寄存器)/XNUMX 有時。 結果,俄羅斯聯邦公民和企業遭受損失,無法獲得他們所需的絕對合法資源。

當我在哈布雷的一篇文章的評論中表示我準備幫助受害者建立旁路計劃後,有幾個人聯繫我尋求此類幫助。 當一切都對他們有用時,其中一個人建議在一篇文章中描述該技術。 經過深思熟慮,我決定打破網站上的沉默,嘗試寫一些介於項目和 Facebook 帖子之間的東西,即哈布拉郵政。 結果就在你面前。

免責聲明

由於發布繞過阻止訪問俄羅斯聯邦境內禁止的信息的方法不是很合法,因此本文的目的是討論一種允許您自動訪問俄羅斯聯邦境內允許的資源的方法俄羅斯聯邦的,但由於某人的行為無法直接通過您的提供商訪問。 通過本文中的操作而獲得的對其他資源的訪問是一個不幸的副作用,並且絕不是本文的目的。

另外,由於我的職業、職業和人生道路主要是一名網絡架構師,所以編程和 Linux 並不是我的強項。 因此,當然腳本可以寫得更好,VPS的安全問題可以更深入地解決等等。 如果您的建議足夠詳細,我們將感激地接受 - 我很樂意將它們添加到文章的正文中。

TL博士

我們使用註冊表副本和 BGP 協議通過您的現有隧道自動訪問資源。 目標是將所有發送至受阻資源的流量移至隧道中。 最少的解釋,主要是逐步說明。

為此你需要什麼

不幸的是,這篇文章並不適合所有人。 為了使用此技術,您需要將一些元素放在一起:

  1. 您必須在阻塞區域之外的某個地方有一個 Linux 服務器。 或者至少是啟動這樣一台服務器的願望 - 因為它現在的成本為 9 美元/年,甚至可能更低。 如果您有單獨的 VPN 隧道,則該方法也適用,那麼服務器可以位於塊字段內。
  2. 您的路由器必須足夠智能,能夠
    • 您喜歡的任何 VPN 客戶端(我更喜歡 OpenVPN,但它可以是 PPTP、L2TP、GRE+IPSec 以及創建隧道接口的任何其他選項);
    • BGPv4 協議。 這意味著對於 SOHO 來說,它可以是 Mikrotik 或任何具有 OpenWRT/LEDE/類似自定義固件的路由器,允許您安裝 Quagga 或 Bird。 也不禁止使用 PC 路由器。 對於企業,請參閱邊界路由器的文檔以獲取 BGP 支持。
  3. 您應該熟悉 Linux 的使用和網絡技術,包括 BGP。 或者至少想要得到這個想法。 由於這次我還沒有準備好擁抱浩瀚,所以你必須自己研究一些你自己無法理解的點。 不過,我當然會回答評論中的具體問題,而且我不太可能是唯一回答的人,所以請隨意提問。

示例中使用了什麼

  • 登記冊副本 https://github.com/zapret-info/z-i 
  • VPS-Ubuntu 16.04
  • 路由服務- 鳥1.6.3   
  • 路由器- Mikrotik hAP ac
  • 工作文件夾 - 由於我們以 root 身份工作,因此大部分內容都將放置在 root 主文件夾中。 分別:
    • /root/blacklist - 包含編譯腳本的工作文件夾
    • /root/zi - 來自 github 的註冊表副本
    • /etc/bird - 標準 Bird 服務設置文件夾
  • 我們接受 194.165.22.146、ASN 64998 作為具有路由服務器和隧道終止點的 VPS 的外部 IP 地址; 路由器的外部 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服務器,進入root'a的上下文(須藤蘇-) 並安裝 git(如果尚未安裝)。

apt install git

轉到您的主目錄並提取註冊表的副本。

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

設置 cron 更新(我每 20 分鐘更新一次,但您可以選擇您感興趣的任何時間間隔)。 為此,我們推出 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存儲庫中發布的bird版本在新鮮度上與始祖鳥的糞便相當,因此我們需要首先將軟件開發人員的官方PPA添加到系統中。

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

之後,我們立即禁用 Bird 的 IPv6 - 在此安裝中我們將不需要它。

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

router id - 路由器標識符,視覺上看起來像 IPv4 地址,但事實並非如此。 在我們的例子中,它可以是 IPv32 地址格式中的任何 4 位數字,但最好在那裡指定您的設備(在本例中為 VPS)的 IPv4 地址。

直接協議確定哪些接口將與路由過程一起工作。 該示例提供了幾個名稱示例,您可以添加更多名稱。 您也可以簡單地刪除該行,在這種情況下,服務器將偵聽具有 IPv4 地址的所有可用接口。

協議靜態是我們的魔法,它從文件中加載前綴和 IP 地址(當然是 /32 前綴)列表以供以後發布。 下面將討論這些列表的來源。 請注意,ip地址的加載默認被註釋掉,原因是上傳量較大。 作為比較,在撰寫本文時,前綴列表中有 78 行,ip 地址列表中有 85898 行。我強烈建議您僅在前綴列表上啟動和調試,然後再決定是否在使用您的路由器進行實驗後,以便將來啟用 ip 加載。 並不是每一個都可以輕鬆消化路由表中的 85 個條目。

bgp 協議實際上會與您的路由器建立 bgp 對等互連。 ip-address是路由器外部接口的地址(或者是路由器一側的隧道接口的地址),64998和64999是自治系統的編號。 在這種情況下,它們可以以任何 16 位數字的形式分配,但最好使用 RFC6996 - 64512-65534 定義的私有範圍中的 AS 編號(有 32 位 ASN 格式,但在我們的例子中,這絕對是多餘的)。 所描述的配置使用 eBGP 對等互連,其中路由服務和路由器的自治系統編號必須不同。

如您所見,服務需要知道路由器的 IP 地址,因此如果您有動態或不可路由的專用 (RFC1918) 或共享 (RFC6598) 地址,則無法選擇在外部接口上引發對等互連,但該服務仍將在隧道內運行。

您可以為多個不同的路由器提供來自一項服務的路由,這也是相當透明的 - 只需通過複製協議 bgp 部分並更改鄰居的 IP 地址來複製它們的設置即可。 這就是為什麼該示例顯示隧道外對等互連的設置是最通用的。 通過相應地更改設置中的 IP 地址,將它們移入隧道並不困難。

路由服務的註冊表處理

事實上,現在我們需要創建前綴和 IP 地址列表,這在協議靜態的上一步中提到過。 為此,我們獲取註冊表文件並使用以下腳本從中創建我們需要的文件,該腳本位於 /根/黑名單/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 個條目(這是目前的情況,當您設置它時,一切都將取決於 ILV 在阻塞網絡中的熱情),如下所示:

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

團隊

birdc show protocol

將顯示服務內協議的狀態。 在您配置路由器之前(請參閱下一段),OurRouter 協議將處於啟動狀態(Connect 或 Active 階段),連接成功後,它將進入 up 狀態(Established 階段)。 例如,在我的系統上,此命令的輸出如下所示:

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 對等互連並將 nexthop 附加到所有收到的前綴,指向我們的隧道(如果需要通過 p2p 接口輸出流量)或 nexthop 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 對等互連又用於傳輸有用流量,則無需設置 nexthop,它將通過協議正確設置。 但如果你手動設置它,情況也不會變得更糟。

在其他平台上,您必須自己弄清楚配置,但如果您有任何困難,請寫在評論中,我會盡力提供幫助。

當您的 BGP 會話啟動後,到大型網絡的路由已到達並安裝在表中,從這些網絡到地址的流量已消失,幸福就在眼前,您可以返回到 Bird 服務並嘗試取消註釋連接該網絡的條目。 ip地址列表,之後執行

systemctl reload bird

看看你的路由器是如何傳輸這85條路由的。 準備好將其關閉並考慮如何處理它 🙂

在總

純粹理論上來說,執行上述步驟後,您就擁有了一項服務,可以自動將流量重定向到俄羅斯聯邦禁止通過過濾系統的 IP 地址。

當然,它還可以改進。 例如,通過 Perl 或 Python 解決方案總結 IP 地址列表非常容易。 使用 Net::CIDR::Lite 執行此操作的簡單 Perl 腳本將 85 個前綴轉換為 60 個(不是 XNUMX 個),但自然覆蓋的地址範圍比被阻止的地址範圍大得多。

由於該服務在 ISO / OSI 模型的第三級運行,因此如果它未解析到註冊表中記錄的地址,它不會使您免受站點/頁面阻塞的影響。 但隨著來自 github 的註冊表,nxdomain.txt 文件也到達了,只需幾筆腳本就可以輕鬆地變成地址源,例如 Chrome 中的 SwitchyOmega 插件。

還應該提到的是,如果您不僅是互聯網用戶,而且還要發布自己的一些資源(例如,在此連接上運行的網站或郵件服務器),則該解決方案需要額外的改進。 通過路由器,您需要將此服務的傳出流量硬綁定到您的公共地址,否則您將失去與路由器接收的前綴列表所覆蓋的那些資源的連接。

如果您有任何問題 - 提問,準備好回答。

UPD。 謝謝 導航 и 特安宇 了解 git 減少下載量的選項。

UPD2。 同事們,我好像犯了一個錯誤,沒有在文章中添加在VPS和路由器之間建立隧道的說明。 由此引發很多疑問。
為了以防萬一,我再次指出 - 假設在開始本指南中的步驟之前,您已經按照您需要的方向配置了 VPN 隧道並檢查了其性能(例如,默認或靜態地將流量包裝到那裡)。 如果您尚未完成此階段,那麼按照本文中的步驟進行操作並沒有多大意義。 我還沒有自己的文字,但如果您用谷歌搜索“OpenVPN 服務器設置”以及 VPS 上安裝的操作系統名稱,以及“OpenVPN 客戶端設置”以及您的路由器名稱,很可能您會找到將找到許多關於這個主題的文章,包括關於哈布雷的文章。

UPD3。 不犧牲 編寫了一段代碼,從 dump.csv 生成 Bird 的結果文件,並帶有可選的 IP 地址總和。 因此,“路由服務的註冊表處理”部分可以用對其程序的調用來代替。 https://habr.com/post/354282/#comment_10782712

UPD4。 對錯誤進行一些處理(沒有在文本中做出貢獻):
1)代替 systemctl 重新加載小鳥 使用該命令是有意義的 birdc配置.
2) 在 Mikrotik 路由器中,不要將下一跳更改為隧道第二側的 IP /路由過濾器添加操作=接受鏈=動態-in協議=bgp註釋=“設置下一跳”set-in-nexthop=172.30.1.1 直接指定到隧道接口的路由而不帶地址是有意義的 /路由過濾器添加操作=接受鏈=動態輸入協議=bgp註釋=“設置下一個跳”set-in-nexthop-direct=<接口名稱>

UPD5。 新服務已經到來 https://antifilter.download,您可以從中獲取現成的 IP 地址列表。 每半小時更新一次。 在客戶端,剩下的就是用相應的“路由...拒絕”來構建條目。
這可能足以和我祖母上床並更新這篇文章了。

UPD6。 文章的修訂版,適合那些不想理解,但又想開始的人—— 這裡.

來源: www.habr.com

添加評論