Router Banana Pi R64 - Debian, Wireguard, RKN

U Banana Pi 64 hè un computer di bordu unicu simili à u Raspberry Pi, ma cù parechji porti Ethernet, facendu un router di distribuzione Linux per scopi generale.

Router Banana Pi R64 - Debian, Wireguard, RKN

Iè, Openwrt esiste digià, ma hà a so propria GUI è CLI; ci hè Mikrotik, ma di novu hà u so propiu GUI / CLI, è Wireguard ùn viaghja micca fora di a scatula ... In generale, vogliu un router cù paràmetri flessibili, mentre restanu in u quadru di Linux standard, chì travaglia cù ogni ghjornu.

In l'articulu sottu i nomi BPI, R64, single-board, vogliu dì a stessa cosa - u Banana Pi R64 single-board stessu.

Selezzione di l'imagine. Scaricate via eMMC

A prima cumpetenza per acquistà quandu travaglia lunat in generale, è cù R64 in particulari, significa amparà cumu carricà un OS in ellu è pudè interagisce cun ellu, perchè R64 ùn hà micca un portu di monitor (HDMI, per esempiu). Quandu tuttu hè cascatu - Wifi firmò di travaglià, reta Ethernet, Bluetooth, USB, etc., ci hè un UART, attraversu l'interfaccia di quale pudete sempre vede ciò chì hè andatu male, è ancu eseguisce un coppiu di cumandamenti da a cunsola, se ne necessariu.

Algoritmu di cunnessione à R64 via USB-UART:

  • corre à u magazinu di parti radio per un cable USB-UART (PL2303, Serial-to-USB)
  • culligamu una estremità USB à l'urdinatore, è l'altru, UART, à R64, cù trè di quattru fili, cum'è in a stampa sottu.
  • in a cunsola di l'urdinatore run sudo minicom

Dopu quì, in a maiò parte di i casi, a cunsola unicu-board appariscerà = successu.
Pudete vede più ccà.

Router Banana Pi R64 - Debian, Wireguard, RKN

Dopu, u modu più faciule hè di carricà u sistema upirativu da a carta SD: scaricate da a lea l'immagine è 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

inserimu a carta in u R64 SD-slot, accendemu, observemu a carica di uboot prima nantu à a cunsola cunnessa, dopu u boot standard Linux.

Una opzione di boot alternativa hè aduprendu una carta 64Gb digià incrustata in l'R8, chjamata eMMC. Sicondu l'istruzzioni nantu à u wiki, riscrivemu l'imaghjini à u dispusitivu
/dev/mmcblk0 à BPI, reboot, sguassate a carta SD, attivate BPI di novu ... è ùn funziona micca. Cumu ghjunghje Boot select ùn tene micca.

U fattu hè chì almenu per BPI avete bisognu di stabilisce una bandiera speciale per pudè boot da una 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]

In seguitu, avete bisognu di scrive preloader à una partizione di boot speciale

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

U fabricatore R64 (Cina) hà publicatu stu binariu ccà. Ciò ch'ellu face hè scunnisciutu (ùn ci hè micca codici fonte), ma senza ellu ùn hà micca travagliatu.

In generale, dopu, l'imaghjini cumincianu à carica da eMMC. Se vulete capisce è creà imagine da zero, allora per i dui casi (SD / eMMC) avete bisognu di scrive uni pochi di schedari più (preloader per a carta SD, ATF, u-boot), solu per ghjunghje à u kernel. stivali. Stu tema hè sempre si sviluppa, ma per noi u principale hè chì travaglia è bè.

Avà, per esse onestu, ùn aghju micca aduprà eMMC scaricamentu, e carte SD sò abbastanza, ma aghju passatu assai tempu per fà u travagliu, cusì sia in l'articulu.

Scelta di u sistema operatore. Armbianu

U primu compitu di l'applicazione hè di lancià una VPN, sicuru Wireguard. Immediatamente hè risultatu chì ùn era micca assemblatu da u latu di u kernel, è ùn ci era micca intestazioni. Aghju ricustruitu u kernel è, per abitudine cù x86, hà custruitu u modulu di kernel cù DKMS. In ogni casu, a velocità di assemblea nantu à arm64 di ancu i picculi utilità m'hà sorpresu dispiacevule. E dopu un altru modulu di kernel era necessariu, è cusì. In generale, risulta chì tuttu ciò chì riguarda u kernel hè megliu esse assemblatu nantu à un laptop x86 di tubu caldu, dopu trasferitu à R64 per una copia simplice, rebooted è pruvatu.

Un'altra cosa hè a parte di u spaziu di l'utilizatori. In u mo casu di sceglie Debian, tuttu per l'architettura arm64 hè digià in packages.debian.org è ùn ci hè bisognu di ricustruisce nunda.

Per ùn pruduce una altra bicicletta, I purtatu Armbianu nantu à BPI R64.
O piuttostu: a parte di u spaziu di l'utilizatori hè Armbian, è u core hè pigliatu da u repository Frank- A. L'ultima maghjina pò esse scaricata ccà.

Tuttu l'attività nantu à u sviluppu di a parte di u software di R64 hè realizatu foru. In generale, u fabricatore stessu cerca di popularizà u router Openwrt, ma grazia à l'attività di u sviluppatore Frank da Germania, tutte e funziunalità finiscinu rapidamente in u kernel Debian. Sorprendentemente, Frank hè attivu in ogni discussione di u foru.

Organizazione di u spaziu di travagliu: fili

Separatamente, vogliu dicu cumu si mette u SBC (micca solu BPI) nantu à a tavula durante u sviluppu / teste per ùn guidà un cable Ethernet da a fonte Internet attraversu tutta a stanza / l'uffiziu. U fattu hè chì, da una banda, avete bisognu di furnisce l'Internet à u pezzu di ferru, è da l'altra banda, tuttu pò rompe in questu pezzu di ferru, è soprattuttu Wifi.

Prima aghju decisu di cumprà un "fischiu" USB-Wifi economicu, inserisci in l'unicu portu nantu à u BPI è scurdate di i fili. Per fà questu, aghju compru un TP-LINK TL-WN725N USB 2.0 di prezzu, ma assai prestu hè diventatu chjaru chì ùn si sparghje micca: per u fischiu per travaglià, era necessariu un driver di kernel, chì, sicuru, ùn era micca quì. (più tardi aghju compilatu u driver RTL8XXXU necessariu, ma hè sempre impraticabile). È u cable ethernet hà arruvinatu a vista di a stanza per un tempu.

In u risultatu, aghju sappiutu di sguassà u cable cù l'aiutu di Tenda MW3 (Wifi mesh system): I simpricimenti pusatu un cubu sottu à a tavula è cunnessu u BPI à u portu LAN di l'ultime cù un cable Ethernet di metru. Successu.

Wireguard, RKN, Bird

Una di e cose chì aghju utilizatu Banana PI hè di avè accessu liberu à i siti bluccati da u RKN, in particulare, per chì Telegram è chjama à Slack travaglianu. Articuli nantu à questu tema sò digià pruposti nantu à Habré: i tempi, два, trè.

Aghju implementatu l'implementazione di una solu suluzione cù Ansible: ссылка.

U VPS deve esse in esecuzione Ubuntu 18.04. Aghju verificatu u rendiment nantu à dui hosters in Europa: Amazon è Digital Ocean.

Allora, avemu installatu l'Armbian sopra à R64, hè dispunibule via ssh sottu u nome hm-bananapi-1 è hà accessu à Internet. Implementemu sequenzialmente ansible, script d'automatizazione è eseguimu l'installazione stessu nantu à 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

Dopu, avete bisognu di implementà a nostra VPN à u VPS in u listessu modu:

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

Quì, l'argumentu hè sempre current-vpn, è u nome VPS stessu hè cunfiguratu in una variabile (in questu casu, hè 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 iè, prima di tutte queste operazioni, avete bisognu di generà sicreti (in particulare, chjavi Wireguard) in un cartulare ./secrets, u repertoriu deve esse simile tantu.

L'automatizazione Ansible in Python

Puderete nutà chì invece di u formatu YAML, i cumandamenti Ansible sò codificati in script Python. Per paragunà, cumu per attivà u demoniu d'uccelli in u modu di solitu:

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

è cumu u listessu via Python:

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

Scrivite cumandamenti Ansible cù u codice Python permette di reutilizà u codice, è in generale, tutte e pussibulità di una lingua di u scopu generale sò aperte. Per esempiu, installendu bird in R64 è VPS:

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

vede u codice di funzione install_bird().

Questa funzione hè chjamata pybook implementatu ccà. Ùn ci hè ancora documentazione nantu à pybook, allora correraghju stu difettu.

Chì pensa a monte circa questu.

Surviglianza. Prumeteu

Totale: telegram funziona, linkedin è pornhub ancu, in generale, l'esperienza d'utilizatore hè ok. Ma tuttu pò rompe, è i pezzi di ferru chinesi ancu.

L'aghjurnamenti di u kernel ponu ancu esse interessanti: per esempiu, aghju vulsutu aghjurnà u kernel 5.4 => 5.6, bè, ci hè Wireguard fora di a scatula, ùn ci hè bisognu di patch ... Appena dettu ch'è fattu: patchs trasferiti cù cura da 5.4 à 5.6, u kernel hà iniziatu, u tunelu à u VPS pinged, ma bird ùn pò micca cunnette cù l'errore "BGP Error"... "Rolled back in horror" (c) à 5.4; u muvimentu in 5.6 hè statu postponatu in TODO.

Dunque, in più di installà u router è VPS, aghju aghjustatu u monitoraghju (in x86 Ubuntu 18.04), chì hè stallatu in un host separatu cù i seguenti cumpunenti:

  • prometheus, alertmanager, blackbox_exporter - tuttu in docker
  • avvisi sò mandati à u canali di telegramma utilizendu u bot metalmatze/alertmanager-bot - ancu in docker
  • tor per u bot, in modu chì u bot pò avvistà situazioni quandu l'Internet hè dispunibule, ma u telegramma ùn funziona sempre, è u bot stessu ùn pò micca cunnette
  • applicata avvisi: NodeVPNTroubles (senza ping à VPS), BirdVPNTroubles (senza sessione Bird), AntifilterDownloadTroubles (fallutu à carica IP bluccati), SiteTroubles (telegramma sfortunatu indisponibile)
  • avvisi di u sistema cum'è HostGrowingDiskReadLatency (a carta SD economica ferma a lettura)

Esempiu di cunfigurazione di monitoraghju:

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

Auto Discovery for prometheus hè stallatu à u cartulare /etc/prometheus/auto_http, un esempiu di aghjunghje un òspite à u monitoraghju (l'ospiti ùn sò micca monitorati per difettu):

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

In più di tuttu, aghju pensatu à cunnette à dui fornituri per chì l'Internet cuntinueghja à travaglià, ancu s'ellu un fornitore hà avutu prublemi cù a reta, o si scurdanu di pagà per Internet, etc., è altri fatturi umani.

L'esperienza d'utilizatore più avanzata nantu à u tema di multi-wan hè descritta ccà per u sistema Mwan3 sottu Openwrt. Sta suluzione hà una funziunalità ricca, ma a stallazione è u funziunamentu in generale per multi-wan hè piuttostu fastidiosa. Solu un esempiu: s'è vo vene à certi siti da dui indirizzi IP à una volta, tandu ùn li piacia micca, smetteranu di travaglià => "Internet ùn hè micca travagliatu".

In vista di sta sperienza, aghju decisu chì u multihoming ùn hè ancu una priorità, solu failover. Ancu s'ellu pare chì in l'ultime versioni di Linux tuttu deve travaglià cù un cumandamentu cum'è:

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

Cusì, perchè ùn ci hè micca un puntu unicu di fallimentu, pigliemu 2 BPI, ognunu cunnetta à un fornitore, cunnetta inseme è fà cumunicazione cù l'altri per via dinamica attraversu bird / OSPF.

In più, annantu à ogni annunzià u listessu indirizzu IP se u serviziu hè dispunibule (Internet, DNS). Vale à dì, ùn metteremu micca noi stessi a strada predeterminata, ma attraversu l'uccello. A suluzione spia ccà .

Sta funziunalità ùn hè micca stata ancu implementata, l'insidiosu coronavirus s'hè incazzatu (micca tuttu hè vinutu da aliexpress; un altru magazinu in linea, Layta, hà prumessu di furnisce in una settimana, è hè passatu più di un mese; u sicondu fornitore ùn hà micca riesciutu à stende u cable prima di quarantena, solu riesciutu à fà un pirtusu in u muru per perforà u cable).

Cumu cumprà R64

U bordu stessu in a tenda ufficiale SinoVoip.
Hè ancu megliu à cumanda immediatamente:

  • alimentariu + Informate u standard di u plug EU o US
  • dissipatore di calore: radiatori / ventilatori; perchè sia u CPU hè riscaldatu, è u chip switch
  • antenna wifi, per esempiu

Ci hè una sfumatura - u prezzu di consegna da qualchì tempu hè diventatu inadegwatu in a tenda ufficiale. U manager Judy Huang m'hà assicuratu chì ùn ci era micca sbagliu, è pudete sceglie ePacket per $ 5, ma aghju vistu chì per a Russia ci hè solu EMS per> 33 $. Un piacevule, ma micca criticu. Inoltre, se sceglite un altru paese per a spedizione (aghju passatu per tutti i cuntinenti), a spedizione costa ~ 5 $. Russophobes? .. Ma tandu aghju trovu chì per a Francia u prezzu di spedizione hè ancu ~ $ 30, è calmu.

In u risultatu, Judy hà prupostu di fà un ordine, ma micca pagà (amarore: mette menu nantu à a carta per chì u pagamentu ùn passa micca automaticamente); scrivite à ella è ella riducerà u prezzu di spedizione à u normale. Successu.

Issues

Micca tuttu funziona perfettamente.

Produttività

Ansible = I cumandamenti di Python sò eseguiti lentamente, ancu quelli inattivi, per 20-30 seconde; un ordine di grandezza più longu ch'è in un laptop x86. Inoltre, à u principiu sò realizati abbastanza rapidamente, ~ 3 seconde, dopu rallentanu bruscamente. Forsi questu hè dovutu à u riscaldamentu di u CPU (throttling). U codice Go hè ancu longu:

# запрос метрик для прометея из 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 funziona, ma si ferma in Armbian dopu à circa un ghjornu, 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
...

Solu riavviate aiuta. Avemu bisognu di andà più in là risolve.

Ethernet

L'Ethernet funziona, ma dopu ~ un pacchettu di ghjornu (DHCP) da R64 cessanu di vene.
Riavvia l'interfaccia aiuta:

ifdown br0; sleep 30; ifup br0

U cunduttore hè novu, u kernel ùn hè ancu accettatu, speru chì u Chinese Landen Chao finisce.

Source: www.habr.com

Add a comment