Banana Pi R64 ruter – Debian, Wireguard, RKN

Banana Pi 64 je jednopločni računar sličan Raspberry Pi-u, ali sa nekoliko Ethernet portova, što omogućava da se pretvori u ruter baziran na Linux distribuciji opšte namene.

Banana Pi R64 ruter – Debian, Wireguard, RKN

Da, već postoji Openwrt, ali on ima svoje probleme, svoj GUI i CLI; Postoji Mikrotik, ali opet ima svoj GUI/CLI, a Wireguard ne radi iz kutije... Općenito, želim ruter sa fleksibilnim postavkama, a da ostanem u okviru standardnog Linuxa koji radiš sa svakim danom.

U članku pod nazivima BPI, R64, single-board, mislit ću na istu stvar - samu Banana Pi R64 single-board.

Odabir slike. Preuzmite putem eMMC-a

Prva vještina koju trebate steći kada radite SBC generalno, a posebno sa R64, ovo znači naučiti kako da učitate operativni sistem u njega i da budete u mogućnosti da komunicirate sa njim, jer R64 nema port za monitor (HDMI, na primer). Kada je sve otpalo - Wifi,Eternet,Bluetooth,USB itd.. Tu je UART preko čijeg interfejsa uvek možete videti šta je pošlo po zlu, a takođe i pokrenuti par komandi sa konzole ako je potrebno.

Algoritam za povezivanje na R64 preko USB-UART-a:

  • trčimo u prodavnicu radio dijelova po USB-UART kabel (PL2303, Serial-to-USB)
  • povežite jedan USB kraj na računar, a drugi, UART, na R64, sa tri od četiri žice, kao na slici ispod
  • pokrenuti u konzoli računara sudo minicom

Nakon toga, u većini slučajeva će se pojaviti konzola sa jednom pločom = uspjeh.
Možete vidjeti više detalja ovdje.

Banana Pi R64 ruter – Debian, Wireguard, RKN

Zatim, najlakši način je da učitate operativni sistem sa SD kartice: preuzmite do link sliku i ispunite je:

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

Ubacimo karticu u R64 SD slot, uključimo je i posmatramo kako se povezana konzola učitava prvo uboot, a zatim standardno Linux učitavanje.

Alternativna opcija pokretanja je korištenje kartice od 64Gb koja je već ugrađena u R8, nazvana eMMC. Prema uputama na wikiju, kopiramo sliku na uređaj
/dev/mmcblk0 na BPI, restartujte, uklonite SD karticu, ponovo uključite BPI... i ne radi. Kako ići naprijed-nazad Boot select ne trudi se.

Činjenica je da barem za BPI morate postaviti posebnu zastavicu da biste mogli pokrenuti s internog fleš diska:

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]

Zatim morate upisati preloader u posebnu particiju za pokretanje

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

Proizvođač R64 (Kina) objavio je ovu binarnu datoteku ovdje. Šta radi nije poznato (nema izvornih kodova), ali ni bez njega neće raditi.

Općenito, nakon toga, slike počinju da se učitavaju iz eMMC-a. Ako želite to shvatiti i kreirati slike od nule, onda za oba slučaja (SD/eMMC) trebate napisati još nekoliko fajlova (preloader za SD karticu, ATF, u-boot) samo da biste došli do učitavanja kernela. Ova tema je i dalje se razvija, ali nama je glavno da radi i da je u redu.

Sada preuzimam preko eMMC-a, da budem iskren, ne koristim ga, dovoljna je SD kartica, ali sam dosta vremena potrošio na to da je proradim, pa neka bude u članku.

Odabir operativnog sistema. Armbian

Prvi zadatak aplikacije je pokretanje VPN-a, naravno Wireguarda. Odmah je otkriveno da na strani kernela nije sastavljen i da nema zaglavlja. Ponovo sam napravio kernel i, kao što je moja navika sa x86, sastavio sam kernel modul koristeći DKMS. Međutim, brzina izgradnje čak i malih komunalnih programa na arm64 me je neugodno iznenadila. A onda je bio potreban još jedan modul kernela, itd. Općenito, ispada da je sve što se tiče kernela najbolje sklopiti na toplom x86 laptopu, zatim prenijeti na R64 jednostavnim kopiranjem, ponovo pokrenuti i testirati.

Druga stvar je dio korisničkog prostora. U mom slučaju odabira Debiana, sve za arm64 arhitekturu je već na packages.debian.org i nema potrebe da se bilo što obnavlja.

Da ne bi proizveo još jedan bicikl, I ported Armbijski na BPI R64.
Ili bolje rečeno, ovo: dio korisničkog prostora je Armbian, a kernel je preuzet iz spremišta Frank-A. Najnovija slika se može preuzeti ovdje.

Sve aktivnosti na razvoju softverskog dijela R64 se odvijaju na forum. Općenito govoreći, sam proizvođač nastoji popularizirati ruter za Openwrt, ali zahvaljujući aktivnosti programera Franka iz Njemačke, sve karakteristike brzo završe u kernelu za Debian. Iznenađujuće, Frank je aktivan u svim temama foruma.

Organizacija radnog prostora: žice

Odvojeno, želeo bih da vam kažem kako, tokom razvoja/testiranja, postavite SBC (ne samo BPI) na sto kako ne biste vodili Ethernet kabl do njega sa Internet izvora preko cele sobe/kancelarije. Činjenica je da, s jedne strane, trebate obezbijediti dio hardvera sa internetom, ali s druge strane može se pokvariti sve u tom hardveru, a prije svega Wifi.

Prvo sam odlučio da kupim jeftinu USB-Wifi „zviždaljku“, uključim je u jedini port na BPI i zaboravim na žice. Da bih to učinio, kupio sam jeftin TP-LINK TL-WN725N USB 2.0, ali vrlo brzo je postalo jasno da neće poletjeti: da bi zvižduk radio, potreban vam je upravljački program kernela, kojeg, naravno, nije bilo (kasnije sam sastavio potreban drajver RTL8XXXU, ali je i dalje nepraktičan). A Ethernet kabl je neko vreme pokvario izgled sobe.

Kao rezultat toga, uspio sam da se riješim kabla uz pomoć Tenda MW3 (Wifi mesh sistem): jednostavno sam stavio jednu kocku ispod stola i povezao BPI sa LAN portom potonjeg metar dugim Ethernet kablom. Uspjeh.

Wireguard, RKN, Bird

Jedna od stvari za koje želim da koristim Banana PI je da imam besplatan pristup stranicama koje je blokirao RKN, posebno kako bi Telegram i Slack pozivi mogli raditi. Na ovu temu su već predloženi članci na Habréu: puta, два, tri.

Ja sam implementirao upravo ovo rješenje koristeći Ansible: link.

Pretpostavlja se da VPS koristi Ubuntu 18.04. Provjerio sam funkcionalnost na dva hostera u Evropi: Amazon i Digital Ocean.

Dakle, instalirali smo gornji Armbian na R64, dostupan je preko ssh-a pod imenom hm-bananapi-1 i ima pristup internetu. Dosljedno implementiramo Ansible, automatizacijske skripte i pokrećemo samu instalaciju na 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

Zatim morate postaviti naš VPN na VPS na isti način:

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

Ovdje je argument uvijek current-vpn, a stvarno VPS ime je konfigurirano u varijabli (u ovom slučaju to je 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 da, prije svih ovih operacija morate generirati tajne (posebno ključeve Wireguard) u mapu ./secrets, direktorij bi trebao izgledati tako.

Ansible Automatizacija u Pythonu

Možda ćete primijetiti da umjesto u YAML formatu, Ansible komande su kodirane u Python skriptama. Za poređenje, kako omogućiti bird daemon na uobičajen način:

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

i kako to isto uraditi preko Pythona:

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

Pisanje Ansible komandi u Pythonu vam omogućava da ponovo koristite kod i općenito otvara sve mogućnosti jezika opšte namjene. Na primjer, instaliranje bird na R64 i VPS:

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

pogledajte kod funkcije install_bird().

Ova funkcija se zove pybook implementirano ovdje. Još ne postoji dokumentacija o pybook-u, ali ću kasnije riješiti ovaj problem.

Šta on misli uzvodno o ovome.

Monitoring. Prometej

Ukupno: telegram radi, linkedin i pornhub također, općenito korisničko iskustvo je ok. Ali sve se može pokvariti, uključujući kineski hardver.

Ažuriranja kernela takođe mogu biti interesantna: na primer, hteo sam da ažuriram kernel 5.4 => 5.6, pa, Wireguard je tu iz kutije, nema potrebe za zakrpama... Rečeno nego urađeno: mukotrpno sam preneo zakrpe sa 5.4 do 5.6, kernel je pokrenut, tunel do VPS-a je pingovan, ali ptica ne može da se poveže sa greškom "BGP Error" ... "Vratio sam se u užasu" (c) na 5.4; Prelazak na 5.6 je odgođen u TODO.

Stoga sam, pored instaliranja rutera i VPS-a, dodao monitoring (na x86 Ubuntu 18.04), koji je instaliran na zasebnom hostu sa sljedećim komponentama:

  • prometheus, alertmanager, blackbox_exporter - sve u dockeru
  • Upozorenja se šalju na telegram kanal koristeći metalmatze/alertmanager-bot bot - također u Dockeru
  • tor za bota, tako da bot može upozoriti situacije kada postoji internet, ali telegram i dalje ne radi, a sam bot ne može da se poveže
  • primijenjeno upozorenja: NodeVPNTroubles (bez pinga za VPS), BirdVPNTroubles (bez Bird sesije), AntifilterDownloadTroubles (greška učitavanja blokiranih IP adresa), SiteTroubles (zlosretni telegram nije dostupan)
  • sistemska upozorenja, na primjer, HostGrowingDiskReadLatency (jeftina SD kartica postaje nečitljiva)

Primjer instalacije za praćenje:

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

Automatsko otkrivanje za Prometheus je konfigurisano u folderu /etc/prometheus/auto_http, što je primer dodavanja hosta u nadgledanje (hostovi se ne nadgledaju podrazumevano):

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 provajdera, 2 BPI, Anycast failover

Uz sve, planirao sam da se povežem na dva provajdera kako bi internet nastavio da radi, čak i ako jedan provajder ima problema sa mrežom, ili zaboravi da plati internet itd, i druge ljudske faktore.

Opisano je najnaprednije korisničko iskustvo na temu multi-wan ovdje za Mwan3 sistem pod Openwrt. Ovo rješenje ima bogatu funkcionalnost, ali njegovo postavljanje i korištenje općenito za višestruki wan je prilično problematično. Samo jedan primjer: ako dođete na neke stranice s dvije IP adrese odjednom, možda im se to neće svidjeti, prestat će raditi => “Internet ne radi.”

Uzimajući u obzir ovo iskustvo, odlučio sam da multihoming još nije prioritet, već samo kvar. Mada, čini se da bi u najnovijim verzijama Linuxa sve trebalo da radi sa jednom komandom kao što je:

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

Dakle, da bismo izbjegli jednu tačku kvara, uzimamo 2 BPI-a, povezujemo svaki sa jednim provajderom, povezujemo ih međusobno i uspostavljamo vezu međusobno dinamičkim rutiranjem preko bird/OSPF-a.

Zatim na svakom oglašavamo istu IP adresu ako je usluga dostupna (Internet, DNS). Odnosno, nećemo sami postaviti zadanu rutu, već kroz pticu. Videla sam rešenje ovdje .

Ova funkcionalnost još nije implementirana, podmukli koronavirus je ovdje igrao trik (nije sve stiglo s Aliexpressa; druga internet trgovina, Layta, obećala je isporuku za tjedan dana, ali je prošlo više od mjesec dana; drugi provajder nije imao vremena da produžim kabl pre karantina, uspeo sam da probušim samo rupu u zidu za kabl).

Kako naručiti R64

Sama ploča se nalazi u službenoj prodavnici SinoVoip.
Takođe je bolje naručiti odmah:

  • ishrana + obavijestiti EU ili US standard utikača
  • hladnjak: radijatori/ventilatori; jer se i CPU i čip prekidača zagrijavaju
  • wifi antena, na primjer

Postoji nijansa - cijena dostave je već neko vrijeme postala nedovoljno visoka u službenoj trgovini. Menadžer Judy Huang me je uvjerio da nije bilo greške i da možete odabrati ePacket za 5 dolara, ali sam vidio da za Rusiju postoji samo EMS za >33 dolara. Neprijatno, ali nije kritično. Štaviše, ako odaberete bilo koju drugu zemlju za dostavu (prošao sam sve kontinente), dostava će koštati ~5$. Rusofobi?.. Ali onda sam otkrio da je i za Francusku cijena dostave ~30$ i smirio sam se.

Kao rezultat toga, Judy je ponudila da naruči, ali ne i plati (nagovještaj: stavite manje na karticu da ne bi prošlo automatsko plaćanje); pišite joj i ona će smanjiti cijenu dostave na normalnu. Uspjeh.

pitanja

Još uvijek ne funkcionira sve savršeno.

Produktivnost

Ansible=Python komande se izvršavaju sporo, čak i one u stanju mirovanja, 20-30 sekundi; red veličine duže nego na x86 laptopu. Štaviše, u početku se izvode prilično brzo, ~3 sekunde, a zatim naglo usporavaju. Ovo može biti zbog zagrijavanja CPU-a (prigušenja). Go kodu također treba dosta vremena da radi:

# запрос метрик для прометея из 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 radi, ali na Armbianu prestaje nakon otprilike jednog dana, piše:

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

Samo ponovno pokretanje pomaže. Moramo dalje srediti.

Ethernet

Ethernet radi, ali nakon ~64 sata paketi (DHCP) sa RXNUMX prestaju da pristižu.
Ponovno pokretanje interfejsa pomaže:

ifdown br0; sleep 30; ifup br0

Drajver je nov, jos nije primljen u kernel, nadam se da je kineski Landen Chao završava ga.

izvor: www.habr.com

Dodajte komentar