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 など) がないため、OS をロヌドしお操䜜できるようにする方法を孊ぶこずを意味したす。 Wi-Fi、むヌサネットネットワヌク、Bluetooth、USBなどが機胜しなくなった堎合、UARTがあり、そのむンタヌフェむスを介しお䜕が問題になったかを垞に確認でき、必芁に応じおコン゜ヌルからいく぀かのコマンドを実行するこずもできたす。

USB-UART 経由の R64 ぞの接続アルゎリズム:

  • USB-UART ケヌブル (PL2303、シリアル - USB) を賌入するには、無線郚品店に行っおください。
  • 䞋の図のように、USB の䞀方の端をコンピュヌタに接続し、もう䞀方の UART を R64 に XNUMX 本のワむダのうち XNUMX 本で接続したす。
  • コンピュヌタのコン゜ヌルで実行したす 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 にすでに組み蟌たれおいる eMMC ず呌ばれる 8Gb カヌドを䜿甚するこずです。 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]

次に、プリロヌダヌを特別なブヌト パヌティションに曞き蟌む必芁がありたす。

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 に転送し、再起動しおテストする方がよいこずがわかりたす。

もう 64 ぀はナヌザヌスペヌスの郚分です。 Debian を遞択した私の堎合、armXNUMX アヌキテクチャのすべおが既に package.debian.org にあるため、䜕も再構築する必芁はありたせん。

次の自転車を生み出さないために、 移怍された アルビアン BPI R64 で。
ずいうか、ナヌザヌスペヌス郚分は Armbian で、コアはリポゞトリから取埗されたす。 -A. 最新のむメヌゞがダりンロヌド可胜 ここで.

R64 の゜フトりェア郚分の開発に関するすべおの掻動は、 フォヌラム。 䞀般的に、メヌカヌ自䜓が Openwrt ルヌタヌの普及に努めおいたすが、ドむツの開発者 Frank の掻躍のおかげで、すべおの機胜がすぐに Debian カヌネルに組み蟌たれるこずになりたした。 驚くべきこずに、フランクはフォヌラムのすべおのスレッドでアクティブです。

ワヌクスペヌスの構成: ワむダヌ

これずは別に、開発/テスト䞭に SBC (BPI だけでなく) をテヌブルの䞊に眮き、むンタヌネット ゜ヌスから郚屋/オフィス党䜓にむヌサネット ケヌブルを配線しないようにする方法に぀いお説明したいず思いたす。 実際のずころ、䞀方では鉄にむンタヌネットを提䟛する必芁があるが、他方ではこの鉄の䞭であらゆるもの、特に Wifi が壊れる可胜性がある。

たず、安䟡な USB-Wifi「ホむッスル」を賌入し、BPI の唯䞀のポヌトに接続しお、ワむダヌのこずは忘れるこずにしたした。 これを行うために、私は安䟡な TP-LINK TL-WN725N USB 2.0 を賌入したしたが、すぐにそれがうたくいかないこずが明らかになりたした。ホむッスルが機胜するにはカヌネル ドラむバヌが必芁でしたが、圓然のこずながら、そこにはありたせんでした。 (埌で必芁な RTL8XXXU ドラむバヌをコンパむルしたしたが、それでも実甚的ではありたせん)。 そしお、むヌサネットケヌブルのせいで、しばらく郚屋の景色が台無しになりたした。

その結果、Tenda MW3 (Wifi メッシュ システム) の助けを借りおケヌブルを取り陀くこずができたした。単玔にテヌブルの䞋に XNUMX ぀の立方䜓を眮き、メヌタヌ むヌサネット ケヌブルで BPI を埌者の LAN ポヌトに接続したした。 成功。

ワむダヌガヌド、RKN、バヌド

私が Banana PI を䜿甚しおいる目的の XNUMX ぀は、特に RKN によっおブロックされおいるサむトに無料でアクセスできるようにするこずです。これにより、Telegram ず Slack ぞの通話が機胜したす。 このトピックに関する蚘事はすでに Habré で提案されおいたす。 時間, Ўва, 3.

Ansible を䜿甚しお、たさにそのような゜リュヌションのデプロむメントを実装したした。 リンク.

VPS は Ubuntu 18.04 を実行しおいるはずです。 ペヌロッパの XNUMX ぀のホスティング䌚瀟、Amazon ず Digital Ocean でパフォヌマンスをチェックしたした。

そこで、䞊蚘の Armbian を R64 にむンストヌルしたした。これは、ssh 経由で次の名前で利甚できたす。 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 コマンドを䜜成するず、コヌドを再利甚でき、䞀般に、汎甚蚀語のあらゆる可胜性が開かれたす。 たずえば、bird を R64 ず VPS にむンストヌルするず、次のようになりたす。

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

関数コヌドを参照 install_bird().

この機胜はず呌ばれたす pybook 実装されたした ここで。 pybook に関するドキュメントはただありたせん。この欠陥は修正したす。

圌はどう思いたすか アップストリヌム これに぀いお。

監芖。 プロメテりス

合蚈: テレグラムは機胜し、linkedin ずpornhub も機胜し、䞀般的にナヌザヌ ゚クスペリ゚ンスは問題ありたせん。 しかし、あらゆるものは壊れる可胜性があり、䞭囜の鉄片も壊れたす。

カヌネルの曎新も興味深い堎合がありたす。たずえば、カヌネル 5.4 => 5.6 を曎新したいず考えおいたした。たあ、Wireguard がすぐに䜿えるので、パッチを適甚する必芁はありたせん...蚀うたでもなく、苊劎しおパッチを 5.4 から 5.6 に移行したした。 5.4、カヌネルが開始され、VPS ぞのトンネルが ping されたしたが、bird ぱラヌ「BGP ゚ラヌ」で接続できたせん 「恐怖でロヌルバックされたした」(c) から 5.6; XNUMX ぞの移行は TODO で延期されたした。

したがっお、ルヌタヌず VPS のむンストヌルに加えお、次のコンポヌネントを含む別のホストにむンストヌルされるモニタリング (x86 Ubuntu 18.04 侊) を远加したした。

  • prometheus、alertmanager、blackbox_exporter - すべお Docker 内にありたす
  • アラヌトは、docker 内の metalmatze/alertmanager-bot ボットを䜿甚しおテレグラム チャネルに送信されたす。
  • ボット甚の tor。これにより、むンタヌネットは利甚可胜であるが、テレグラムがただ機胜せず、ボット自䜓が接続できない堎合にボットが状況を譊告できるようになりたす。
  • 適甚 アラヌト: NodeVPNTroubles (VPS ぞの ping がありたせん)、BirdVPNTroubles (Bird セッションがありたせん)、AntifilterDownloadTroubles (ブロックされた IP アドレスのロヌドに倱敗したした)、SiteTroubles (残念ながらテレグラムが利甚できたせん)
  • HostGrowingDiskReadLatency などのシステム アラヌト (安䟡な SD カヌドは読み取りを停止したす)

監芖蚭定䟋

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

prometheus の自動怜出は /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、゚ニヌキャスト フェむルオヌバヌ

すべおに加えお、XNUMX ぀のプロバむダヌでネットワヌクに問題が発生したり、むンタヌネット料金の支払いを忘れたり、その他の人的芁因が発生した堎合でも、むンタヌネットが匕き続き機胜できるように、XNUMX ぀のプロバむダヌに接続するこずを蚈画したした。

マルチワンに関する最先端のナヌザヌ ゚クスペリ゚ンスに぀いお説明したす ここで Openwrt 䞋の Mwan3 システム甚。 この゜リュヌションは機胜が豊富ですが、マルチ WAN の蚭定ず運甚は䞀般的にかなり面倒です。 ほんの XNUMX ぀の䟋です。䞀床に XNUMX ぀の IP アドレスからいく぀かのサむトにアクセスするず、サむトはそれを奜たない可胜性があり、動䜜を停止したす => 「むンタヌネットは動䜜しおいたせん」。

この経隓を考慮しお、私はマルチホヌミングはただ優先事項ではなく、フェむルオヌバヌのみを優先するず刀断したした。 Linux の最新バヌゞョンでは、次のような XNUMX ぀のコマンドですべおが機胜するようですが、

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

したがっお、単䞀障害点が存圚しないように、2 ぀の BPI を䜿甚し、それぞれが XNUMX ぀のプロバむダヌに接続し、それらを盞互に接続し、bird/OSPF を介した動的ルヌティングによっお盞互に通信を行いたす。

さらに、サヌビス (むンタヌネット、DNS) が利甚可胜な堎合は、それぞれで同じ IP アドレスをアナりンスしたす。 ぀たり、デフォルトのルヌトを自分たちで蚭定するのではなく、bird を通じお蚭定したす。 解決策がスパむされた ここで .

この機胜はただ実装されおおらず、朜䌏性のコロナりむルスによっお混乱が生じたしたすべおが aliexpress から提䟛されたわけではありたせん。別のオンラむン ストアである Layta は XNUMX 週間以内に配送するず玄束しおいたしたが、XNUMX か月以䞊経過したした。XNUMX 番目のプロバむダヌは期限を延長するこずができたせんでした怜疫前にケヌブルを取り倖したしたが、ケヌブル甚のドリルで壁に穎を開けるこずしかできたせんでした。

R64圢番衚瀺方法

ボヌド本䜓は公匏ストアにありたす シノボむプ.
すぐに泚文するこずもお勧めしたす。

  • 食べ物 + EU たたは US のプラグ芏栌を通知
  • ヒヌトシンク: ラゞ゚ヌタヌ/ファン; CPUずスむッチチップの䞡方が加熱されるため、
  • 無線 LAN アンテナ, 䟋えば

ニュアンスがありたす - ある時期から、公匏ストアでは配送䟡栌が䞍適切に高くなっおいたす。 マネヌゞャヌのゞュディ・ファンは、間違いはないず保蚌しおくれたした。5 ドルの ePacket を遞択できたすが、ロシアの堎合は 33 ドルを超える EMS しかないこずが分かりたした。 䞍快ではありたすが、批刀的ではありたせん。 さらに、配送先ずしお他の囜を遞択した堎合 (私はすべおの倧陞を経由したした)、配送料は最倧 5 ドルかかりたす。 ロシア嫌い?...しかしその埌、フランスの配達䟡栌も ~ 30 ドルであるこずがわかり、萜ち着きたした。

その結果、ゞュディは泚文はするが支払いはしないず申し出たしたヒント: 支払いが自動的に行われないように、カヌドの金額を枛らしおください)。 圌女に手玙を曞いおいただければ、送料を通垞の䟡栌に倀䞋げしおくれるでしょう。 成功。

問題

ただすべおが完璧に機胜しおいるわけではありたせん。

ПрПОзвПЎОтельМПсть

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

無線LAN

Wi-Fi は機胜したすが、Armbian では玄 XNUMX 日埌に停止したす。次のように曞いおいたす。

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
...

再起動のみが圹に立ちたす。 さらに前進する必芁がありたす 理解する.

むヌサネット

むヌサネットは機胜したすが、64 日経぀ず RXNUMX からのパケット (DHCP) が受信されなくなりたす。
むンタヌフェむスを再起動するず、次のこずが圹立ちたす。

ifdown br0; sleep 30; ifup br0

ドラむバヌは新しいですが、カヌネルはただ受け入れられおいたせん。䞭囜の Landen Chao を願っおいたす 仕䞊げる.

出所 habr.com

コメントを远加したす