Banana Pi R64-router - Debian, Wireguard, RKN

De Banana Pi 64 is een singleboardcomputer die lijkt op de Raspberry Pi, maar dan met meerdere Ethernet-poorten, waardoor je hem kunt omtoveren tot een universele Linux-router.

Banana Pi R64-router - Debian, Wireguard, RKN

Ja, Openwrt bestaat al, maar het heeft zijn eigen eigenaardigheden, een eigen GUI en CLI; er is Mikrotik, maar die heeft weer een eigen GUI/CLI, en Wireguard werkt niet direct uit de doos... Over het algemeen wil ik een router met flexibele instellingen, maar toch binnen het raamwerk van standaard Linux blijven, waar ik dagelijks mee werk.

In dit artikel bedoel ik met de namen BPI, R64 en single-board hetzelfde: de Banana Pi R64 single-board zelf.

Een afbeelding selecteren. Opstarten via eMMC

De allereerste vaardigheid die u moet verwerven wanneer u met SBC Over het algemeen, en met name bij R64, gaat het erom te leren hoe je een besturingssysteem erop kunt laden en ermee kunt communiceren, omdat R64 geen aansluiting heeft voor een monitor (bijvoorbeeld HDMI). Toen alles uitviel - Wi-Fi, Ethernet, Bluetooth, USB en andere netwerken werkten niet meer. Er is een UART, waarmee je via de interface altijd kunt zien wat er misgaat en, indien nodig, ook een aantal commando's vanaf de console kunt uitvoeren.

Algoritme voor verbinding met R64 via USB-UART:

  • We rennen naar de radio-onderdelenwinkel voor een USB-UART-kabel (PL2303, serieel-naar-USB)
  • Sluit één USB-uiteinde aan op de computer en het andere, UART, op de R64, met drie van de vier draden, zoals in de onderstaande afbeelding.
  • in de computerconsole starten we sudo minicom

Hierna verschijnt in de meeste gevallen de single-board console = succes.
U kunt meer details zien hier.

Banana Pi R64-router - Debian, Wireguard, RKN

De gemakkelijkste manier om het besturingssysteem te laden is vervolgens vanaf een SD-kaart: downloaden via link afbeelding en vul deze in:

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 plaatsen de kaart in de R64 SD-sleuf, zetten het systeem aan en kijken hoe de aangesloten console eerst uboot laadt en daarna de standaard Linux.

Een alternatieve opstartoptie is het gebruiken van een 64Gb-kaart die al in de R8 is ingebouwd, de zogenaamde eMMC. Volgens de instructies in de wiki kopiëren we de afbeelding naar het apparaat
/dev/mmcblk0 naar BPI, opnieuw opstarten, SD-kaart verwijderen, BPI opnieuw inschakelen... en het werkt niet. heen en weer Boot select niet trekken.

Het probleem is dat je voor BPI in ieder geval een speciale vlag moet instellen om vanaf de interne flashdrive te kunnen opstarten:

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]

Vervolgens moet u de preloader naar een speciale bootsectie schrijven.

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

Fabrikant R64 (China) heeft dit binaire bestand gepost hier. Wat het doet is niet bekend (er zijn geen broncodes), maar zonder werkt het ook niet.

Normaal gesproken worden de afbeeldingen hierna geladen vanaf eMMC. Als je het wilt uitzoeken en images helemaal opnieuw wilt maken, moet je in beide gevallen (SD/eMMC) nog een paar bestanden extra schrijven (preloader voor SD-kaart, ATF, u-boot) om de kernel te kunnen laden. Dit onderwerp is nog steeds actueel ontwikkeld zich, maar voor ons is het belangrijkste dat het werkt en dat is alles.

Ik gebruik eerlijk gezegd geen eMMC-boot, een SD-kaart is voldoende, maar het heeft behoorlijk wat tijd gekost om het werkend te krijgen, dus ik zal het in het artikel vermelden.

Een besturingssysteem selecteren. Armbisch

De eerste praktische taak is het opstarten van een VPN, Wireguard natuurlijk. Er werd direct vastgesteld dat het aan de kernelzijde niet was samengesteld en dat er geen headers waren. Ik heb de kernel opnieuw gebouwd en, zoals ik gewend ben met x86, heb ik de kernelmodule gebouwd met DKMS. De snelheid waarmee zelfs kleine hulpprogramma's op arm64 gebouwd kunnen worden, heeft mij echter onaangenaam verrast. En dan was er nog een kernelmodule nodig, enzovoort. Over het algemeen geldt dat je alles wat met de kernel te maken heeft het beste kunt compileren op een warme x86-laptop. Kopieer het dan gewoon naar R64, start de laptop opnieuw op en test het.

Het gebruiksruimtegedeelte is een ander verhaal. Toen ik voor Debian koos, stond alles voor de arm64-architectuur al op packages.debian.org en hoefde ik niets opnieuw te compileren.

Om geen nieuwe fiets te maken, heb ik geporteerd armbiaan op BPI R64.
Preciezer gezegd: het gebruikersruimtegedeelte is Armbian, en de kernel wordt uit de repository gehaald openhartig-A. De nieuwste afbeelding kan worden gedownload hier.

Alle activiteiten met betrekking tot de ontwikkeling van de R64-software worden uitgevoerd op forum. Normaal gesproken streeft de fabrikant er zelf naar om de router voor Openwrt te populariseren, maar dankzij de inzet van de Duitse ontwikkelaar Frank komen alle features al snel in de kernel voor Debian terecht. Verrassend genoeg is Frank in elk forum actief.

Je werkruimte organiseren: draden

Ik wil je ook vertellen hoe je de SBC (niet alleen de BPI) tijdens de ontwikkeling/test op tafel kunt plaatsen, zodat je de Ethernet-kabel vanaf de internetverbinding niet door de hele kamer/het hele kantoor hoeft te laten lopen. Het probleem is dat je aan de ene kant de hardware moet voorzien van internet, maar aan de andere kant kan alles in die hardware kapot gaan, en in de eerste plaats Wi-Fi.

In eerste instantie besloot ik om een ​​goedkoop USB-Wifi "fluitje" te kopen, dat ik in de enige poort op de BPI zou steken en ik zou me geen zorgen meer hoeven te maken over kabels. Ik heb hiervoor een goedkope TP-LINK TL-WN725N USB 2.0 aangeschaft, maar al snel bleek dat deze niet zou werken: om het fluitsignaal te laten werken is een kerneldriver nodig, die er uiteraard niet was (ik heb later de benodigde RTL8XXXU-driver geassembleerd, maar die is nog steeds niet praktisch). En de ethernetkabel verpestte even het uiterlijk van de kamer.

Uiteindelijk is het mij gelukt om de kabel weg te werken met behulp van Tenda MW3 (Wifi mesh systeem): ik plaatste simpelweg één kubus onder de tafel en verbond de BPI met de LAN-poort van de kubus met een ethernetkabel van een meter lang. Succes.

Wireguard, RKN, Vogel

Eén van de dingen waarvoor ik Banana PI wil gebruiken, is om gratis toegang te bieden tot sites die door Roskomnadzor zijn geblokkeerd. Ik wil met name Telegram- en Slack-gesprekken laten werken. Artikelen over dit onderwerp zijn al op Habr voorgesteld: tijd, два, drie.

Ik heb de implementatie van precies deze oplossing geïmplementeerd met behulp van Ansible: link.

Er wordt vanuit gegaan dat de VPS Ubuntu 18.04 draait. Ik heb de functionaliteit getest bij twee hostingproviders in Europa: Amazon en Digital Ocean.

We hebben dus de bovenstaande Armbian op R64 geïnstalleerd, deze is toegankelijk via ssh onder de naam hm-bananapi-1 en heeft toegang tot internet. We implementeren Ansible, automatiseringsscripts en starten de installatie op 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 moeten we onze VPN op een vergelijkbare manier op de VPS implementeren:

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

Het argument is hier altijd current-vpn, en de VPS-naam zelf wordt geconfigureerd in een variabele (in dit geval is dat 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

Oh ja, vóór al deze handelingen moet je geheimen genereren (met name Wireguard-sleutels) in de map ./secrets, de directory zou er als volgt uit moeten zien zo.

Ansible-automatisering in Python

U zult merken dat Ansible-opdrachten niet in YAML-formaat zijn, maar in Python-scripts. Ter vergelijking, hier is hoe u de bird-daemon op de gebruikelijke manier inschakelt:

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

en hetzelfde via Python:

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

Door Ansible-opdrachten in Python-code te schrijven, kunt u code hergebruiken en krijgt u toegang tot alle mogelijkheden van een algemene taal. Bijvoorbeeld, bird installeren op R64 en VPS:

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

functiecode bekijken install_bird().

Deze functie heet pybook geïmplementeerd hier. Er is nog geen documentatie voor pybook, ik zal dit probleem later oplossen.

Wat denkt hij? stroomopwaarts in dit geval.

Toezicht. Prometheus

Kortom: Telegram werkt, LinkedIn en Pornhub ook, de algemene gebruikerservaring is oké. Maar alles kan kapot gaan, ook Chinese hardware.

Kernelupdates kunnen ook interessant zijn: ik wilde bijvoorbeeld kernel 5.4 => 5.6 updaten, nou, Wireguard is standaard aanwezig, patchen is niet nodig... Zo gezegd, zo gedaan: ik heb nauwgezet patches overgezet van 5.4 naar 5.6, de kernel start op, de tunnel naar de VPS wordt gepingd, maar ik kan geen verbinding maken met de foutmelding "BGP Error"... "In horror, I roll back" (c) naar 5.4; Ik heb de verhuizing naar 5.6 in TODO gezet.

Daarom heb ik, naast de installatie van de router en de VPS, ook monitoring toegevoegd (op x86 Ubuntu 18.04). Deze monitoring is op een aparte host geïnstalleerd met de volgende componenten:

  • prometheus, alertmanager, blackbox_exporter — allemaal in docker
  • waarschuwingen worden verzonden naar het telegramkanaal met behulp van de bot metalmatze/alertmanager-bot - ook in docker
  • tor voor de bot, zodat de bot situaties kan waarschuwen wanneer er internet is, maar telegram nog steeds niet werkt en de bot zelf geen verbinding kan maken
  • toegepast waarschuwingen: NodeVPNTroubles (geen ping naar VPS), BirdVPNTroubles (geen Bird-sessie), AntifilterDownloadTroubles (fout bij het downloaden van geblokkeerde IP-adressen), SiteTroubles (het noodlottige telegram is niet beschikbaar)
  • systeemwaarschuwingen, zoals HostGrowingDiskReadLatency (goedkope SD-kaart stopt met lezen)

Voorbeeld van een monitoringopstelling:

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

Automatische detectie voor Prometheus is geconfigureerd voor de map /etc/prometheus/auto_http, een voorbeeld van het toevoegen van een host aan monitoring (hosts worden standaard niet gecontroleerd):

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 wilde ik verbinding maken met twee providers, zodat het internet zou blijven werken, ook als een van de providers problemen zou hebben met het netwerk, of zou vergeten zijn om voor het internet te betalen, etc., en door andere menselijke factoren.

De meest geavanceerde gebruikerservaring op het gebied van multi-wan wordt beschreven hier voor het Mwan3-systeem onder Openwrt. Deze oplossing heeft veel functionaliteit, maar de installatie en bediening van multi-wan is over het algemeen vrij lastig. Een voorbeeld: als je vanaf twee IP-adressen tegelijk een bepaalde site bezoekt, dan vinden ze dat misschien niet leuk en werken ze niet meer => "het internet werkt niet".

Gezien deze ervaring heb ik besloten dat multihoming voorlopig geen prioriteit heeft, alleen failover. Hoewel het lijkt alsof in de nieuwste versies van Linux alles met één commando zou moeten werken, zoals:

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

Om een ​​single point of failure te voorkomen, nemen we 2 BPI's, verbinden deze elk met één provider, verbinden ze met elkaar en zorgen ervoor dat de verbindingen met elkaar dynamisch worden gerouteerd via bird/OSPF.

Vervolgens kondigen we op elk onderdeel hetzelfde IP-adres aan, indien de service beschikbaar is (internet, DNS). Dat wil zeggen dat we niet zelf de standaardroute instellen, maar via vogel. Ik heb de oplossing ontdekt hier .

Deze functionaliteit is nog niet geïmplementeerd, het sluipende coronavirus gooit ook hier roet in het eten (nog niet alles kwam aan van AliExpress; een andere webwinkel, Layta, beloofde binnen een week te leveren, maar het is al meer dan een maand geleden; de tweede leverancier had geen tijd om de kabel aan te leggen vóór de quarantaine en is er alleen in geslaagd een gat in de muur te boren voor de kabel).

Hoe R64 bestellen

Het bord zelf is te koop in de officiële winkel ChineesVoip.
Het is ook beter om direct te bestellen:

  • voedsel + geef de EU- of Amerikaanse stekkerstandaard op
  • warmteafvoer: radiatoren/ventilatoren; omdat zowel de CPU als de switchchip heet worden
  • antenne voor wifi, bij voorbeeld

Een klein puntje van kritiek: de bezorgkosten in de officiële winkel zijn al een tijdje onredelijk hoog. Manager Judy Huang overtuigde mij ervan dat er geen fout was en dat ik ePacket voor $ 5 kon kiezen, maar ik zag dat er voor Rusland alleen EMS is voor meer dan $ 33. Onaangenaam, maar niet kritisch. Als u een ander land kiest voor levering (ik heb alle continenten geprobeerd), dan bedragen de verzendkosten ongeveer $ 5. Russofoben?.. Maar toen ontdekte ik dat de verzendkosten naar Frankrijk ook zo'n 30$ zijn, en ik werd rustiger.

Uiteindelijk stelde Judy voor om een ​​bestelling te plaatsen, maar niet te betalen (zinspelen: zet minder op de kaart zodat de automatische betaling niet doorgaat); Schrijf haar en zij zal de verzendkosten verlagen naar het normale tarief. Succes.

Problemen

Nog niet alles werkt vlekkeloos.

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

Ansible=Python-opdrachten worden langzaam uitgevoerd, zelfs als ze inactief zijn, gedurende 20-30 seconden; een orde van grootte langer dan op een x86-laptop. Bovendien worden ze in het begin vrij snel uitgevoerd, zo'n 3 seconden, daarna worden ze snel langzamer. Dit kan worden veroorzaakt door oververhitting van de CPU (throttling). De Go-code heeft ook veel tijd nodig om uit te voeren:

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

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

Alleen opnieuw opstarten helpt. We moeten verder gaan het oplossen.

Ethernet

Ethernet werkt, maar na ongeveer een dag komen er geen pakketten (DHCP) meer aan vanaf R64.
Het opnieuw opstarten van de interface helpt:

ifdown br0; sleep 30; ifup br0

De driver is nieuw, deze is nog niet geaccepteerd in de kernel, ik hoop dat het Chinese Landen Chao is zal eindigen.

Bron: www.habr.com