Router Banana Pi R64 — Debian, Wireguard, RKN

Banana Pi 64 är en enkortsdator av typen Raspberry Pi, men med flera Ethernet-portar, vilket möjliggör att göra den till en router baserad på en allmän Linux-distribution.

Router Banana Pi R64 — Debian, Wireguard, RKN

Ja, det finns redan Openwrt, men det har sina egna komplikationer med GUI och CLI; det finns Mikrotik, men det har också sitt eget GUI/CLI, och Wireguard fungerar inte direkt … Det man egentligen vill ha är en router med flexibla inställningar, som samtidigt ger möjlighet att arbeta inom ramverket av standardlinux som man använder varje dag.

I artikeln under namnen BPI, R64, enkortsdator kommer jag att syfta på samma sak — själva enkortsdatorn Banana Pi R64.

Val av bild. Start från eMMC

Den första färdigheten man måste skaffa sig när man arbetar med SBC överhuvudtaget, och med R64 i synnerhet, är att lära sig att ladda in operativsystemet och ha möjlighet att interagera med det, eftersom R64 inte har någon port för bildskärm (HDMI, till exempel). När allt går fel — Wifi slutar fungera, Ethernet-nätverket, Bluetooth, USB och annat, finns UART, genom vilken man alltid kan se vad som gått fel, samt köra några kommando från konsolen vid behov.

Algoritm för att ansluta till R64 via USB-UART:

  • spring till elektronikbutiken för en USB-UART-kabel (PL2303, Serial-to-USB)
  • anslut ena USB-änden till datorn och den andra, UART,- till R64 med tre av fyra ledningar, som på bilden nedan
  • i datorens konsol kör vi sudo minicom

Efter det kommer i de flesta fall konsolen för enkortsdatorn = framgång.
Mer information kan ses här.

Router Banana Pi R64 — Debian, Wireguard, RKN

Sedan är det enklast att ladda ner operativsystemet från ett SD-kort: ladda ner via länken bild och ladda upp den:

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

sätt in kortet i SD-kortplatsen på R64, sätt på det, och följ processen via den anslutna konsolen som laddar in först uboot, och sedan standard Linux-start.

Ett alternativ för uppstart — med hjälp av det redan installerade 8GB eMMC-kortet i R64. Enligt instruktionerna i Wikipedias artikel skriver vi bilden till enheten
/dev/mmcblk0 в BPI, перегружаемся, вытаскиваем SD-карту, включаем BPI снова… и не работает. Как туда-сюда Boot select rör inte.

Grejen är att åtminstone för BPI måste ett speciellt flagg sättas för att kunna starta från det interna minnet:

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

Sedan måste preloader skrivas till den speciella boot-partitionen

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

Tillverkaren R64 (Kina) har släppt denna binärfil här. Vad den gör är okänt (det finns inga källkoder), men utan den fungerar det inte.

Generellt börjar bilderna att ladda från eMMC efter detta. Om man vill förstå och skapa bilder från grunden, så måste man för båda fallen (SD/eMMC) även skriva ytterligare flera filer (preloader för SD-kort, ATF, u-boot) för att nå kärnladdningen. Det här ämnet är fortfarande utvecklas, men för oss är det viktigast att det fungerar och det är bra.

Just nu använder jag ärligt talat inte eMMC-laddning, SD-kort är tillräckliga, men jag har lagt mycket tid på att få det att fungera, så det bör vara med i artikeln.

Val av operativsystem. Armbian

Den första praktiska uppgiften är att sätta upp VPN, naturligtvis Wireguard. Det upptäcktes genast att det inte var kompilat i kärnan, och det fanns inga rubriker. Jag kompilerade kärnan och, av gammal vana från x86, byggde kärnmodulen med hjälp av DKMS. Men hastigheten på kompileringen på arm64 för även små verktyg överraskade mig negativt. Och sedan behövdes ännu en kärnmodul, och osv. Så det visar sig att allt som har att göra med kärnan är bättre att kompilera på en varm, gammaldags x86-laptop, och därefter enkelt kopiera över till R64, starta om och testa.

Det är en annan sak med användarutrymmet. I mitt fall med val av Debian finns allt för arkitekturen arm64 redan på packages.debian.org och inget behöver kompilera.

För att inte skapa ännu en cykel så har portat Armbian på BPI R64.
Korrektare sagt: användarutrymmets del — Armbian, medan kärnan hämtas från repo Frank-s. Den senaste bilden kan laddas ner här.

All aktivitet kring utvecklingen av mjukvarudelen av R64 görs på forumet. Generellt sett försöker tillverkaren popularisera routern under Openwrt, men tack vare aktiviteten hos utvecklaren Frank från Tyskland hamnar alla funktioner snabbt i kärnan för Debian. Det är förvånande, men Frank är aktiv i varje forumtråd.

Organisation av arbetsytan: kablar

Jag vill särskilt berätta hur man under utveckling/testning placerar SBC (inte bara BPI) på bordet så att man inte behöver dra Ethernet-kabel från internetkällan genom hela rummet/kontoret. Det handlar om att å ena sidan ge hårdvaran internet, och å den andra sidan kan det här hårdvaran gå sönder, och i första hand Wifi.

I initially decided to get a cheap USB WiFi "dongle," plug it into the only port on the BPI, and forget about wires. For this, I purchased an inexpensive TP-LINK TL-WN725N USB 2.0, but it soon became clear that it wouldn't work: the dongle needs a kernel driver that wasn't there, of course (later I compiled the required RTL8XXXU driver, but it was still impractical). The Ethernet cable spoiled the look of the room for a while.

In the end, I managed to get rid of the cable with the help of Tenda MW3 (a WiFi mesh system): I simply placed one cube under the table and connected the BPI to the LAN port of the latter with a one-meter Ethernet cable. Success.

Wireguard, RKN, Bird

One of the things I use the Banana PI for is to have free access to sites blocked by the RKN, particularly for Telegram and calls in Slack. Articles on this topic have already been suggested on Habr: ett, två, tre.

I implemented the deployment of this solution using Ansible: länk.

It is assumed that the VPS runs on Ubuntu 18.04. I have tested it on two hosts in Europe: Amazon and Digital Ocean.

So, we installed the aforementioned Armbian on R64, it is accessible via ssh under the name hm-bananapi-1 and has internet access. We sequentially deploy ansible, automation scripts, and start the installation on 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

Next, we need to deploy our VPN on the VPS in the same way:

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

Here the argument is always current-vpn, while the actual name of the VPS is configured in the variable (in this case, it's 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 yes, before all these operations, you need to generate secrets (in particular, the Wireguard keys) in the folder ./secrets, the directory should look like så.

Ansible Automation in Python

You can notice that instead of YAML format, Ansible commands are encoded in Python scripts. For comparison, how to start the bird daemon in the usual way:

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

and how the same thing looks through Python:

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

Writing Ansible commands in Python code allows for code reuse, and all the capabilities of a general-purpose language are open. For example, installing bird on R64 and VPS:

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

view the function code install_bird().

This feature is called pybook har möjligheten här. Dokumentationen för pybook finns än så länge inte, jag kommer att åtgärda detta senare.

Vad tycker upstream om detta?

Övervakning. Prometheus

Så, telegram fungerar, linkedin och pornhub också, så användarupplevelsen är okej. Men allt kan gå sönder, och de kinesiska prylarna också.

Uppdateringar av kärnan kan också vara intressanta: till exempel, jag ville uppdatera kärnan från 5.4 till 5.6, tja, där har vi Wireguard i lådan, inget behov av att patcha… Sagt och gjort: jag överförde noggrant patchar från 5.4 till 5.6, kärnan startade, tunneln till VPS:n pingerades, men bird kunde inte ansluta och fick "BGP Error"... "I skräck rullade jag tillbaka" (c) till 5.4; flytten till 5.6 skjuts upp till TODO.

Därför lade jag till övervakning (på x86 Ubuntu 18.04) i tillägg till installationen av routern och VPS, som installeras på en separat värd med följande komponenter:

  • prometheus, alertmanager, blackbox_exporter – allt i docker
  • alerter skickas till telegramkanalen med hjälp av botten metalmatze/alertmanager-bot – även det i docker
  • tor för botten, så att botten kan meddela om situationer när internet finns, men telegram fungerar inte, och botten kan inte ansluta
  • tillämpnings- alarmer: NodeVPNTroubles (inga pingar till VPS), BirdVPNTroubles (ingen Bird-session), AntifilterDownloadTroubles (fel vid hämtning av blockerade IP-adresser), SiteTroubles (den olycksaliga telegram är otillgänglig)
  • systemalarmer, till exempel, HostGrowingDiskReadLatency (billigt SD-kort slutar fungera)

Exempel på installation av övervakning:

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

Auto Discovery för prometheus är inställd på mappen /etc/prometheus/auto_http, exempel på att lägga till en värd i övervakning (standard är att värdar inte övervakas):

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 leverantörer, 2 BPI, anycast failover

Dessutom planerade jag att ansluta till två leverantörer, så att internet fortsätter att fungera även om en leverantör har problem med nätverket, eller har glömt att betala för internet, osv., och andra mänskliga faktorer.

Den mest avancerade användarupplevelsen när det gäller multi-wan beskrivs här för systemet Mwan3 under Openwrt. Denna lösning har rik funktionalitet, men inställning och drift av multi-wan är ganska besvärligt. Bara ett exempel: om man besöker vissa webbplatser från två IP-adresser samtidigt, så kanske de inte gillar det, de slutar fungera => "internet fungerar inte".

Med hänsyn till denna erfarenhet beslutade jag att multihoming inte är en prioritet för tillfället, endast failover. Även om det verkar som att allt bör fungera med ett enda kommando av typen i de senaste versionerna av linux:

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

Så för att undvika en enda punkt av fel, tar vi 2 BPI, kopplar varje till en provider, kopplar dem till varandra och gör anslutningen mellan dem via dynamisk routing genom bird/OSPF.

Vidare annonserar vi samma IP-adress på varje, om tjänsten är tillgänglig (internet, DNS). Det vill säga, vi kommer inte att ställa in standardrouten själva, utan via bird. Lösningen såg jag. här .

Denna funktionalitet har jag ännu inte implementerat, den elaka coronaviruset har också ställt till det (inte allt kom fram från AliExpress; en annan webbutik, Layta, lovade att leverera på en vecka, men det har gått mer än en månad; den andra leverantören hann inte dra kabeln före karantänen, hann bara borra ett hål i väggen för kabeln).

Hur man beställer R64

Själva kortet i den officiella butiken SinoVoip.
Det är också bäst att beställa direkt:

  • strömförsörjning + meddela standarden för kontakten EU eller USA
  • värmeavledare: kylflänsar/fläktar; eftersom både CPU:n och switchchipet blir varma
  • en antenn för wifi, for example

Det finns en nackdel - fraktkostnaden har blivit oproportionerligt hög under en tid i den officiella butiken. Handledaren Judy Huang övertygade mig om att det inte finns något fel och att man kan välja ePacket för $5, men jag såg att det för Ryssland endast finns EMS för >33$. Otrevligt, men inte kritiskt. Dessutom, om man väljer vilket annat land som helst för leverans (jag har gått igenom alla kontinenter), så är frakten omkring $5. Ryssofober?.. Men sedan hittade jag att fraktkostnaden till Frankrike också är ~30$, och blev lugn.

Till slut föreslog Judy att göra beställningen, men inte betala (hint: sätta in mindre på kortet, så att betalningen inte går igenom automatiskt); skriva till henne, så att hon sänker fraktkostnaden till en rimlig nivå. Framgång.

Problem

Det fungerar inte perfekt än.

Performance

Anvisningar i Ansible=Python körs långsamt, även de tomma, på 20-30 sekunder; betydligt längre än på min x86-laptop. Faktum är att de först körs ganska snabbt, ~3 sekunder, och sedan plötsligt saktar ner. Det kan bero på överhettande CPU (throttling). Koden på Go fungerar också långsamt:

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

sa@bananapir64:~$ dmesg | grep -E 'mt7622_wmac.*timeout'
[470303.802539] mt7622_wmac 18000000.wmac: Meddelande 38 (seq 3) timeout
[470314.042508] mt7622_wmac 18000000.wmac: Meddelande 50 (seq 4) timeout
...

Endast en omstart hjälper. Måste gå vidare att undersöka.

Ethernet

Ethernet fungerar, men efter ~ett dygn slutar paketen (DHCP) från R64 att komma.
En omstart av gränssnittet hjälper:

ifdown br0; sleep 30; ifup br0

Drivern är ny, har ännu inte accepterats i kärnan, hoppas att kinesen Landen Chao färdigställer.

Källa: habr.com

Köp pålitlig webbhotell med DDoS-skydd, VPS VDS-servrar 🔥 Köp pålitlig webbhotell med DDoS-skydd, VPS VDS-servrar | ProHoster