Router Banana Pi R64 — Debian, Wireguard, RKN

Banana Pi 64 is een enkele bordcomputer in de stijl van de Raspberry Pi, maar met meerdere Ethernet-poorten, waardoor het mogelijk is om er een router op basis van een algemeen Linux-distributie van te maken.

Router Banana Pi R64 — Debian, Wireguard, RKN

Ja, er is al OpenWRT, maar dat heeft zijn eigen hobbels, zijn eigen GUI en CLI; er is Mikrotik, maar ook daar hebben we weer een eigen GUI/CLI, en Wireguard werkt niet standaard… Kortom, ik wil een router met flexibele instellingen, terwijl ik binnen de standaard Linux-omgeving blijf waarmee ik elke dag werk.

In dit artikel bedoel ik met de namen BPI, R64, en enkele bordcomputers hetzelfde — namelijk de eigenlijke Banana Pi R64.

Keuze van de afbeelding. Opstarten via eMMC.

De allereerste vaardigheid die je moet leren bij het werken met SBC in het algemeen, en met de R64 in het bijzonder, is het leren opstarten van het besturingssysteem en de mogelijkheid om ermee te interageren, aangezien de R64 geen poort voor een monitor (bijvoorbeeld HDMI) heeft. Wanneer alles faalt — Wifi, Ethernet-netwerk, Bluetooth, USB en meer werken niet meer, dan is er UART, waarmee je altijd kunt kijken wat er mis is gegaan, en ook een paar commando's vanuit de console kunt uitvoeren indien nodig.

Het algoritme voor verbinding met de R64 via USB-UART:

  • we rennen naar de elektronische winkel voor een USB-UART-kabel (PL2303, Serial-to-USB).
  • we sluiten het ene USB-einde aan op de computer en het andere, de UART, aan de R64, met drie draden van de vier, zoals op de afbeelding hieronder.
  • in de computerconsole voeren we uit sudo minicom.

Daarna zal in de meeste gevallen de console van de enkele bordcomputer verschijnen = succes.
Meer details zijn te vinden hier.

Router Banana Pi R64 — Debian, Wireguard, RKN

Vervolgens is het het eenvoudigst om het besturingssysteem van een SD-kaart te laden: we downloaden via de link de afbeelding en schrijven deze:

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.

We steken de kaart in de SD-sleuf van de R64, zetten deze aan en observeren via de aangesloten console de opstart van eerst uboot, dan de standaardopstart van Linux.

Een alternatief voor de opstart is via de reeds ingebouwde 8Gb eMMC-kaart in de R64. Volgens de instructies op de wiki schrijven we de afbeelding naar het apparaat.
/dev/mmcblk0 в BPI, перегружаемся, вытаскиваем SD-карту, включаем BPI снова… и не работает. Как туда-сюда Boot select. Raak niet aan.

Het probleem is dat het minimaal voor de BPI nodig is om een speciale vlag in te stellen om vanaf de interne flash te kunnen opstarten:

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

Vervolgens moet de preloader in de speciale bootsectie worden geschreven.

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

De fabrikant R64 (China) heeft deze binaire bestanden vrijgegeven hier. Wat het precies doet is onbekend (er zijn geen broncodes), maar zonder dit werkt het ook niet.

In principe beginnen de beelden na dit te booten vanaf eMMC. Als je wilt begrijpen en beelden vanaf nul wilt maken, moet je voor beide gevallen (SD/eMMC) nog een paar bestanden schrijven (preloader voor de SD-kaart, ATF, u-boot), alleen om bij het opstarten van de kernel te komen. Dit onderwerp is nog steeds een vrij alternatief voor XenServer wordt ontwikkeld, waarin functies zijn teruggebracht die uit de gratis versie van XenServer zijn verwijderd., maar voor ons is het belangrijkste dat het werkt en dat is het.

Momenteel gebruik ik eerlijk gezegd de boot vanaf eMMC niet, een SD-kaart is genoeg, maar ik heb behoorlijk wat tijd besteed om het aan de praat te krijgen, dus het mag in het artikel staan.

Kies een besturingssysteem. Armbian

De eerste praktische taak is om VPN op te zetten, uiteraard Wireguard. Al snel bleek dat het vanuit de kernel niet was samengevoegd en er geen headers waren. Ik heb de kernel opnieuw samengesteld en, uit gewoonte met x86, de kernelmodule met DKMS samengesteld. Echter, de snelheid van het samenstellen op arm64 van zelfs kleine hulpprogramma's verraste me onaangenaam. En daarnaast was er nog een andere kernelmodule nodig, enzovoort. Kortom, alles wat met de kernel te maken heeft, kun je beter samenstellen op een warme, gezellige x86-laptop, en vervolgens eenvoudig kopiëren naar de R64, opnieuw opstarten en testen.

Een ander verhaal is de userspace. In mijn geval, bij de keuze voor Debian, zijn alle pakketten voor de arm64-architectuur al beschikbaar op packages.debian.org en hoeft er niets opnieuw samengesteld te worden.

Om niet weer een nieuwe fiets uit te vinden, heb ik de code van Cypress' HSSP naar Arduino heeft gepoort, heb ik een Arduino Uno gebruikt om verbinding te maken met de ISSP-aansluiting van het toetsenbord. Armbian op de BPI R64.
Echter, de userspace is Armbian, en de kernel wordt uit de repository gehaald van Frank-a. Het nieuwste image kan gedownload worden hier.

Alle activiteiten met betrekking tot de ontwikkeling van de software voor R64 worden gedaan op forum. Over het algemeen probeert de fabrikant het gebruik van de router onder Openwrt te populariseren, maar dankzij de activiteit van ontwikkelaar Frank uit Duitsland komen alle functies snel in de Debian-kernel. Verbazingwekkend genoeg is Frank actief in elke tak van het forum.

Het organiseren van de werkruimte: kabels

Ik wil specifiek vertellen hoe je tijdens de ontwikkeling/testfase een SBC (niet alleen BPI) op je bureau kunt plaatsen zodat je geen Ethernet-kabel van de internetbron door de hele kamer/kantoor hoeft te trekken. Het punt is dat je aan de ene kant de hardware internet moet geven, maar aan de andere kant kan de hardware zelf kapotgaan, vooral de Wifi.

Eerst besloot ik een goedkope USB-Wifi "dongle" aan te schaffen, deze in de enige poort van de BPI te steken en te vergeten over de bedrading. Daarom kocht ik een goedkope TP-LINK TL-WN725N USB 2.0, maar al snel werd duidelijk dat het niet ging werken: voor de dongle is een kernel-driver nodig, die daar natuurlijk niet aanwezig was (later heb ik de benodigde RTL8XXXU-driver verzameld, maar het blijft onpraktisch). Bovendien verstoorde de Ethernet-kabel een tijdje het uiterlijk van de kamer.

Uiteindelijk kon ik de kabel kwijt raken met de Tenda MW3 (Wifi mesh-systeem): ik plaatste gewoon een kubus onder de tafel en verbond de BPI met een ethernetkabel van een meter naar de LAN-poort van de laatste. Succes.

Wireguard, RKN, Bird

Een van de wensen waarvoor ik Banana PI gebruik, is om vrij toegang te hebben tot sites die door RKN zijn geblokkeerd, in het bijzonder zodat Telegram en gesprekken in Slack werken. Er zijn al artikelen over dit onderwerp op Habr voorgesteld: one, two, drie.

De implementatie van deze oplossing heb ik gerealiseerd met behulp van Ansible: link.

Verondersteld wordt dat de VPS draait op Ubuntu 18.04. Ik heb de functionaliteit getest op twee hosts in Europa: Amazon en Digital Ocean.

Dus, we hebben de hierboven genoemde Armbian op de R64 geïnstalleerd, hij is toegankelijk via ssh onder de naam hm-bananapi-1 en heeft toegang tot het internet. We implementeren stap voor stap Ansible, de automatiseringsscripts en starten de installatie op de 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

Vervolgens moet onze VPN op VPS op een soortgelijke manier worden uitgerold:

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

Hier is het argument altijd current-vpn, en de eigenlijke naam van de VPS wordt ingesteld in de variabele (in dit geval is het 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

Ah ja, voordat al deze operaties moet je de geheimen (in het bijzonder de Wireguard-sleutels) genereren in de map .\/secrets, de directory moet eruit zien zo.

Ansible-automatisering in Python

Je kunt opmerken dat in plaats van het YAML-formaat, de Ansible-commando's zijn gecodeerd in Python-scripts. Ter vergelijking, hoe je de daemon bird op de gebruikelijke manier start:

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

en hoe hetzelfde te doen via Python:

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

Het vastleggen van Ansible-commando's in Python-code maakt het mogelijk om de code herbruikbaar te maken, en opent alle mogelijkheden van een algemene programmeertaal. Bijvoorbeeld, het installeren van bird op R64 en VPS:

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

de code van de functie bekijken install_bird().

Deze functie, genaamd pybook geïmplementeerd hierEr is momenteel geen documentatie voor pybook, ik zal deze tekortkoming later oplossen.

Wat denkt upstream daarover.

Monitoring. Prometheus

Al met al: Telegram werkt, LinkedIn en Pornhub ook, dus de gebruikerservaring is in orde. Maar alles kan fout gaan, en de Chinese hardware kan ook problemen geven.

Kernelupdates zijn ook soms interessant: bijvoorbeeld, ik wilde de kernel van 5.4 naar 5.6 upgraden, omdat Wireguard er standaard in zit, en ik hoefde niets te patchen... Zeggen, doen: ik heb zorgvuldig de patches van 5.4 naar 5.6 overgezet, de kernel startte op, de tunnel naar de VPS is te pingen, maar Bird kan niet verbinden met de foutmelding "BGP Error"... "In paniek ben ik teruggeschakeld" (c) naar 5.4; de verhuizing naar 5.6 heb ik in TODO gezet.

Daarom heb ik naast de installatie van de router en VPS ook monitoring toegevoegd (op x86 Ubuntu 18.04), die op een aparte host staat met de volgende componenten:

  • prometheus, alertmanager, blackbox_exporter - alles in Docker
  • alerts worden naar een Telegram-kanaal gestuurd met behulp van de bot metalmatze/alertmanager-bot - ook in Docker
  • tor voor de bot, zodat de bot situaties kan alerten waarin internet beschikbaar is, maar Telegram alsnog niet werkt, en de bot zelf niet kan verbinden
  • toepasselijke alerts: NodeVPNTroubles (geen ping naar VPS), BirdVPNTroubles (geen Bird-sessie), AntifilterDownloadTroubles (fout bij het downloaden van geblokkeerde IP-adressen), SiteTroubles (de beruchte Telegram is niet toegankelijk)
  • systeemalerts, bijvoorbeeld, HostGrowingDiskReadLatency (goedkope SD-kaart stopt met lezen)

Voorbeeld van monitoringinstallatie:

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

Auto Discovery voor Prometheus is ingesteld op de map /etc/prometheus/auto_http, voorbeeld van het toevoegen van een host aan de monitoring (standaard worden hosts niet gemonitord):

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 providers, 2 BPI, anycast failover

Bovendien heb ik gepland om me met twee providers te verbinden, zodat internet blijft werken, zelfs als een provider netwerkproblemen heeft, of vergeten is om voor internet te betalen, enzovoort, en andere menselijke factoren.

De meest geavanceerde gebruikerservaring op het gebied van multi-wan is beschreven hier voor het systeem Mwan3 onder Openwrt. Deze oplossing heeft rijke functionaliteit, maar de instellingen en exploitatie van multi-wan zijn behoorlijk ingewikkeld. Een enkel voorbeeld: wanneer je op bepaalde websites tegelijk met twee IP-adressen komt, kan dat hen niet bevallen, en ze zullen stoppen met werken => "internet werkt niet".

Gelet op deze ervaring heb ik besloten dat multihoming voorlopig geen prioriteit heeft, alleen failover. Hoewel, het lijkt erop dat in de nieuwste versies van linux alles met één commando moet werken van de volgende vorm:

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

Dus, om een enkelpunt van falen te vermijden, nemen we 2 BPI's, elke verbonden met één provider, verbinden ze met elkaar en maken de verbinding dynamisch via bird/OSPF.

Vervolgens adverteren we op elke router hetzelfde IP-adres in geval de service beschikbaar is (internet, DNS). Dat wil zeggen dat we de standaardroute niet zelf instellen, maar via bird. Dit idee heb ik afgekeken. hier .

Deze functionaliteit heb ik nog niet gerealiseerd, een verraderlijke coronavirus heeft hier ook een rol gespeeld (niet alles is aangekomen van aliexpress; nog een webwinkel, Layta, beloofde levering binnen een week, maar het is al meer dan een maand geleden; de tweede provider kon de kabel niet voor de lockdown leggen, hij heeft alleen een gat in de muur geboord voor de kabel).

Hoe R64 te bestellen

De zelfde kaart in de officiële winkel SinoVoip.
Het is ook beter om meteen te bestellen:

  • voeding + laat de standaard van de stekker EU of VS weten
  • koelsysteem: radiatoren/ventilatoren; omdat zowel de CPU opwarmt als de switch-chip
  • een antenne voor wifi, bijvoorbeeld

Er is een nuance - de verzendkosten zijn sinds enige tijd onredelijk hoog in de officiële winkel. Manager Judy Huang overtuigde me dat er geen fout was, en dat ik ePacket kon kiezen voor $5, maar ik zag dat er alleen EMS voor Rusland was voor >33$. Het was onplezierig, maar niet kritiek. Bovendien, als ik een ander land voor levering kies (ik heb alle continenten geprobeerd), is de levering ~5$. Russophoben?.. Maar toen ontdekte ik dat de verzendkosten voor Frankrijk ook ~30$ zijn, en dat maakte me gerust.

Uiteindelijk stelde Judy voor om de bestelling te plaatsen, maar niet te betalen (.: minder op de kaart zetten, zodat de betaling automatisch niet doorgaat); haar een bericht te sturen, dan zou ze de verzendkosten naar normaal verlagen. Succes.

Problemen

Niet alles werkt voorlopig perfect.

Prestaties

Ansible=Python-opdrachten worden langzaam uitgevoerd, zelfs lege opdrachten, 20-30 seconden; aanzienlijk langer dan op een x86-laptop. Aanvankelijk worden ze snel uitgevoerd, ~3 seconden, maar vertragen dan drastisch. Dit kan te maken hebben met de opwarmende CPU (throttling). Ook de Go-code werkt langzaam:

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

Wifi werkt, maar op Armbian stopt het na ongeveer een dag, met de melding:

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

Een herstart helpt alleen. We moeten verder onderzoeken.

Ethernet

Ethernet werkt, maar na ~een dag stopt de ontvangst van pakketten (DHCP) van de R64.
Een herstart van de interface helpt:

ifdown br0; sleep 30; ifup br0

De driver is nieuw, het is nog niet opgenomen in de kernel, ik hoop dat de Chinees Landen Chao het afmaakt.

Bron: habr.com

Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers 🔥 Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers | ProHoster