Banana Pi R64 路由器 - Debian、Wireguard、RKN

Banana Pi 64 是類似於 Raspberry Pi 的單板計算機,但具有多個以太網端口,使其成為通用的 Linux 分佈式路由器。

Banana Pi R64 路由器 - Debian、Wireguard、RKN

是的,Openwrt 已經存在,但它有自己的 GUI 和 CLI; 有 Mikrotik,但它也有自己的 GUI / CLI,並且 Wireguard 不是開箱即用的......總的來說,我想要一個具有靈活設置的路由器,同時保持在你使用的標準 Linux 的框架內每天。

在名為 BPI、R64、單板的文章中,我指的是同一件事 - Banana Pi R64 單板本身。

圖像選擇。 通過 eMMC 下載

與人一起工作時獲得的第一項技能 SBC 一般來說,特別是對於 R64,這意味著學習如何將操作系統加載到其中並能夠與之交互,因為 R64 沒有監視器端口(例如 HDMI)。 當一切都崩潰時 - Wifi、以太網、藍牙、USB 等都停止工作。有一個 UART,通過它的界面,您始終可以看到出了什麼問題,如果需要,還可以從控制台運行一些命令。

通過 USB-UART 連接到 R64 的算法:

  • 跑到收音機配件店買一根 USB-UART 電纜(PL2303,串口轉 USB)
  • 我們把USB一端接電腦,UART接R64,四線三選一,如下圖
  • 在電腦控制台運行 sudo minicom

之後,大多數情況下,單板控制台會出現=成功。
你可以看到更多 這裡.

Banana Pi R64 路由器 - Debian、Wireguard、RKN

接下來,最簡單的方法是從 SD 卡加載操作系統:通過以下方式下載 鏈接 圖片並上傳:

unzip -p 2019-08-23-ubuntu-16.04-lite-preview-bpi-r64-sd-emmc.img.zip | pv | sudo dd of=/dev/mmcblk0 bs=10M status=noxfer

我們將卡插入 R64 SD 插槽,打開它,首先在連接的控制台上觀察 uboot 的加載,然後是標準的 Linux 啟動。

另一種啟動選項是使用已嵌入 R64 中的 8Gb 卡,稱為 eMMC。 根據wiki上的說明,我們將鏡像重寫到設備中
/dev/mmcblk0 到 BPI,重新啟動,移除 SD 卡,再次啟用 BPI……但它不起作用。 到那裡怎麼走 Boot select 不要堅持。

事實上,至少對於 BPI,您需要設置一個特殊標誌,以便能夠從內部閃存驅動器啟動:

root@bpi-r64:~# ./mmc extcsd read /dev/mmcblk1 | grep 'PARTITION_CONFIG'
Boot configuration bytes [PARTITION_CONFIG: 0x00]
root@bpi-r64:~# ./mmc bootpart enable 1 1 /dev/mmcblk1
root@bpi-r64:~# ./mmc extcsd read /dev/mmcblk1 | grep 'PARTITION_CONFIG'
Boot configuration bytes [PARTITION_CONFIG: 0x48]

接下來需要將preloader寫入特殊的boot分區

root@bpi-r64:~# echo 0 > /sys/block/mmcblk0boot0/force_ro 
root@bpi-r64:~# dd if=preloader_evb7622_64_foremmc.bin of=/dev/mmcblk0boot0

R64 製造商(中國)發布了這個二進製文件 這裡. 他做了什麼是未知的(沒有源代碼),但沒有他也不會工作。

一般來說,在那之後,圖像開始從 eMMC 加載。 如果您想弄清楚並從頭開始創建圖像,那麼對於這兩種情況(SD / eMMC),您都需要編寫更多文件(SD 卡的預加載器、ATF、u-boot),只是為了進入內核引導。 這個話題還是 發展,但對我們來說,最主要的是它可以正常工作。

現在,說實話,我不使用eMMC下載,SD卡就夠了,但我花了很多時間讓它工作,所以讓它在文章中。

操作系統的選擇。 阿比亞人

第一個應用程序任務是啟動VPN,當然是Wireguard。 馬上發現不是從內核端組裝的,也沒有頭文件。 我重建了內核,出於對 x86 的習慣,我使用 DKMS 構建了內核模塊。 然而,即使是小型實用程序在 arm64 上的組裝速度也讓我感到不快。 然後需要另一個內核模塊,依此類推。 總的來說,事實證明,所有與內核相關的東西都最好在熱管x86筆記本電腦上組裝,然後通過簡單的複制轉移到R64,重新啟動並測試。

另一件事是用戶空間部分。 在我選擇 Debian 的情況下,arm64 架構的所有內容都已經在 packages.debian.org 上了,不需要重建任何東西。

為了不生產另一輛自行車,我 移植的 阿比 在 BPI R64 上。
或者更確切地說:用戶空間部分是 Armbian,核心是從存儲庫中獲取的 坦率-A。 可以下載最新的鏡像 這裡.

R64 軟件部分的所有開發活動均在 論壇. 一般來說,製造商本身會尋求普及 Openwrt 路由器,但由於來自德國的開發人員 Frank 的活動,所有功能很快就會出現在 Debian 內核中。 令人驚訝的是,Frank 在每個論壇帖子中都很活躍。

工作區組織:電線

另外,我想告訴您如何在開發/測試期間將 SBC(不僅僅是 BPI)放在桌子上,以免通過整個房間/辦公室將以太網電纜從 Internet 源連接到它。 事實是,一方面,您需要為這塊鐵提供互聯網,另一方面,這塊鐵中的一切都可能壞掉,尤其是 Wifi。

首先,我決定買一個便宜的 USB-Wifi“哨子”,將它插入 BPI 上唯一的端口而忘記電線。 為此,我購買了一個便宜的 TP-LINK TL-WN725N USB 2.0,但很快就發現它不會起飛:為了讓哨聲正常工作,需要一個內核驅動程序,當然,內核驅動程序不存在(後來自己編譯了必要的RTL8XXXU驅動,但還是不行)。 以太網電纜有一段時間毀了房間的景色。

結果,在 Tenda MW3(Wifi 網狀系統)的幫助下,我設法擺脫了電纜:我只是將一個立方體放在桌子下面,然後用一根米以太網電纜將 BPI 連接到後者的 LAN 端口。 成功。

Wireguard,RKN,鳥

我使用 Banana PI 的其中一件事是可以免費訪問被 RKN 阻止的站點,特別是這樣 Telegram 和對 Slack 的調用就可以正常工作。 已經在 Habré 上提出了關於該主題的文章: 時間, , .

我使用 Ansible 實施了這樣一個解決方案的部署: 鏈接.

VPS 應該運行 Ubuntu 18.04。 我檢查了歐洲兩個主機的性能:Amazon 和 Digital Ocean。

所以,我們在 R64 上安裝了上面的 Armbian,它可以通過 ssh 以 name hm-bananapi-1 並且可以上網。 我們按順序部署 ansible 自動化腳本並在 R64 上運行安裝本身:

# зависимости для Debian-based дистрибутивов
$ sudo apt install --no-install-recommends python3-pip python3-setuptools python3-wheel git
$ which pip3
/usr/bin/pip3

# ansible с pybook, скриптование на Python
$ pip3 install https://github.com/muravjov/ansible/archive/ansible-2.10.0.dev0-pybook2019.tar.gz

$ export PATH=~/.local/bin:$PATH
$ which ansible-playbook
/home/sa/.local/bin/ansible-playbook

$ git clone https://github.com/muravjov/ansible-bpi-r64.git
$ cd ansible-bpi-r64

$ git submodule update --init

# убеждаемся в доступности hm-bananapi-1
$ ssh hm-bananapi-1 which python3
/usr/bin/python3

# собственно установка
$ ansible-playbook ./router.py -l hm-bananapi-1

接下來,您需要以相同的方式將我們的VPN部署到VPS:

ansible-playbook ./router.py -l current-vpn

在這裡,參數始終是 current-vpn,VPS 名稱本身是在一個變量中配置的(在本例中,它是 paris-vpn-aws-t2-micro-1):

$ grep current_vpn group_vars/all 
current_vpn: paris-vpn-aws-t2-micro-1
#current_vpn: frankfurt-vpn-d0-starter-1

哦,是的,在所有這些操作之前,您需要在文件夾中生成機密(特別是 Wireguard 密鑰) ./secrets, 目錄應該是這樣的 所以.

Python 中的 Ansible 自動化

您可能會注意到,Ansible 命令不是 YAML 格式,而是用 Python 腳本編碼的。 為了比較,如何以通常的方式啟用 bird 守護進程:

- name: start bird
  systemd:
    name: bird
    state: started
    enabled: yes

以及如何通過 Python 實現相同:

with mapping:
    append("name", "start bird")
    with mapping("systemd"):
        append("name",  "bird")
        append("state", "started")
        append("enabled", "yes")

使用 Python 代碼編寫 Ansible 命令允許您重用代碼,並且通常,通用語言的所有可能性都是開放的。 比如在R64和VPS上安裝bird:

install_bird("router/bird.conf.j2")
install_bird("vpn/bird.conf.j2")

見功能代碼 安裝鳥().

此功能稱為 pybook 實施的 這裡. 目前還沒有pybook的文檔,那我就改正這個缺陷。

他怎麼想 上游 在這種場合。

監控。 普羅米修斯

總計:telegram works,linkedin 和 pornhub 也行,總的來說,用戶體驗還可以。 但任何東西都會破碎,中國的鐵塊也一樣。

內核更新也可以很有趣:例如,我想更新內核 5.4 => 5.6,好吧,開箱即用的 Wireguard,無需打補丁......說到做到:煞費苦心地將補丁從 5.4 轉移到5.6,內核啟動,通向 VPS 的隧道被 ping 通了,但是 bird 無法連接,出現錯誤“BGP 錯誤”……“驚恐地回滾”(c) 到 5.4; 遷移到 5.6 在 TODO 中被推遲。

因此,除了安裝路由器和VPS之外,我還添加了監控(在x86 Ubuntu 18.04上),它安裝在一個單獨的主機上,具有以下組件:

  • prometheus、alertmanager、blackbox_exporter - 都在 docker 中
  • 使用 metalmatze/alertmanager-bot 機器人將警報發送到電報頻道——也在 docker 中
  • bot 的 tor,這樣 bot 可以在 Internet 可用時發出警報,但電報仍然無法正常工作,並且 bot 本身無法連接
  • 應用 警報: NodeVPNTroubles(沒有 ping 到 VPS),BirdVPNTroubles(沒有 Bird 會話),AntifilterDownloadTroubles(無法加載被阻止的 IP 地址),SiteTroubles(不幸的電報不可用)
  • 系統警報,如 HostGrowingDiskReadLatency(停止讀取便宜的 SD 卡)

監控設置示例:

ansible-playbook ./monitoring.py -l monitoring-preprod

prometheus的Auto Discovery設置在/etc/prometheus/auto_http文件夾下,添加主機監控示例(默認不監控主機):

bash << 'EOF'
HOSTNAME=hm-bananapi-1
IP_ADDRESS=`ssh -G $HOSTNAME | awk '/^hostname / { print $2 }'`

ssh monitoring-preprod sudo sponge /etc/prometheus/auto_http/$HOSTNAME.json << EOF2
[
  {
    "targets": ["$IP_ADDRESS:9100"],
    "labels": {
      "env": "prod",
      "hostname": "$HOSTNAME"
    }
  }
]
EOF2
EOF

TODO:2 個提供者、2 個 BPI、任播故障轉移

除了一切,我計劃連接到兩個供應商,這樣互聯網就可以繼續工作,即使一個供應商的網絡出現問​​題,或者他們忘記為互聯網付費等等,以及其他人為因素。

描述了關於 multi-wan 主題的最先進的用戶體驗 這裡 適用於Openwrt下的Mwan3系統。 該方案功能豐富,但對於多wan來說,一般設置和運行比較麻煩。 僅舉一個例子:如果您同時從兩個 IP 地址訪問某些站點,那麼他們可能不喜歡,他們將停止工作 =>“互聯網不工作”。

鑑於這種經驗,我決定多宿主不是優先事項,只有故障轉移。 雖然看起來在最新版本的 linux 中一切都應該使用一個命令,如:

ip route add default 
    nexthop via 192.168.1.1 weight 10 
    nexthop via 192.168.2.1 weight 5

因此,為了不存在單點故障,我們採用 2 個 BPI,每個連接到一個提供商,將它們連接在一起,並通過 bird / OSPF 通過動態路由相互通信。

此外,如果服務可用(Internet、DNS),我們會在每個服務上公佈相同的 IP 地址。 也就是我們不會自己放下默認路由,而是通過bird。 偵測到的解決方案 這裡 .

此功能尚未實現,陰險的冠狀病毒搞砸了(不是所有東西都來自速賣通;另一家在線商店 Layta 承諾在一周內送貨,但一個多月過去了;第二家供應商未能延長檢疫前的電纜,只能設法在牆上打個洞來鑽電纜)。

如何訂購 R64

董事會本身在官方商店 華網.
最好立即訂購:

  • 營養 + 告知歐盟或美國插頭標準
  • 散熱器:散熱器/風扇; 因為CPU和開關芯片都發熱
  • 無線天線, 例如

有一個細微差別-一段時間以來,官方商店的交貨價格已經變得不夠高。 Judy Huang經理向我保證沒有弄錯,你可以選擇ePacket 5美元,但我看到俄羅斯只有EMS,價格>33美元。 令人不快,但並不重要。 此外,如果您選擇任何其他國家/地區送貨(我走遍了所有大洲),送貨費用為 ~5 美元。 Russophobes?.. 但後來我發現法國的運費也是 ~$30,然後冷靜下來。

結果,Judy主動提出下單,但不付款(暗示: 減少卡上的金額,這樣付款就不會自動完成); 寫信給她,她會把運費降到正常水平。 成功。

探讨问题

並非一切都完美無缺。

Производительность

Ansible=Python命令執行緩慢,即使是空閒的,也要20-30秒; 比 x86 筆記本電腦長一個數量級。 此外,起初它們執行得非常快,大約 3 秒,然後它們急劇減速。 這可能是由於 CPU 發熱(節流)造成的。 Go 代碼也長時間運行:

# запрос метрик для прометея из node_exporter на Go
$ time curl -s http://172.30.1.1:9100/metrics > /dev/null

real    0m6,118s
user    0m0,005s
sys     0m0,009s

# однако температура 51 градус, не так и много
sa@bananapir64:~$ cat /sys/devices/virtual/thermal/thermal_zone0/temp
51700

無線上網

Wifi 工作,但大約一天后停止在 Armbian 上,寫道:

sa@bananapir64:~$ dmesg | grep -E 'mt7622_wmac.*timeout'
[470303.802539] mt7622_wmac 18000000.wmac: Message 38 (seq 3) timeout
[470314.042508] mt7622_wmac 18000000.wmac: Message 50 (seq 4) timeout
...

只有重新啟動有幫助。 我們需要走得更遠 理解.

乙太網路 - ENET

以太網工作,但在〜一天后來自 R64 的數據包(DHCP)停止到來。
重新啟動界面有助於:

ifdown br0; sleep 30; ifup br0

驅動是新的,內核還沒有接受,希望中文藍登超 結束.

來源: www.habr.com

添加評論