Router Banana Pi R64 - Debian, Wireguard, RKN

Banana Pi 64 este un computer cu o singură placă similar cu Raspberry Pi, dar cu mai multe porturi Ethernet, ceea ce îl face un router de distribuție Linux de uz general.

Router Banana Pi R64 - Debian, Wireguard, RKN

Da, Openwrt există deja, dar are propriul GUI și CLI; există Mikrotik, dar din nou are propriul GUI / CLI, iar Wireguard nu funcționează din cutie... În general, vreau un router cu setări flexibile, rămânând în același timp în cadrul standardului Linux, cu care lucrați în fiecare zi.

În articolul sub denumirile BPI, R64, single-board, voi spune același lucru - Banana Pi R64 single-board în sine.

Selectarea imaginii. Descărcați prin eMMC

Prima abilitate pe care o dobândești atunci când lucrezi SBC în general, și cu R64 în special, înseamnă să înveți cum să încarci un sistem de operare în el și să poți interacționa cu el, deoarece R64 nu are un port de monitor (HDMI, de exemplu). Când totul a căzut - Wifi a încetat să funcționeze, rețeaua Ethernet, Bluetooth, USB etc. există un UART, prin a cărui interfață puteți vedea întotdeauna ce a mers prost și, de asemenea, să rulați câteva comenzi de pe consolă, dacă este necesar.

Algoritm de conectare la R64 prin USB-UART:

  • mergeți la magazinul de piese radio pentru un cablu USB-UART (PL2303, Serial-to-USB)
  • conectăm un capăt USB la computer, iar celălalt, UART, la R64, cu trei fire din patru, ca în imaginea de mai jos
  • în consola computerului rulează sudo minicom

După aceea, în cele mai multe cazuri, va apărea consola cu o singură placă = succes.
Puteți vedea mai multe aici.

Router Banana Pi R64 - Debian, Wireguard, RKN

În continuare, cea mai simplă modalitate este să încărcați sistemul de operare de pe cardul SD: descărcați prin legătură imagine și încărcați-o:

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

introducem cardul în slotul R64 SD, îl pornim, observăm mai întâi încărcarea uboot-ului pe consola conectată, apoi boot-ul standard Linux.

O opțiune alternativă de pornire este utilizarea unui card de 64 Gb deja încorporat în R8, numit eMMC. Conform instrucțiunilor de pe wiki, rescriem imaginea pe dispozitiv
/dev/mmcblk0 la BPI, reporniți, scoateți cardul SD, activați BPI din nou... și nu funcționează. Cum să ajungem acolo Boot select nu te ții.

Faptul este că cel puțin pentru BPI trebuie să setați un steag special pentru a putea porni de pe o unitate flash internă:

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]

Apoi, trebuie să scrieți preloader-ul într-o partiție de boot specială

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

Producătorul R64 (China) a postat acest binar aici. Ce face este necunoscut (nu există coduri sursă), dar fără el nici nu va funcționa.

În general, după aceea, imaginile încep să se încarce din eMMC. Dacă doriți să vă dați seama și să creați imagini de la zero, atunci pentru ambele cazuri (SD / eMMC) trebuie să mai scrieți câteva fișiere (preloader pentru cardul SD, ATF, u-boot), doar pentru a ajunge la kernel cizme. Acest subiect este încă se dezvoltă, dar pentru noi principalul lucru este că funcționează și bine.

Acum, ca să fiu sincer, nu folosesc descărcarea eMMC, cardurile SD sunt suficiente, dar am petrecut destul de mult timp făcându-l să funcționeze, așa că să fie în articol.

Alegerea sistemului de operare. Armbian

Prima sarcină a aplicației este să lansați un VPN, bineînțeles Wireguard. S-a dovedit imediat că nu a fost asamblat din partea nucleului și nu existau anteturi. Am reconstruit nucleul și, din obișnuință cu x86, am construit modulul kernel-ului folosind DKMS. Cu toate acestea, viteza de asamblare pe arm64 chiar și a utilităților mici m-a surprins neplăcut. Și apoi a fost necesar un alt modul kernel și așa mai departe. În general, se dovedește că tot ce are legătură cu nucleul este mai bine să fie asamblat pe un laptop x86 cu tub cald, apoi transferat pe R64 prin simpla copiere, repornit și testat.

Un alt lucru este partea de spațiu utilizator. În cazul meu de a alege Debian, totul pentru arhitectura arm64 este deja pe packages.debian.org și nu este nevoie să reconstruiți nimic.

Pentru a nu produce o altă bicicletă, eu portat armbian pe BPI R64.
Sau mai degrabă: partea spațiului utilizator este Armbian, iar nucleul este preluat din depozit Sincer-A. Cea mai recentă imagine poate fi descărcată aici.

Toată activitatea privind dezvoltarea părții software a R64 se desfășoară pe for. În general, producătorul însuși caută să popularizeze routerul Openwrt, dar datorită activității dezvoltatorului Frank din Germania, toate caracteristicile ajung rapid în kernel-ul Debian. În mod surprinzător, Frank este activ în fiecare subiect de pe forum.

Organizarea spațiului de lucru: fire

Separat, vreau să vă spun cum să plasați SBC-ul (nu doar BPI) pe masă în timpul dezvoltării/testării, pentru a nu conduce un cablu Ethernet la el de la sursa de Internet prin întreaga cameră/birou. Cert este că, pe de o parte, trebuie să oferiți internetul piesei de fier, iar pe de altă parte, totul se poate rupe în această bucată de fier, și în special Wifi.

Mai întâi am decis să cumpăr un „fluier” USB-Wifi ieftin, să-l conectez la singurul port de pe BPI și să uit de fire. Pentru a face acest lucru, am achiziționat un TP-LINK TL-WN725N USB 2.0 ieftin, dar foarte curând a devenit clar că nu va decola: pentru ca fluierul să funcționeze, era nevoie de un driver de kernel, care, desigur, nu era acolo. (mai târziu am compilat driverul RTL8XXXU necesar, dar încă nu este practic). Iar cablul ethernet a stricat pentru o vreme vederea camerei.

Drept urmare, am reușit să scap de cablu cu ajutorul Tenda MW3 (sistem de plasă Wifi): pur și simplu am așezat un cub sub masă și am conectat BPI-ul la portul LAN al acestuia din urmă cu un cablu Ethernet de metru. Succes.

Wireguard, RKN, Bird

Unul dintre lucrurile pentru care folosesc Banana PI este să am acces gratuit la site-urile blocate de RKN, în special, astfel încât Telegram și apelurile către Slack să funcționeze. Articole pe această temă au fost deja propuse pe Habré: timp, два, trei.

Am implementat implementarea unei astfel de soluții folosind Ansible: legătură.

VPS-ul ar trebui să ruleze Ubuntu 18.04. Am verificat performanța pe două hostere din Europa: Amazon și Digital Ocean.

Deci, am instalat Armbianul de mai sus pe R64, este disponibil prin ssh sub numele hm-bananapi-1 si are acces la internet. Implementăm secvențial scripturi de automatizare ansible și rulăm instalarea în sine pe 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

Apoi, trebuie să implementați VPN-ul nostru la VPS în același mod:

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

Aici, argumentul este întotdeauna current-vpn, iar numele VPS în sine este configurat într-o variabilă (în acest caz, este 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

Da, înainte de toate aceste operațiuni, trebuie să generați secrete (în special, cheile Wireguard) într-un folder ./secrets, directorul ar trebui să arate ca astfel.

Automatizare Ansible în Python

Este posibil să observați că, în loc de formatul YAML, comenzile Ansible sunt codificate în scripturi Python. Pentru comparație, cum să activați demonul pasăre în mod obișnuit:

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

și la fel prin Python:

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

Scrierea comenzilor Ansible cu cod Python vă permite să reutilizați codul și, în general, toate posibilitățile unui limbaj de uz general sunt deschise. De exemplu, instalarea bird pe R64 și VPS:

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

vezi codul functiei install_bird().

Această caracteristică este numită pybook implementate aici. Nu există încă documentație despre pybook, atunci voi corecta acest defect.

Ce crede el amonte cu aceasta ocazie.

Monitorizarea. Prometeu

Total: telegram funcționează, linkedin și pornhub, în ​​general, experiența utilizatorului este ok. Dar totul se poate sparge și bucăți chinezești de fier de asemenea.

Actualizările kernel-ului pot fi, de asemenea, interesante: de exemplu, am vrut să actualizez kernel-ul 5.4 => 5.6, ei bine, există Wireguard din cutie, nu este nevoie să patchez... Nu mai devreme zis decât gata: patch-uri transferate cu minuțiozitate de la 5.4 la 5.6, nucleul a pornit, tunelul către VPS a sunat, dar pasărea nu se poate conecta cu eroarea „BGP Error”… „Roll back in horror” (c) la 5.4; trecerea la 5.6 a fost amânată în TODO.

Prin urmare, pe lângă instalarea routerului și a VPS-ului, am adăugat monitorizarea (pe Ubuntu x86 18.04), care este instalată pe o gazdă separată cu următoarele componente:

  • prometheus, alertmanager, blackbox_exporter - toate în docker
  • alertele sunt trimise pe canalul telegram folosind botul metalmatze/alertmanager-bot - tot în docker
  • tor pentru bot, astfel încât botul să poată alerta situații când internetul este disponibil, dar telegrama tot nu funcționează și botul în sine nu se poate conecta
  • aplicat alerte: NodeVPNTroubles (fără ping la VPS), BirdVPNTroubles (fără sesiune Bird), AntifilterDownloadTroubles (nu s-au încărcat IP-uri blocate), SiteTroubles (telegrama nefastă indisponibilă)
  • alerte de sistem precum HostGrowingDiskReadLatency (cardul SD ieftin nu mai este citit)

Exemplu de configurare a monitorizării:

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

Descoperirea automată pentru prometheus este setată în folderul /etc/prometheus/auto_http, un exemplu de adăugare a unei gazde la monitorizare (gazdele nu sunt monitorizate implicit):

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

Pe lângă toate, am plănuit să mă conectez la doi furnizori, astfel încât Internetul să continue să funcționeze, chiar dacă un furnizor avea probleme cu rețeaua, sau a uitat să plătească pentru Internet etc., și alți factori umani.

Este descrisă cea mai avansată experiență de utilizator pe tema multi-wan aici pentru sistemul Mwan3 sub Openwrt. Această soluție are o funcționalitate bogată, dar configurarea și operarea în general pentru multi-wan este destul de deranjantă. Doar un exemplu: dacă vii pe unele site-uri de la două adrese IP simultan, atunci s-ar putea să nu le placă, vor înceta să funcționeze => „Internetul nu funcționează”.

Având în vedere această experiență, am decis că multihoming nu este încă o prioritate, ci doar failover-ul. Deși se pare că în cele mai recente versiuni de Linux totul ar trebui să funcționeze cu o singură comandă precum:

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

Deci, pentru a nu exista un singur punct de eșec, luăm 2 BPI-uri, fiecare se conectează la un furnizor, îi conectează împreună și comunică unul cu celălalt prin rutare dinamică prin bird / OSPF.

Mai mult, pe fiecare anunțăm aceeași adresă IP dacă serviciul este disponibil (Internet, DNS). Adică nu vom pune calea implicită noi înșine, ci prin pasăre. Soluția a spionat aici .

Această funcționalitate nu a fost încă implementată, insidiosul coronavirus s-a încurcat (nu totul a venit de la aliexpress; un alt magazin online, Layta, a promis că va livra într-o săptămână și a trecut mai bine de o lună; al doilea furnizor nu a reușit să întindă cablu înainte de carantină, am reușit doar să facă o gaură în perete pentru a găuri pentru cablu).

Cum se comandă R64

Placa în sine în magazinul oficial SinoVoip.
De asemenea, este mai bine să comandați imediat:

  • alimente + informați standardul de priză UE sau SUA
  • radiatoare: radiatoare/ventilatoare; pentru că atât procesorul este încălzit, cât și cipul comutatorului
  • antena wifi, de exemplu

Există o nuanță - prețul de livrare de la un timp a devenit inadecvat de ridicat în magazinul oficial. Managerul Judy Huang m-a asigurat că nu a fost nicio greșeală și puteți alege ePacket pentru 5 USD, dar am văzut că pentru Rusia există doar EMS pentru >33 USD. Neplăcut, dar nu critic. Mai mult, dacă alegeți orice altă țară pentru livrare (am trecut prin toate continentele), livrarea va costa ~5$. Rusofobi?.. Dar apoi am constatat că și pentru Franța prețul de livrare este de ~30$ și m-am liniștit.

Drept urmare, Judy s-a oferit să plaseze o comandă, dar să nu plătească (aluzie: pune mai putin pe card pentru ca plata sa nu treaca automat); scrie-i și ea va reduce prețul de transport la normal. Succes.

Probleme

Nu totul funcționează perfect încă.

productivitate

Ansible=Comenzile Python sunt executate lent, chiar și cele inactive, timp de 20-30 de secunde; cu un ordin de mărime mai lung decât pe un laptop x86. Mai mult, la început se execută destul de repede, ~ 3 secunde, apoi încetinesc brusc. Poate că acest lucru se datorează încălzirii CPU (accelerare). Codul Go este, de asemenea, de lungă durată:

# запрос метрик для прометея из 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-ul funcționează, dar se oprește pe Armbian după aproximativ o zi, scrie:

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

Doar repornirea ajută. Trebuie să mergem mai departe rezolvă.

Ethernet

Ethernet funcționează, dar după ~ o zi pachetele (DHCP) de la R64 nu mai vin.
Repornirea interfeței ajută:

ifdown br0; sleep 30; ifup br0

Driverul este nou, nucleul nu a fost încă acceptat, sper că chinezul Landen Chao finalizarea.

Sursa: www.habr.com

Adauga un comentariu