Banana Pi R64 Router – Debian, Wireguard, RKN

Der Banana Pi 64 ist ein Einplatinencomputer ähnlich dem Raspberry Pi, verfügt jedoch über mehrere Ethernet-Anschlüsse, was ihn zu einem Allzweck-Router für die Linux-Distribution macht.

Banana Pi R64 Router – Debian, Wireguard, RKN

Ja, Openwrt existiert bereits, verfügt jedoch über eine eigene GUI und CLI. Es gibt Mikrotik, aber auch hier hat es eine eigene GUI/CLI, und Wireguard funktioniert nicht sofort ... Generell möchte ich einen Router mit flexiblen Einstellungen, der aber im Rahmen des Standard-Linux bleibt, mit dem man arbeitet täglich.

Im Artikel unter den Namen BPI, R64, Single-Board meine ich dasselbe – das Banana Pi R64 Single-Board selbst.

Bildauswahl. Download über eMMC

Die allererste Fähigkeit, die man sich bei der Arbeit aneignen muss SBC Im Allgemeinen und bei R64 im Besonderen bedeutet es zu lernen, wie man ein Betriebssystem lädt und mit ihm interagieren kann, da R64 keinen Monitoranschluss (z. B. HDMI) hat. Wenn alles ausgefallen ist - WLAN funktioniert nicht mehr, Ethernet-Netzwerk, Bluetooth, USB usw. Es gibt einen UART, über dessen Schnittstelle Sie immer sehen können, was schief gelaufen ist, und bei Bedarf auch ein paar Befehle von der Konsole aus ausführen können.

Verbindungsalgorithmus zu R64 über USB-UART:

  • Gehen Sie zum Radioteileladen und holen Sie sich ein USB-UART-Kabel (PL2303, Seriell-zu-USB).
  • Wir verbinden ein USB-Ende mit dem Computer und das andere, UART, mit R64, mit drei von vier Drähten, wie im Bild unten
  • in der Computerkonsole ausführen sudo minicom

Danach erscheint in den meisten Fällen die Single-Board-Konsole = Erfolg.
Sie können mehr sehen hier.

Banana Pi R64 Router – Debian, Wireguard, RKN

Als nächstes ist es am einfachsten, das Betriebssystem von der SD-Karte zu laden: Download per Link Bild und lade es hoch:

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

Wir stecken die Karte in den R64-SD-Steckplatz, schalten sie ein, beobachten zuerst das Laden von uboot auf der angeschlossenen Konsole, dann den Standard-Linux-Boot.

Eine alternative Boot-Option ist die Verwendung einer bereits im R64 integrierten 8-GB-Karte namens eMMC. Gemäß den Anweisungen im Wiki schreiben wir das Image auf das Gerät um
/dev/mmcblk0 zu BPI, neu starten, SD-Karte entfernen, BPI erneut aktivieren ... und es funktioniert nicht. Wie man dorthin kommt Boot select halte nicht durch.

Tatsache ist, dass Sie zumindest für BPI ein spezielles Flag setzen müssen, um von einem internen Flash-Laufwerk booten zu können:

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]

Als nächstes müssen Sie den Preloader auf eine spezielle Boot-Partition schreiben

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

Der R64-Hersteller (China) hat diese Binärdatei veröffentlicht hier. Was er tut, ist unbekannt (es gibt keine Quellcodes), aber ohne ihn wird es auch nicht funktionieren.

Im Allgemeinen beginnt danach das Laden der Bilder von eMMC. Wenn Sie es herausfinden und Images von Grund auf erstellen möchten, müssen Sie in beiden Fällen (SD/eMMC) ein paar weitere Dateien schreiben (Preloader für die SD-Karte, ATF, U-Boot), nur um an den Kernel zu gelangen Stiefel. Dieses Thema ist immer noch entwickelt sich, aber für uns ist die Hauptsache, dass es funktioniert und okay ist.

Um ehrlich zu sein, verwende ich keinen eMMC-Download, SD-Karten reichen aus, aber ich habe ziemlich viel Zeit damit verbracht, es zum Laufen zu bringen, also lassen Sie es im Artikel stehen.

Wahl des Betriebssystems. Armbian

Die erste Anwendungsaufgabe besteht darin, ein VPN zu starten, natürlich Wireguard. Es stellte sich sofort heraus, dass es nicht von der Kernelseite aus zusammengestellt wurde und es keine Header gab. Ich habe den Kernel neu erstellt und aus x86-Gewohnheit das Kernelmodul mit DKMS erstellt. Allerdings hat mich die Montagegeschwindigkeit selbst kleiner Dienstprogramme auf arm64 unangenehm überrascht. Und dann war ein weiteres Kernelmodul erforderlich und so weiter. Im Allgemeinen stellt sich heraus, dass es besser ist, alles, was mit dem Kernel zu tun hat, auf einem Warm-Tube-x86-Laptop zusammenzustellen und dann durch einfaches Kopieren, Neustarten und Testen auf R64 zu übertragen.

Eine andere Sache ist der Userspace-Teil. In meinem Fall, dass ich mich für Debian entschieden habe, ist alles für die arm64-Architektur bereits auf packets.debian.org und es besteht keine Notwendigkeit, etwas neu zu erstellen.

Um kein weiteres Fahrrad zu produzieren, habe ich portiert armbian auf BPI R64.
Oder besser gesagt: Der Userspace-Teil ist Armbian und der Kern wird aus dem Repository entnommen Frank-A. Das neueste Bild kann heruntergeladen werden hier.

Alle Aktivitäten zur Entwicklung des Softwareteils von R64 werden am durchgeführt Forum. Im Allgemeinen ist der Hersteller selbst bestrebt, den Openwrt-Router bekannt zu machen, aber dank der Aktivitäten des Entwicklers Frank aus Deutschland landen alle Funktionen schnell im Debian-Kernel. Überraschenderweise ist Frank in jedem Forenthread aktiv.

Arbeitsplatzorganisation: Drähte

Separat möchte ich Ihnen erklären, wie Sie den SBC (nicht nur BPI) während der Entwicklung/Tests auf dem Tisch platzieren, um nicht ein Ethernet-Kabel von der Internetquelle durch den gesamten Raum/das Büro zu führen. Tatsache ist, dass Sie einerseits das Internet für das Stück Eisen bereitstellen müssen und andererseits alles in diesem Stück Eisen kaputt gehen kann, insbesondere WLAN.

Zuerst beschloss ich, eine billige USB-Wifi-„Pfeife“ zu kaufen, sie an den einzigen Anschluss des BPI anzuschließen und die Kabel zu vergessen. Dazu habe ich mir einen günstigen TP-LINK TL-WN725N USB 2.0 gekauft, doch schon bald war klar, dass er nicht durchstarten würde: Damit die Pfeife funktioniert, brauchte man einen Kernel-Treiber, der natürlich nicht vorhanden war (Später habe ich den erforderlichen RTL8XXXU-Treiber kompiliert, aber es ist immer noch unpraktisch.) Und das Ethernet-Kabel beeinträchtigte für eine Weile die Aussicht auf den Raum.

Dadurch habe ich es mit Hilfe von Tenda MW3 (Wifi-Mesh-System) geschafft, das Kabel loszuwerden: Ich habe einfach einen Würfel unter den Tisch gestellt und das BPI mit einem meterlangen Ethernet-Kabel an dessen LAN-Port angeschlossen. Erfolg.

Wireguard, RKN, Vogel

Ich nutze Banana PI unter anderem für den freien Zugriff auf vom RKN gesperrte Seiten, insbesondere damit Telegram und Anrufe bei Slack funktionieren. Auf Habré wurden bereits Artikel zu diesem Thema vorgeschlagen: Zeit, два, drei.

Ich habe die Bereitstellung einer solchen Lösung mit Ansible implementiert: Link.

Auf dem VPS soll Ubuntu 18.04 laufen. Ich habe die Leistung bei zwei Hostern in Europa überprüft: Amazon und Digital Ocean.

Also haben wir das obige Armbian auf R64 installiert, es ist über ssh unter dem Namen verfügbar hm-bananapi-1 und verfügt über Internetzugang. Wir stellen nacheinander Ansible-Automatisierungsskripte bereit und führen die Installation selbst auf R64 aus:

# зависимости для 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

Als nächstes müssen Sie unser VPN auf die gleiche Weise auf dem VPS bereitstellen:

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

Hier ist das Argument immer current-vpn und der VPS-Name selbst wird in einer Variablen konfiguriert (in diesem Fall ist es 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

Ach ja, vor all diesen Vorgängen müssen Sie Geheimnisse (insbesondere Wireguard-Schlüssel) in einem Ordner generieren ./secrets, sollte das Verzeichnis so aussehen so.

Ansible-Automatisierung in Python

Möglicherweise stellen Sie fest, dass die Ansible-Befehle nicht im YAML-Format, sondern in Python-Skripten codiert sind. Zum Vergleich: So aktivieren Sie den Bird-Daemon auf die übliche Weise:

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

und wie das gleiche über Python:

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

Durch das Schreiben von Ansible-Befehlen mit Python-Code können Sie den Code wiederverwenden, und im Allgemeinen stehen Ihnen alle Möglichkeiten einer Allzwecksprache offen. Beispiel: Installation von Bird auf R64 und VPS:

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

siehe Funktionscode install_bird().

Diese Funktion heißt pybook umgesetzt hier. Es gibt noch keine Dokumentation zu Pybook, dann werde ich diesen Fehler beheben.

Was denkt er flussaufwärts diesbezüglich.

Überwachung. Prometheus

Insgesamt: Telegram funktioniert, Linkedin und Pornhub auch, im Allgemeinen ist die Benutzererfahrung in Ordnung. Aber alles kann kaputt gehen, auch chinesische Eisenstücke.

Kernel-Updates können auch interessant sein: Ich wollte zum Beispiel den Kernel 5.4 => 5.6 aktualisieren, naja, Wireguard ist sofort einsatzbereit, ein Patchen ist nicht nötig ... Gesagt, getan: Patches von 5.4 auf mühsam übertragen 5.6, der Kernel wurde gestartet, der Tunnel zum VPS wurde gepingt, aber Bird kann keine Verbindung mit dem Fehler „BGP-Fehler“ herstellen… „Entsetzt zurückgesetzt“ (c) auf 5.4; Der Wechsel zu 5.6 wurde in TODO verschoben.

Daher habe ich zusätzlich zur Installation des Routers und des VPS die Überwachung (auf x86 Ubuntu 18.04) hinzugefügt, die auf einem separaten Host mit den folgenden Komponenten installiert wird:

  • Prometheus, Alertmanager, Blackbox_Exporter – alles im Docker
  • Warnungen werden über den Metalmatze/Alertmanager-Bot-Bot an den Telegram-Kanal gesendet – auch in Docker
  • Tor für den Bot, sodass der Bot Situationen benachrichtigen kann, in denen das Internet verfügbar ist, das Telegramm jedoch immer noch nicht funktioniert und der Bot selbst keine Verbindung herstellen kann
  • angewendet Warnungen: NodeVPNTroubles (kein Ping an VPS), BirdVPNTroubles (keine Bird-Sitzung), AntifilterDownloadTroubles (Blockierte IP-Adressen konnten nicht geladen werden), SiteTroubles (unglückliches Telegramm nicht verfügbar)
  • Systemwarnungen wie HostGrowingDiskReadLatency (billige SD-Karte wird nicht mehr gelesen)

Beispiel für eine Überwachungseinrichtung:

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

Die automatische Erkennung für Prometheus ist auf den Ordner /etc/prometheus/auto_http eingestellt, ein Beispiel für das Hinzufügen eines Hosts zur Überwachung (Hosts werden standardmäßig nicht überwacht):

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 Anbieter, 2 BPIs, Anycast-Failover

Zusätzlich zu allem hatte ich vor, eine Verbindung zu zwei Anbietern herzustellen, damit das Internet weiterhin funktioniert, auch wenn ein Anbieter Probleme mit dem Netzwerk hatte oder er vergaß, für das Internet usw. und andere menschliche Faktoren zu bezahlen.

Beschrieben wird das fortschrittlichste Benutzererlebnis zum Thema Multi-Wan hier für Mwan3-System unter Openwrt. Diese Lösung verfügt über umfangreiche Funktionalität, aber die Einrichtung und der Betrieb im Allgemeinen für Multi-Wan ist eher mühsam. Nur ein Beispiel: Wenn Sie von zwei IP-Adressen gleichzeitig auf einige Websites zugreifen, gefällt ihnen das möglicherweise nicht, sie funktionieren nicht mehr => „Das Internet funktioniert nicht.“

Aufgrund dieser Erfahrung habe ich entschieden, dass Multihoming noch keine Priorität hat, sondern nur Failover. Obwohl es den Anschein hat, dass in den neuesten Linux-Versionen alles mit einem Befehl wie dem folgenden funktionieren sollte:

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

Damit es also keinen Single Point of Failure gibt, nehmen wir 2 BPIs, stellen jeweils eine Verbindung zu einem Anbieter her, verbinden sie miteinander und stellen die Kommunikation untereinander durch dynamisches Routing über Bird/OSPF her.

Darüber hinaus geben wir bei jedem die gleiche IP-Adresse bekannt, sofern der Dienst verfügbar ist (Internet, DNS). Das heißt, wir werden die Standardroute nicht selbst festlegen, sondern über Bird. Die Lösung wurde ausspioniert hier .

Diese Funktionalität wurde noch nicht implementiert, das heimtückische Coronavirus hat es vermasselt (nicht alles kam von Aliexpress; ein anderer Online-Shop, Layta, versprach, in einer Woche zu liefern, und schon ist mehr als ein Monat vergangen; der zweite Anbieter hat es nicht geschafft, das zu verlängern Kabel vor der Quarantäne, es gelang mir nur, ein Loch in die Wand zu bohren, um für das Kabel zu bohren).

So bestellen Sie R64

Das Board selbst im offiziellen Store SinoVoip.
Besser gleich bestellen:

  • Ernährung + Informieren Sie sich über den EU- oder US-Steckerstandard
  • Kühlkörper: Kühler/Lüfter; weil sowohl die CPU als auch der Switch-Chip erhitzt werden
  • WLAN-Antenne, beispielsweise

Es gibt eine Nuance: Der Preis für die Lieferung im offiziellen Laden ist seit einiger Zeit zu hoch. Managerin Judy Huang versicherte mir, dass kein Fehler vorliege und man ePacket für 5 $ wählen könne, aber ich habe gesehen, dass es für Russland nur EMS für >33 $ gibt. Unangenehm, aber nicht kritisch. Wenn Sie außerdem ein anderes Land für die Lieferung auswählen (ich habe alle Kontinente durchquert), kostet die Lieferung etwa 5 $. Russophobe? Aber dann stellte ich fest, dass der Lieferpreis für Frankreich ebenfalls etwa 30 US-Dollar beträgt, und beruhigte mich.

Daraufhin bot Judy an, eine Bestellung aufzugeben, aber nicht zu bezahlen (andeuten: weniger auf die Karte laden, damit die Zahlung nicht automatisch erfolgt); Schreiben Sie ihr und sie wird den Versandpreis auf den Normalpreis reduzieren. Erfolg.

Fragen

Es funktioniert noch nicht alles perfekt.

Leistung

Ansible=Python-Befehle werden 20–30 Sekunden lang langsam ausgeführt, auch im Leerlauf; eine Größenordnung länger als auf einem x86-Laptop. Außerdem werden sie zunächst recht schnell ausgeführt, etwa 3 Sekunden, dann verlangsamen sie sich stark. Möglicherweise liegt das an der Erwärmung der CPU (Throttling). Auch der Go-Code hat eine lange Laufzeit:

# запрос метрик для прометея из 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

WLAN

WLAN funktioniert, hört aber bei Armbian nach etwa einem Tag auf, schreibt:

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

Da hilft nur ein Neustart. Wir müssen weiter gehen zu verstehen.

Ethernet

Ethernet funktioniert, aber nach etwa einem Tag kommen keine Pakete (DHCP) von R64 mehr.
Ein Neustart der Schnittstelle hilft:

ifdown br0; sleep 30; ifup br0

Der Treiber ist neu, der Kernel wurde noch nicht akzeptiert, ich hoffe das chinesische Landen Chao beenden.

Source: habr.com

Kommentar hinzufügen