Usmerjevalnik Banana Pi R64 - Debian, Wireguard, RKN

Banana Pi 64 je računalnik z eno ploščo, podoben Raspberry Pi, vendar z več ethernetnimi vrati, zaradi česar je distribucijski usmerjevalnik Linuxa za splošne namene.

Usmerjevalnik Banana Pi R64 - Debian, Wireguard, RKN

Da, Openwrt že obstaja, vendar ima svoj GUI in CLI; obstaja Mikrotik, vendar ima spet svoj GUI / CLI, Wireguard pa ne deluje takoj ... Na splošno želim usmerjevalnik s prilagodljivimi nastavitvami, hkrati pa ostati v okviru standardnega Linuxa, s katerim delate vsak dan.

V članku pod imeni BPI, R64, single-board, bom mislil isto stvar - Banana Pi R64 single-board.

Izbira slike. Prenos prek eMMC

Prva veščina, ki jo pridobimo pri delu SBC na splošno in še posebej pri R64 pomeni, da se morate naučiti, kako vanj naložiti operacijski sistem in biti sposoben komunicirati z njim, ker R64 nima priključka za monitor (HDMI, na primer). Ko je vse padlo - Wifi je prenehal delovati, omrežje Ethernet, Bluetooth, USB itd. obstaja UART, prek katerega vmesnika lahko vedno vidite, kaj je šlo narobe, in po potrebi zaženete nekaj ukazov s konzole.

Algoritem povezave z R64 preko USB-UART:

  • pojdite v trgovino z radijskimi deli po kabel USB-UART (PL2303, Serial-to-USB)
  • en konec USB povežemo z računalnikom, drugi, UART, pa na R64, s tremi od štirih žic, kot na spodnji sliki
  • v teku računalniške konzole sudo minicom

Po tem se bo v večini primerov pojavila konzola z eno ploščo = uspeh.
Vidite lahko več tukaj.

Usmerjevalnik Banana Pi R64 - Debian, Wireguard, RKN

Nato je najlažji način naložiti operacijski sistem s kartice SD: prenesite s povezava sliko in jo naložite:

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

vstavimo kartico v režo R64 SD, jo vklopimo, opazujemo nalaganje najprej uboot na povezani konzoli, nato standardni zagon Linuxa.

Alternativna možnost zagona je uporaba kartice 64 Gb, ki je že vgrajena v R8, imenovane eMMC. Po navodilih na wikiju sliko prepišemo v napravo
/dev/mmcblk0 v BPI, znova zaženite, odstranite kartico SD, ponovno omogočite BPI ... in ne deluje. Kako priti do tja Boot select ne vztrajaj.

Dejstvo je, da morate vsaj za BPI nastaviti posebno zastavico, da se lahko zaženete z notranjega bliskovnega pogona:

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]

Nato morate vnaprejšnji nalagalnik napisati na posebno zagonsko particijo

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

Proizvajalec R64 (Kitajska) je objavil to dvojiško datoteko tukaj. Kaj počne, ni znano (ni izvornih kod), a brez njega tudi ne bo šlo.

Na splošno se po tem slike začnejo nalagati iz eMMC. Če želite to ugotoviti in ustvariti slike iz nič, morate za oba primera (SD / eMMC) napisati še nekaj datotek (prednalagalnik za kartico SD, ATF, u-boot), samo da pridete do jedra škorenj. Ta tema je še vedno se razvija, ampak za nas je glavno, da deluje in je v redu.

Zdaj, če sem iskren, ne uporabljam prenosa eMMC, SD kartice so dovolj, vendar sem porabil kar nekaj časa, da je delovalo, tako da naj bo v članku.

Izbira operacijskega sistema. Armbian

Prva naloga aplikacije je zagon VPN-ja, seveda Wireguard. Takoj se je izkazalo, da ni bil sestavljen s strani jedra in ni bilo glav. Ponovno sem zgradil jedro in iz navade pri x86 zgradil modul jedra z uporabo DKMS. Vendar pa me je hitrost sestavljanja na arm64 tudi majhnih pripomočkov neprijetno presenetila. In potem je bil potreben še en modul jedra in tako naprej. Na splošno se izkaže, da je vse, kar je povezano z jedrom, bolje sestaviti na prenosnem računalniku x86 s toplo cevjo, nato s preprostim kopiranjem prenesti v R64, znova zagnati in preizkusiti.

Druga stvar je del uporabniškega prostora. V mojem primeru, ko sem izbral Debian, je vse za arhitekturo arm64 že na packages.debian.org in ni treba ničesar znova sestaviti.

Da ne bi izdelal še enega kolesa, sem prenesen Armbijan na BPI R64.
Ali bolje rečeno: del uporabniškega prostora je Armbian, jedro pa je vzeto iz repozitorija Frank-A. Najnovejšo sliko lahko prenesete tukaj.

Vse aktivnosti na razvoju programskega dela R64 potekajo naprej forum. Na splošno si proizvajalec sam prizadeva za popularizacijo usmerjevalnika Openwrt, a zaradi dejavnosti razvijalca Franka iz Nemčije vse funkcije hitro končajo v jedru Debian. Presenetljivo je, da je Frank aktiven v vsaki temi foruma.

Organizacija delovnega prostora: žice

Ločeno vam želim povedati, kako postaviti SBC (ne samo BPI) na mizo med razvojem / testiranjem, da ne bi do njega vodili ethernetnega kabla iz internetnega vira skozi celotno sobo / pisarno. Dejstvo je, da je treba po eni strani železju zagotoviti internet, po drugi strani pa se lahko v tem železu vse pokvari, še posebej Wifi.

Najprej sem se odločil kupiti poceni USB-Wifi "piščalko", jo vtakniti v edini port na BPI in pozabiti na žice. Da bi to naredil, sem kupil poceni TP-LINK TL-WN725N USB 2.0, vendar je zelo kmalu postalo jasno, da ne bo vzletel: za delovanje piščalke je bil potreben gonilnik jedra, ki ga seveda ni bilo (kasneje sem prevedel potreben gonilnik RTL8XXXU, vendar je še vedno nepraktičen). In ethernet kabel je za nekaj časa pokvaril pogled na sobo.

Posledično sem se s pomočjo Tenda MW3 (Wifi mesh system) uspel znebiti kabla: eno kocko sem preprosto položil pod mizo in z meter Ethernet kablom povezal BPI na LAN priključek slednjega. Uspeh.

Wireguard, RKN, Bird

Ena od stvari, za katere uporabljam Banana PI, je prost dostop do spletnih mest, ki jih blokira zlasti RKN, tako da Telegram in klici v Slack delujejo. Članki na to temo so bili že predlagani na Habréju: čas, два, 3.

Implementiral sem samo takšno rešitev z uporabo Ansible: povezava.

VPS naj bi poganjal Ubuntu 18.04. Uspešnost sem preveril na dveh hosterjih v Evropi: Amazon in Digital Ocean.

Torej, zgornji Armbian smo namestili na R64, na voljo je prek ssh pod imenom hm-bananapi-1 in ima dostop do interneta. Razmestimo zaporedno ansible, avtomatizacijske skripte in izvedemo samo namestitev 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

Nato morate naš VPN namestiti v VPS na enak način:

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

Tukaj je argument vedno trenutni-vpn, samo ime VPS pa je konfigurirano v spremenljivki (v tem primeru je to 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 ja, pred vsemi temi operacijami morate ustvariti skrivnosti (predvsem ključe Wireguard) v mapi ./secrets, mora imenik izgledati takole Tako.

Ansible avtomatizacija v Pythonu

Morda boste opazili, da so namesto v formatu YAML ukazi Ansible kodirani v skriptih Python. Za primerjavo, kako omogočiti ptičji demon na običajen način:

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

in kako isto prek Pythona:

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

Pisanje ukazov Ansible s kodo Python omogoča ponovno uporabo kode in na splošno so odprte vse možnosti jezika za splošno uporabo. Na primer, namestitev bird na R64 in VPS:

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

glejte funkcijsko kodo install_bird().

Ta funkcija se imenuje pybook izvajati tukaj. Za pybook še ni dokumentacije, potem bom popravil to napako.

Kaj misli gorvodno o tem.

Spremljanje. Prometej

Skupaj: telegram deluje, linkedin in pornhub tudi, na splošno je uporabniška izkušnja ok. A vse se lahko zlomi, kitajski kosi železa tudi.

Posodobitve jedra so lahko tudi zanimive: na primer, želel sem posodobiti jedro 5.4 => 5.6, no, tam je Wireguard iz škatle, ni potrebe po popravkih ... Rečeno kot storjeno: skrbno preneseni popravki iz 5.4 v 5.6, jedro se je zagnalo, tunel do VPS je bil pingan, vendar se ptica ne more povezati z napako "BGP Error"… "V grozi vrnjeno nazaj" (c) na 5.4; prehod na 5.6 je bil prestavljen v TODO.

Zato sem poleg namestitve usmerjevalnika in VPS dodal monitoring (na x86 Ubuntu 18.04), ki je nameščen na ločenem gostitelju z naslednjimi komponentami:

  • prometheus, alertmanager, blackbox_exporter - vse v dockerju
  • opozorila so poslana na kanal telegram z uporabo bota metalmatze/alertmanager-bot - tudi v dockerju
  • tor za bota, tako da lahko bot opozori situacije, ko je internet na voljo, vendar telegram še vedno ne deluje in se bot sam ne more povezati
  • uporablja opozorila: NodeVPNTroubles (brez pinga do VPS), BirdVPNTroubles (ni Bird seje), AntifilterDownloadTroubles (ni uspelo naložiti blokiranih naslovov IP), SiteTroubles (nesrečen telegram ni na voljo)
  • sistemska opozorila, kot je HostGrowingDiskReadLatency (poceni kartica SD se preneha brati)

Primer nastavitve spremljanja:

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

Samodejno odkrivanje za prometheus je nastavljeno na mapo /etc/prometheus/auto_http, kar je primer dodajanja gostitelja v nadzor (gostitelji niso privzeto nadzorovani):

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

OPRAVILO: 2 ponudnika, 2 BPI-ja, preklop po poljubni oddaji

Poleg vsega sem načrtoval povezavo z dvema ponudnikoma, da bi internet deloval naprej, tudi če bi imel en ponudnik težave z omrežjem, ali bi pozabil plačati internet itd., ter drugi človeški faktorji.

Opisana je najnaprednejša uporabniška izkušnja na temo multi-wan tukaj za sistem Mwan3 pod Openwrt. Ta rešitev ima bogato funkcionalnost, vendar je nastavitev in delovanje na splošno za multi-wan precej težavno. Samo en primer: če pridete na nekatera spletna mesta z dveh naslovov IP hkrati, potem jim to morda ne bo všeč, prenehale bodo delovati => "internet ne deluje."

Glede na to izkušnjo sem se odločil, da multihoming še ni prioriteta, ampak samo failover. Čeprav se zdi, da bi moralo v najnovejših različicah linuxa vse delovati z enim ukazom, kot je:

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

Torej, da ni ene same točke napake, vzamemo 2 BPI-ja, vsakega povežemo z enim ponudnikom, ju povežemo skupaj in vzpostavimo medsebojno komunikacijo z dinamičnim usmerjanjem prek bird / OSPF.

Nadalje na vsakem objavimo isti naslov IP, če je storitev na voljo (internet, DNS). To pomeni, da privzete poti ne bomo določili sami, ampak prek ptice. Rešitev vohunila tukaj .

Ta funkcionalnost še ni implementirana, zahrbten koronavirus je zamočil (ni prišlo vse iz aliexpressa; druga spletna trgovina Layta je obljubila dobavo v enem tednu, minil pa je že več kot mesec dni; drugemu ponudniku ni uspelo raztegniti kabel pred karanteno, uspel le narediti luknjo v steni, da bi izvrtal kabel).

Kako naročiti R64

Sama plošča v uradni trgovini SinoVoip.
Prav tako je bolje naročiti takoj:

  • hrana + obveščajte standard vtiča EU ali ZDA
  • toplotno telo: radiatorji/ventilatorji; ker se segrejeta tako CPU kot stikalni čip
  • wifi antena, na primer

Obstaja odtenek - cena dostave je v uradni trgovini nekaj časa postala neustrezno visoka. Vodja Judy Huang mi je zagotovila, da ni pomote, in da lahko izberete ePacket za 5 $, vendar sem videl, da je za Rusijo samo EMS za >33 $. Neprijetno, a ne kritično. Poleg tega, če izberete katero koli drugo državo za dostavo (šel sem skozi vse celine), bo dostava stala ~5$. Rusofobi?.. Potem pa sem ugotovil, da je tudi za Francijo cena dostave ~30$, in se pomiril.

Posledično je Judy ponudila, da odda naročilo, vendar ne plača (namig: dajte manj na kartico, da plačilo ne poteka samodejno); piši ji pa ti bo znižala ceno pošiljanja na običajno. Uspeh.

Vprašanja

Vse še ne deluje popolno.

Produktivnost

Ansible=ukazi Python se izvajajo počasi, tudi tisti v mirovanju, 20-30 sekund; red velikosti dlje kot pri prenosniku x86. Poleg tega se sprva izvajajo precej hitro, ~ 3 sekunde, nato pa se močno upočasnijo. Morda je to posledica segrevanja procesorja (dušenje). Koda Go je tudi dolgotrajna:

# запрос метрик для прометея из 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 deluje, vendar se na Armbianu ustavi po približno enem dnevu, 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 ponovni zagon pomaga. Moramo iti dlje urediti.

Ethernet

Ethernet deluje, vendar po ~ enem dnevu paketi (DHCP) iz R64 prenehajo prihajati.
Ponovni zagon vmesnika pomaga:

ifdown br0; sleep 30; ifup br0

Driver je nov, jedro še ni bilo sprejeto, upam, da kitajski Landen Chao končati.

Vir: www.habr.com

Dodaj komentar