Router Banana Pi R64 - Debian, Wireguard, RKN

Il Banana Pi 64 è un computer a scheda singola simile al Raspberry Pi, ma con più porte Ethernet, che lo rendono un router di distribuzione Linux generico.

Router Banana Pi R64 - Debian, Wireguard, RKN

Sì, Openwrt esiste già, ma ha la sua GUI e CLI; c'è Mikrotik, ma ancora una volta ha la sua GUI / CLI e Wireguard non funziona fuori dagli schemi ... In generale, voglio un router con impostazioni flessibili, pur rimanendo all'interno del framework di Linux standard, con cui lavori ogni giorno.

Nell'articolo sotto i nomi BPI, R64, scheda singola, intendo la stessa cosa: la stessa scheda singola Banana Pi R64.

Selezione delle immagini. Scarica tramite eMMC

La primissima abilità da acquisire quando si lavora con SBC in generale, e con R64 in particolare, significa imparare a caricare un sistema operativo al suo interno ed essere in grado di interagire con esso, perché R64 non ha una porta monitor (HDMI, per esempio). Quando tutto è caduto - Wifi ha smesso di funzionare, rete Ethernet, Bluetooth, USB, ecc. c'è un UART, attraverso l'interfaccia di cui puoi sempre vedere cosa è andato storto ed eseguire anche un paio di comandi dalla console, se necessario.

Algoritmo di connessione a R64 tramite USB-UART:

  • corri al negozio di ricambi radio per un cavo USB-UART (PL2303, Serial-to-USB)
  • colleghiamo un'estremità USB al computer e l'altra, UART, a R64, con tre fili su quattro, come nella figura sotto
  • nell'esecuzione della console del computer sudo minicom

Successivamente, nella maggior parte dei casi, apparirà la console a scheda singola = successo.
Puoi vedere di più qui.

Router Banana Pi R64 - Debian, Wireguard, RKN

Successivamente, il modo più semplice è caricare il sistema operativo dalla scheda SD: scarica da collegamento immagine e caricala:

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

inseriamo la scheda nello slot SD R64, la accendiamo, osserviamo il caricamento di uboot prima sulla console collegata, quindi l'avvio standard di Linux.

Un'opzione di avvio alternativa utilizza una scheda da 64 Gb già incorporata nell'R8, chiamata eMMC. Secondo le istruzioni sul wiki, riscriviamo l'immagine sul dispositivo
/dev/mmcblk0 su BPI, riavvia, rimuovi la scheda SD, abilita di nuovo BPI ... e non funziona. Come arrivare là Boot select non tenere duro.

Il fatto è che almeno per BPI è necessario impostare un flag speciale per poter eseguire l'avvio da un'unità flash interna:

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]

Successivamente, è necessario scrivere il preloader in una partizione di avvio speciale

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

Il produttore di R64 (Cina) ha pubblicato questo file binario qui. Quello che fa è sconosciuto (non ci sono codici sorgente), ma senza di lui non funzionerà neanche.

In generale, dopodiché, le immagini iniziano a caricarsi da eMMC. Se vuoi capirlo e creare immagini da zero, allora per entrambi i casi (SD / eMMC) devi scrivere qualche altro file (preloader per la scheda SD, ATF, u-boot), solo per arrivare al kernel stivale. Questo argomento è ancora si sta sviluppando, ma per noi la cosa principale è che funzioni e vada bene.

Ora, a dire il vero, non uso il download di eMMC, le schede SD sono sufficienti, ma ho passato parecchio tempo a farlo funzionare, quindi lascia che sia nell'articolo.

Scelta del sistema operativo. armbiano

La prima attività dell'applicazione è avviare una VPN, ovviamente Wireguard. Si è subito scoperto che non era assemblato dal lato del kernel e non c'erano intestazioni. Ho ricostruito il kernel e, per abitudine con x86, ho creato il modulo del kernel usando DKMS. Tuttavia, la velocità di assemblaggio su arm64 anche di piccole utilità mi ha spiacevolmente sorpreso. E poi è stato richiesto un altro modulo del kernel, e così via. In generale, si scopre che è meglio assemblare tutto ciò che riguarda il kernel su un laptop x86 warm-tube, quindi trasferirlo su R64 mediante semplice copia, riavviare e testare.

Un'altra cosa è la parte dello spazio utente. Nel mio caso di scelta di Debian, tutto per l'architettura arm64 è già su packages.debian.org e non c'è bisogno di ricostruire nulla.

Per non produrre un'altra bicicletta, I portato arminiano su BPI R64.
O meglio: la parte userspace è Armbian, e il core è preso dal repository Frank-UN. L'ultima immagine può essere scaricata qui.

Tutta l'attività sullo sviluppo della parte software di R64 viene svolta su foro. In generale, il produttore stesso cerca di rendere popolare il router Openwrt, ma grazie all'attività dello sviluppatore Frank dalla Germania, tutte le funzionalità finiscono rapidamente nel kernel Debian. Sorprendentemente, Frank è attivo in ogni thread del forum.

Organizzazione dello spazio di lavoro: fili

Separatamente, voglio dirti come posizionare l'SBC (non solo BPI) sul tavolo durante lo sviluppo / test in modo da non condurre un cavo Ethernet dalla fonte Internet attraverso l'intera stanza / ufficio. Il fatto è che, da un lato, devi fornire Internet al pezzo di ferro e, dall'altro, tutto può rompersi in questo pezzo di ferro, e soprattutto il Wifi.

Per prima cosa ho deciso di acquistare un "fischio" USB-Wifi economico, collegarlo all'unica porta del BPI e dimenticare i cavi. Per fare questo, ho acquistato un economico TP-LINK TL-WN725N USB 2.0, ma ben presto è diventato chiaro che non sarebbe decollato: perché il fischio funzionasse, era necessario un driver del kernel, che, ovviamente, non c'era (successivamente ho compilato il driver RTL8XXXU necessario, ma è ancora poco pratico). E il cavo ethernet ha rovinato per un po' la vista della stanza.

Di conseguenza, sono riuscito a sbarazzarmi del cavo con l'aiuto di Tenda MW3 (sistema Wi-Fi mesh): ho semplicemente posizionato un cubo sotto il tavolo e ho collegato il BPI alla porta LAN di quest'ultimo con un metro di cavo Ethernet. Successo.

Wireguard, RKN, Uccello

Una delle cose per cui utilizzo Banana PI è avere libero accesso ai siti bloccati dall'RKN, in particolare, in modo che Telegram e le chiamate a Slack funzionino. Su Habré sono già stati proposti articoli su questo argomento: tempo, два, tre.

Ho implementato la distribuzione di una tale soluzione utilizzando Ansible: collegamento.

Il VPS dovrebbe eseguire Ubuntu 18.04. Ho controllato le prestazioni su due hoster in Europa: Amazon e Digital Ocean.

Quindi, abbiamo installato l'Armbian di cui sopra su R64, è disponibile tramite ssh con il nome hm-bananapi-1 e ha accesso a Internet. Distribuiamo script di automazione ansibili in sequenza ed eseguiamo l'installazione stessa su 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

Successivamente, devi distribuire la nostra VPN al VPS nello stesso modo:

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

Qui, l'argomento è sempre current-vpn e il nome VPS stesso è configurato in una variabile (in questo caso, è 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

Eh si, prima di tutte queste operazioni, bisogna generare i segreti (in particolare le chiavi Wireguard) in una cartella ./secrets, la directory dovrebbe essere simile a così.

Automazione Ansible in Python

Potresti notare che invece del formato YAML, i comandi Ansible sono codificati in script Python. Per confronto, come abilitare il demone uccello nel solito modo:

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

e come lo stesso tramite Python:

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

Scrivere comandi Ansible con codice Python consente di riutilizzare il codice e, in generale, sono aperte tutte le possibilità di un linguaggio generico. Ad esempio, installando bird su R64 e VPS:

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

vedi codice funzione install_bird().

Questa funzione è chiamata pybook implementato qui. Non c'è ancora documentazione su pybook, quindi correggerò questo difetto.

Cosa ne pensa a monte in questa occasione.

Monitoraggio. Prometeo

Totale: telegram funziona, linkedin e anche pornhub, in generale, l'esperienza dell'utente è ok. Ma tutto può rompersi, e anche pezzi di ferro cinesi.

Anche gli aggiornamenti del kernel possono essere interessanti: ad esempio, volevo aggiornare il kernel 5.4 => 5.6, beh, c'è Wireguard pronto all'uso, non c'è bisogno di patch ... Detto fatto: patch trasferite con cura da 5.4 a 5.6, il kernel è stato avviato, il tunnel verso il VPS ha eseguito il ping, ma bird non riesce a connettersi con l'errore "Errore BGP"… "Rollback in horror" (c) a 5.4; il passaggio a 5.6 è stato posticipato in TODO.

Pertanto, oltre all'installazione del router e del VPS, ho aggiunto il monitoraggio (su x86 Ubuntu 18.04), che è installato su un host separato con i seguenti componenti:

  • prometheus, alertmanager, blackbox_exporter - tutto nella finestra mobile
  • gli avvisi vengono inviati al canale Telegram utilizzando il bot metalmatze/alertmanager-bot - anche nella finestra mobile
  • tor per il bot, in modo che il bot possa avvisare situazioni quando Internet è disponibile, ma il telegramma continua a non funzionare e il bot stesso non può connettersi
  • applicato avvisi: NodeVPNTroubles (nessun ping al VPS), BirdVPNTroubles (nessuna sessione Bird), AntifilterDownloadTroubles (impossibile caricare gli indirizzi IP bloccati), SiteTroubles (sfortunato telegramma non disponibile)
  • avvisi di sistema come HostGrowingDiskReadLatency (la scheda SD economica smette di essere letta)

Esempio di impostazione del monitoraggio:

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

Il rilevamento automatico per prometheus è impostato sulla cartella /etc/prometheus/auto_http, un esempio di aggiunta di un host al monitoraggio (gli host non sono monitorati per impostazione predefinita):

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

Oltre a tutto, avevo in programma di connettermi a due provider in modo che Internet continuasse a funzionare, anche se un provider avesse avuto problemi con la rete, o si fosse dimenticato di pagare per Internet, ecc., e altri fattori umani.

Viene descritta l'esperienza utente più avanzata sull'argomento multi-wan qui per il sistema Mwan3 sotto Openwrt. Questa soluzione ha una ricca funzionalità, ma l'impostazione e il funzionamento in generale per multi-wan è piuttosto problematico. Solo un esempio: se arrivi su alcuni siti da due indirizzi IP contemporaneamente, potrebbe non piacergli, smetteranno di funzionare => "Internet non funziona".

Data questa esperienza, ho deciso che il multihoming non è ancora una priorità, solo il failover. Anche se sembra che nelle ultime versioni di Linux tutto dovrebbe funzionare con un comando come:

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

Quindi, in modo che non ci sia un singolo punto di errore, prendiamo 2 BPI, ciascuno connesso a un provider, li colleghiamo insieme e comunichiamo tra loro tramite routing dinamico tramite bird / OSPF.

Inoltre, su ciascuno annunciamo lo stesso indirizzo IP se il servizio è disponibile (Internet, DNS). Cioè, non stabiliremo noi stessi il percorso predefinito, ma tramite bird. La soluzione spiata qui .

Questa funzionalità non è stata ancora implementata, l'insidioso coronavirus ha incasinato (non tutto è arrivato da aliexpress; un altro negozio online, Layta, ha promesso di consegnare in una settimana, ed è passato più di un mese; il secondo fornitore non è riuscito ad allungare il cavo prima della quarantena, è riuscito solo a fare un buco nel muro per far passare il cavo).

Come ordinare R64

La scheda stessa nel negozio ufficiale SinoVoip.
È anche meglio ordinare subito:

  • nutrizione + informa lo standard di spina UE o USA
  • dissipatore di calore: radiatori/ventole; perché sia ​​​​la CPU è riscaldata, sia il chip dello switch
  • antenna Wi-Fi, per esempio

C'è una sfumatura: il prezzo della consegna da qualche tempo è diventato troppo alto nel negozio ufficiale. Il manager Judy Huang mi ha assicurato che non ci sono stati errori e puoi scegliere ePacket per $ 5, ma ho visto che per la Russia c'è solo EMS per> 33 $. Sgradevole, ma non critico. Inoltre, se scegli un altro paese per la consegna (ho attraversato tutti i continenti), la consegna costerà ~5$. Russofobi? .. Ma poi ho scoperto che anche per la Francia il prezzo di consegna è di ~ $ 30 e mi sono calmato.

Di conseguenza, Judy si è offerta di effettuare un ordine, ma non di pagare (accennare: mettere meno sulla carta in modo che il pagamento non vada a buon fine automaticamente); scrivile e ridurrà il prezzo di spedizione alla normalità. Successo.

Problema

Non tutto funziona ancora perfettamente.

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

Ansible=i comandi Python vengono eseguiti lentamente, anche quelli inattivi, per 20-30 secondi; un ordine di grandezza più lungo rispetto a un laptop x86. Inoltre, all'inizio vengono eseguiti abbastanza rapidamente, ~ 3 secondi, quindi rallentano bruscamente. Forse questo è dovuto al riscaldamento della CPU (throttling). Anche il codice Go è di lunga durata:

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

Il wifi funziona, ma si ferma su Armbian dopo circa un giorno, scrive:

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

Solo il riavvio aiuta. Dobbiamo andare oltre capire.

Ethernet

Ethernet funziona, ma dopo ~ un giorno i pacchetti (DHCP) da R64 smettono di arrivare.
Il riavvio dell'interfaccia aiuta:

ifdown br0; sleep 30; ifup br0

Il driver è nuovo, il kernel non è stato ancora accettato, spero il cinese Landen Chao fine.

Fonte: habr.com

Aggiungi un commento