Routeren Banana Pi R64 - Debian, Wireguard, RKN

Banana Pi 64 er en engangskomputer af typen Raspberry Pi, men med flere Ethernet-porte, hvilket gør det muligt at lave en router baseret på en generel Linux-distribution.

Routeren Banana Pi R64 - Debian, Wireguard, RKN

Ja, der findes allerede OpenWrt, men det har sine egne quirks med sin egen GUI og CLI; der er Mikrotik, men det har igen sin egen GUI/CLI, og WireGuard fungerer ikke ud af boksen… Det vil sige, jeg ønsker en router med fleksible indstillinger, men som forbliver inden for rammerne af standard Linux, som man arbejder med hver dag.

I artiklen under navnene BPI, R64, engangskomputer vil jeg henvise til det samme – selve engangskomponenten Banana Pi R64.

Valg af billede. Booting fra eMMC

Den allerførste færdighed, man skal erhverve sig, når man arbejder med SBC generelt og med R64 specifikt, er at lære at indlæse et operativsystem i den og have mulighed for at interagere med den, for R64 har ikke en port til en skærm (HDMI, for eksempel). Når det hele falder fra hinanden – Wifi, Ethernet-netværk, Bluetooth, USB og andet stopper med at fungere, er der UART, gennem hvilket man altid kan se, hvad der gik galt, samt køre et par kommandoer fra konsollen, hvis nødvendigt.

Algoritme til tilslutning til R64 via USB-UART:

  • løb til butikken for radiokomponenter for at hente et USB-UART-kabel (PL2303, Serial-to-USB)
  • tilslut den ene USB-ende til computeren og den anden, UART, til R64 med tre af de fire ledninger, som på billedet nedenfor
  • i computerens konsol kører sudo minicom

Derefter vil der i de fleste tilfælde komme en konsol fra engangskomponenten = succes.
Du kan se mere detaljeret her.

Routeren Banana Pi R64 - Debian, Wireguard, RKN

Dernæst er det nemmest at indlæse operativsystemet fra SD-kortet: download det fra linket billedet og overfør det:

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

indsæt kortet i SD-slots R64, tænd det og observer bootprocessen via den tilsluttede konsol, først bootloaderen, derefter standard boot af Linux.

Et alternativ til booting - ved hjælp af det allerede indbyggede eMMC-kort på 8 Gb. I henhold til instruktionen i wiki overfører vi billedet til enheden.
/dev/mmcblk0 в BPI, перегружаемся, вытаскиваем SD-карту, включаем BPI снова… и не работает. Как туда-сюда Boot select ikke rør.

Det er nemlig sådan, at man i det mindste for BPI skal sætte et specielt flag for at kunne boote fra den interne flash:

root@bpi-r64:~# .\/mmc extcsd read \/dev\/mmcblk1 | grep 'PARTITION_CONFIG'\nBoot configuration 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'\nBoot configuration bytes [PARTITION_CONFIG: 0x48]

Dernæst skal vi skrive preloaderen til den specielle boot-partition.

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

Producenten R64 (Kina) har udgivet denne binærfil her. Hvad den gør, er ukendt (der er ingen kilder), men uden den fungerer det heller ikke.

Generelt set begynder billederne at boote fra eMMC efter dette. Hvis man ønsker at forstå og skabe billeder fra bunden, skal man for begge tilfælde (SD/eMMC) også skrive flere filer (preloader til SD-kortet, ATF, u-boot), bare for at komme til at boote kernerne. Dette emne er stadig udvikles, men for os er det vigtigste, at det virker, og det er fint.

Jeg bruger ærligt talt ikke eMMC-boot nu, SD-kort er tilstrækkelige, men jeg brugte en del tid på at få det til at fungere, så lad det være i artiklen.

Valg af operativsystem. Armbian

Den første praktiske opgave er at starte VPN, naturligvis Wireguard. Det blev straks klart, at den ikke var bygget ind i kernen, og der var ingen headers. Jeg kompilerede kernen og, som sædvanligt med x86, byggede jeg kerne-modulet ved hjælp af DKMS. Dog blev jeg dårligt overrasket over bygge-hastigheden på arm64, selv for mindre værktøjer. Og så krævedes endnu et kerne-modul, osv. Generelt viser det sig, at alt, der har med kernen at gøre, er bedre at bygge på en varm, hyggelig x86-bærbar, og derefter flytte det enkelt til R64, genstarte og teste.

Det andet er brugerrumsdelen. I mit tilfælde med Debian-valget er alt for arm64-arkitekturen allerede tilgængeligt på packages.debian.org, så der er ingen grund til at genkompilere.

For ikke at skabe endnu en cykel, jeg har porteret Armbian på BPI R64.
Eller rettere sagt: brugerrumsdelen er Armbian, mens kernen hentes fra repository Frank-s. Den nyeste version kan downloades her.

Al aktivitet omkring udviklingen af software til R64 foregår på forummet. Generelt set forsøger producenten at popularisere routeren under Openwrt, men takket være Frank, udviklerne fra Tyskland, findes alle funktioner hurtigt i kernen for Debian. Overraskende nok er Frank aktiv i hver sektion af forumet.

Organisering af arbejdspladsen: ledninger

Jeg vil gerne fortælle, hvordan man under udvikling/testing placerer SBC (ikke kun BPI) på skrivebordet, så man ikke behøver at føre Ethernet-kablet til det fra kilden til internettet gennem hele rummet/kontoret. Problemet er, at man på den ene side skal sikre, at maskinen har internet, og på den anden side kan alt gå galt i denne maskine, især Wifi.

Først besluttede jeg at købe en billig USB-Wifi "dongle", stikke den i den eneste port på BPI og glemme kablerne. Jeg købte en budgetvenlig TP-LINK TL-WN725N USB 2.0, men meget hurtigt blev det klart, at det ikke ville fungere: der kræves en kernel-driver for at donglen kan arbejde, og selvfølgelig var den ikke til stede (senere samlede jeg den nødvendige RTL8XXXU-driver, men det er stadig upraktisk). Ethernet-kablet ødelagde udsigten i værelset i et stykke tid.

Til sidst lykkedes det mig at slippe af med kablet ved hjælp af Tenda MW3 (Wifi mesh-system): jeg placerede blot en kube under bordet og tilsluttede BPI til LAN-porten på den sidste med et meter langt Ethernet-kabel. Succes.

Wireguard, RKN, Bird

En af de ting, jeg bruger Banana PI til, er at have fri adgang til hjemmesider, der er blokeret af RKN, især for at Telegram og opkald i Slack kan fungere. Der har allerede været foreslået artikler om dette emne på Habr: en, to, tre.

Implementeringen af denne løsning blev jeg gjort muligt ved hjælp af Ansible: link.

Det antages, at VPS kører under Ubuntu 18.04. Jeg har testet funktionaliteten på to udbydere i Europa: Amazon og Digital Ocean.

Så vi har installeret den ovenfor nævnte Armbian på R64, den er tilgængelig via ssh under navnet hm-bananapi-1 og har internetadgang. Vi installerer Ansible sekventielt, automatiseringsscriptet og starter installationen på 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

Dernæst skal vi på tilsvarende måde deployere vores VPN på VPS:

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

Her er argumentet altid current-vpn, mens selve navnet på VPS'en indstilles i variablen (i dette tilfælde 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

Åh, ja, før alle disse operationer skal hemmelighederne (herunder Wireguard-nøglerne) genereres i mappen ./secrets, mappen skal se således ud så.

Ansible-automatisering på Python

Det er værd at bemærke, at i stedet for YAML-formatet er Ansible-kommandoer kodet i Python-scripts. Til sammenligning, hvordan man normalt starter bird-dæmonen:

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

og hvordan det samme gøres via Python:

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

At skrive Ansible-kommandoer i Python-kode giver mulighed for genbrug af koden, og der er generelt åbnet op for alle mulighederne i et generelt programmeringssprog. For eksempel, installation af bird på R64 og VPS:

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

se koden til funktionen install_bird().

Denne funktion kaldet pybook er implementeret herDer er endnu ingen dokumentation for pybook, jeg retter denne fejl senere.

Hvad mener upstream du om dette?

Overvågning. Prometheus

Alt i alt: Telegram fungerer, LinkedIn og Pornhub også, generelt er brugeroplevelsen god. Men alting kan gå i stykker, og de kinesiske enheder også.

Opdateringer af kernen kan også være interessante: for eksempel ønskede jeg at opdatere kernen fra 5.4 til 5.6, for der er jo Wireguard out of the box, ingen patching nødvendigt... Det blev gjort: jeg flyttede omhyggeligt patches fra 5.4 til 5.6, kernen startede, tunnelen til VPS pinger, men Bird kan ikke oprette forbindelse med fejlen "BGP Error"... "I rædsel rullede jeg tilbage" (c) til 5.4; overgangen til 5.6 er sat på TODO-liste.

Derfor, ud over installationen af routeren og VPS, tilføjede jeg overvågning (på x86 Ubuntu 18.04), som installeres på en separat vært med følgende komponenter:

  • prometheus, alertmanager, blackbox_exporter - alt i Docker
  • alarmer sendes til Telegram-kanalen ved hjælp af botten metalmatze/alertmanager-bot - også i Docker
  • tor for botten, så botten kan sende alarmer om situationer, hvor internettet er tilgængeligt, men Telegram stadig ikke fungerer, og selve botten ikke kan oprette forbindelse
  • applikations alarmer: NodeVPNTroubles (ingen ping til VPS), BirdVPNTroubles (ingen Bird-session), AntifilterDownloadTroubles (fejl ved download af blokkerede IP-adresser), SiteTroubles (den forbandede Telegram er utilgængelig)
  • systemalarmer, for eksempel HostGrowingDiskReadLatency (billigt SD-kort stopper med at blive læst)

Eksempel på opsætning af overvågning:

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

Auto Discovery for Prometheus er indstillet på mappen /etc/prometheus/auto_http, eksempel på at tilføje vært til overvågning (som standard overvåges værter ikke):

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 leverandører, 2 BPI, anycast failover

Derudover planlægger jeg at tilslutte mig to udbydere, så internettet kan fortsætte med at fungere, selv hvis en udbyder har netværksproblemer, eller har glemt at betale for internettet osv., og den menneskelige faktor.

Den mest avancerede brugeroplevelse om multi-wan er beskrevet her til systemet Mwan3 under OpenWrt. Denne løsning har rigt funktionalitet, men opsætning og drift af multi-wan er generelt ret besværligt. Et eksempel: hvis man kommer ind på nogle websites med to IP-adresser på én gang, kan de ikke bryde sig om det, og de stopper med at fungere => "internettet virker ikke".

Givet denne erfaring har jeg besluttet, at multihoming ikke er en prioritet for nu, kun failover. Dog ser det ud til, at i de seneste versioner af linux burde det fungere med en enkelt kommando som:

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

Så for at undgå et enkelt fejllæsspunkt, tager vi 2 BPI, tilslutter hver til en udbyder, forbinder dem med hinanden og laver forbindelsen mellem dem med dynamisk routing via bird/OSPF.

Desuden annoncerer vi den samme IP-adresse på hver, hvis tjenesten er tilgængelig (internet, DNS). Det vil sige, at vi ikke selv angiver standardruten, men via bird. Jeg fik denne løsning ved. her .

Jeg har ikke implementeret denne funktion endnu; den snedige coronavirus har også spillet ind (alt er ikke ankommet fra AliExpress; en anden online butik, Layta, lovede levering inden for en uge, men det er nu mere end en måned siden; den anden udbyder nåede ikke at trække kablet før karantænen, han fik kun borret hul i væggen til kablet).

Hvordan man bestiller R64

Selve kortet i den officielle butik SinoVoip.
Det er også bedst at bestille med det samme:

  • strømforsyning + oplys standardstikket EU eller USA
  • kølelegeme: radiatorer/vifter; fordi både CPU'en bliver varm, og switch-chippen
  • en antenne til wifi, for eksempel

Der er et problem - fragtprisen er blevet uforholdsmæssigt høj i den officielle butik i et stykke tid. Manageren Judy Huang overbeviste mig om, at der ikke var nogen fejl, og man kunne vælge ePacket til $5, men jeg så, at der for Rusland kun var EMS til >33$. Ubehageligt, men ikke kritisk. Desuden, hvis man vælger et hvilket som helst andet land til levering (jeg har prøvet alle kontinenter), vil levering koste ~5$. Russofober? ... Men jeg fandt senere ud af, at fragten til Frankrig også koster ca. 30$, og blev roligere.

Til sidst foreslog Judy at lave bestillingen, men ikke betale (hint: at lægge mindre på kortet, så betalingen ikke går igennem automatisk); skrive til hende, og hun vil sænke fragten til en rimelig pris. Succes.

Issues

Ikke alt fungerer perfekt endnu.

Ydeevne

Ansible=Python-kommandoer udføres langsomt, selv tomme, i 20-30 sekunder; meget længere end på x86-laptoppet. De udføres først hurtigt, ~3 sekunder, hvorefter de pludselig bliver langsommere. Måske sker dette på grund af den overophedende CPU (throttling). Koden i Go kører også langsomt:

# запрос метрик для прометея из 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 fungerer, men på Armbian stopper det efter cirka en dag, og skriver:

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

Kun en genstart hjælper. Vi skal videre forstå.

Ethernet

Ethernet fungerer, men efter ~et døgn stopper pakkerne (DHCP) fra R64 med at komme.
Genstart af interfacet hjælper:

ifdown br0; sleep 30; ifup br0

Driveren er ny, den er endnu ikke blevet accepteret i kernen, håber at kineseren Landen Chao får det til at fungere.

Kilde: habr.com

Køb pålidelig webhosting med DDoS-beskyttelse, VPS VDS-servere 🔥 Køb pålidelig webhosting med DDoS-beskyttelse, VPS VDS-servere | ProHoster