Banana Pi R64 maršrutizatorius – Debian, Wireguard, RKN

„Banana Pi 64“ yra vienos plokštės kompiuteris, panašus į „Raspberry Pi“, tačiau su keliais eterneto prievadais, todėl jis yra bendrosios paskirties „Linux“ platinimo maršrutizatorius.

Banana Pi R64 maršrutizatorius – Debian, Wireguard, RKN

Taip, Openwrt jau egzistuoja, bet turi savo GUI ir CLI; yra „Mikrotik“, bet vėlgi jis turi savo GUI / CLI, o „Wireguard“ neveikia... Apskritai aš noriu maršrutizatoriaus su lanksčiais nustatymais, o ne standartinio „Linux“, su kuriuo dirbate, rėmuose. kiekvieną dieną.

Straipsnyje pavadinimais BPI, R64, vienos plokštės, turėsiu omenyje tą patį - pačią Banana Pi R64 vienplokštę.

Vaizdo pasirinkimas. Atsisiųskite per eMMC

Pats pirmasis įgūdis, kurį reikia įgyti dirbant SBC apskritai, o ypač su R64, tai reiškia išmokti įkelti į ją OS ir mokėti su ja bendrauti, nes R64 neturi monitoriaus prievado (pvz., HDMI). Kai viskas atkrito - Wifi nustojo veikti, Ethernet tinklas, Bluetooth, USB ir tt yra UART, per kurio sąsają visada galite pamatyti, kas nutiko, taip pat, jei reikia, paleisti porą komandų iš konsolės.

Prijungimo prie R64 algoritmas per USB-UART:

  • eikite į radijo dalių parduotuvę, kad gautumėte USB-UART laido (PL2303, serijinis į USB)
  • vieną USB galą jungiame prie kompiuterio, o kitą, UART, prie R64 trimis iš keturių laidų, kaip paveikslėlyje žemiau
  • kompiuterio konsolėje sudo minicom

Po to daugeliu atvejų pasirodys vienos plokštės konsolė = sėkmė.
Galite pamatyti daugiau čia.

Banana Pi R64 maršrutizatorius – Debian, Wireguard, RKN

Tada paprasčiausias būdas yra įkelti operacinę sistemą iš SD kortelės: atsisiųskite iki nuoroda paveikslėlį ir įkelk:

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

Įdedame kortelę į R64 SD lizdą, įjungiame, pirmiausia stebime uboot įkėlimą prijungtoje konsolėje, tada standartinę Linux įkrovą.

Alternatyvi įkrovos parinktis yra naudoti 64 Gb kortelę, jau įdėtą į R8, vadinamą eMMC. Pagal wiki instrukcijas perrašome vaizdą į įrenginį
/dev/mmcblk0 į BPI, paleiskite iš naujo, išimkite SD kortelę, vėl įjunkite BPI... ir tai neveikia. Kaip ten patekti Boot select nesilaikyk.

Faktas yra tas, kad bent jau BPI turite nustatyti specialią vėliavėlę, kad galėtumėte paleisti iš vidinės „flash drive“:

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]

Tada į specialų įkrovos skaidinį turite įrašyti išankstinį įkroviklį

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

R64 gamintojas (Kinija) paskelbė šį dvejetainį failą čia. Ką jis daro, nežinoma (nėra šaltinio kodų), bet be jo tai taip pat neveiks.

Paprastai po to vaizdai pradedami įkelti iš eMMC. Jei norite tai išsiaiškinti ir kurti vaizdus nuo nulio, abiem atvejais (SD / eMMC) turite parašyti dar keletą failų (SD kortelės išankstinis įkroviklis, ATF, u-boot), kad patektumėte į branduolį. batas. Ši tema vis dar vystosi, bet mums svarbiausia, kad tai veiktų ir gerai.

Dabar, tiesą sakant, aš nenaudoju eMMC atsisiuntimo, užtenka SD kortelių, bet praleidau gana daug laiko, kad tai veiktų, todėl tebūnie tai straipsnyje.

Operacinės sistemos pasirinkimas. Armbian

Pirmoji programos užduotis yra paleisti VPN, žinoma, „Wireguard“. Iš karto paaiškėjo, kad jis surinktas ne iš branduolio pusės, o antraštės nebuvo. Aš perkūriau branduolį ir iš įpročio naudodamas x86 sukūriau branduolio modulį naudodamas DKMS. Tačiau net mažų komunalinių paslaugų surinkimo greitis ant arm64 mane nemaloniai nustebino. Ir tada reikėjo kito branduolio modulio ir pan. Apskritai paaiškėja, kad viską, kas susiję su branduoliu, geriau surinkti ant šilto vamzdžio x86 nešiojamojo kompiuterio, tada paprastai nukopijuoti perkelti į R64, paleisti iš naujo ir išbandyti.

Kitas dalykas yra vartotojo erdvės dalis. Pasirinkus Debianą, viskas, kas skirta arm64 architektūrai, jau yra packages.debian.org ir nereikia nieko kurti.

Kad nebūtų gaminamas kitas dviratis, I perkeltas Armbianas ant BPI R64.
Arba tiksliau: vartotojo erdvės dalis yra Armbian, o branduolys paimtas iš saugyklos Frankas-A. Naujausią vaizdą galima atsisiųsti čia.

Visa R64 programinės įrangos dalies kūrimo veikla vykdoma forumas. Paprastai kalbant, pats gamintojas siekia išpopuliarinti Openwrt maršrutizatorių, tačiau kūrėjo Frank iš Vokietijos aktyvumo dėka visos funkcijos greitai atsiduria Debian branduolyje. Keista, bet Frankas yra aktyvus kiekvienoje forumo temoje.

Darbo vietos organizavimas: laidai

Atskirai noriu pasakyti, kaip SBC (ne tik BPI) pastatyti ant stalo kūrimo / testavimo metu, kad Ethernet kabelis nenuvestų prie jo iš interneto šaltinio per visą kambarį / biurą. Faktas yra tas, kad, viena vertus, reikia aprūpinti internetą geležies gabale, kita vertus, šiame geležies gabale gali lūžti viskas, o ypač „Wifi“.

Pirmiausia nusprendžiau nusipirkti pigų USB-Wifi „švilpuką“, įkišti jį į vienintelį BPI prievadą ir pamiršti laidus. Norėdami tai padaryti, įsigijau nebrangų TP-LINK TL-WN725N USB 2.0, tačiau labai greitai tapo aišku, kad jis neišsivers: kad švilpukas veiktų, reikėjo branduolio tvarkyklės, kurios, žinoma, nebuvo. (vėliau sukompiliavau reikiamą RTL8XXXU tvarkyklę, bet ji vis tiek nepraktiška ). O eterneto laidas kuriam laikui sugadino kambario vaizdą.

Dėl to laido pavyko atsikratyti Tenda MW3 (Wifi mesh system) pagalba: vieną kubą tiesiog padėjau po stalu, o BPI prie pastarojo LAN prievado prijungiau matuokliu Ethernet laidu. Sėkmė.

Vielos apsauga, RKN, paukštis

Vienas iš dalykų, dėl kurių naudoju „Banana PI“, yra turėti laisvą prieigą prie svetainių, kurias blokuoja RKN, kad „Telegram“ ir skambučiai „Slack“ veiktų. Straipsniai šia tema jau buvo pasiūlyti Habré: laikas, два, trys.

Aš įdiegiau tik tokį sprendimą naudodamas Ansible: nuoroda.

VPS turėtų veikti Ubuntu 18.04. Patikrinau pasirodymą dviejuose prieglobos serveriuose Europoje: „Amazon“ ir „Digital Ocean“.

Taigi, mes įdiegėme aukščiau esantį Armbian R64, jis pasiekiamas per ssh pavadinimu hm-bananapi-1 ir turi interneto prieigą. Mes nuosekliai diegiame galimus automatizuotus scenarijus ir paleidžiame patį diegimą 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

Tada turite įdiegti mūsų VPN į VPS tokiu pačiu būdu:

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

Čia argumentas visada yra current-vpn, o pats VPS pavadinimas sukonfigūruotas kintamajame (šiuo atveju tai yra 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

O taip, prieš visas šias operacijas turite sugeneruoti paslaptis (ypač Wireguard raktus) aplanke ./secrets, katalogas turėtų atrodyti taip taip.

Galimas automatizavimas Python

Galite pastebėti, kad vietoj YAML formato Ansible komandos yra užkoduotos Python scenarijais. Palyginimui, kaip įjungti paukščių demoną įprastu būdu:

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

ir kaip tas pats per Python:

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

Ansible komandų rašymas su Python kodu leidžia pakartotinai panaudoti kodą, o apskritai visos bendrosios paskirties kalbos galimybės yra atviros. Pavyzdžiui, paukščio įdiegimas R64 ir VPS:

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

žr. funkcijos kodą install_bird().

Ši funkcija vadinama pybook įgyvendinta čia. Dar nėra pybook dokumentacijos, tada ištaisysiu šį defektą.

Ką jis galvoja prieš srovę šia proga.

Stebėjimas. Prometėjas

Iš viso: veikia telegrama, linkedin ir pornhub taip pat, apskritai, vartotojo patirtis yra gera. Bet viskas gali sulūžti, taip pat ir kiniški geležies gabalai.

Branduolio atnaujinimai taip pat gali būti įdomūs: pavyzdžiui, norėjau atnaujinti branduolį 5.4 => 5.6, na, Wireguard yra iš dėžutės, nereikia pataisyti... Negreičiau pasakyta: kruopščiai perkeltos pataisos iš 5.4 į 5.6, branduolys paleistas, tunelis į VPS įjungtas, bet paukštis negali prisijungti su klaida „BGP Error“… „Iš siaubo atsukta“ (c) į 5.4; TODO perkėlimas į 5.6 buvo atidėtas.

Todėl, be maršrutizatoriaus ir VPS įdiegimo, pridėjau stebėjimą (x86 Ubuntu 18.04), kuris yra įdiegtas atskirame pagrindiniame kompiuteryje su šiais komponentais:

  • prometheus, alertmanager, blackbox_exporter – viskas dockeryje
  • įspėjimai siunčiami į telegramos kanalą naudojant metalmatze/alertmanager-bot botą – taip pat ir dokeryje
  • tor botui, kad robotas galėtų įspėti apie situacijas, kai yra internetas, bet telegrama vis tiek neveikia, o pats robotas negali prisijungti
  • taikomos įspėjimai: „NodeVPNTroubles“ (be ping į VPS), „BirdVPNTroubles“ (nėra „Bird“ seanso), „AntifilterDownloadTroubles“ (nepavyko įkelti užblokuotų IP adresų), „SiteTroubles“ (gaila telegrama nepasiekiama)
  • sistemos įspėjimai, tokie kaip „HostGrowingDiskReadLatency“ (pigi SD kortelė nustoja skaityti)

Stebėjimo nustatymo pavyzdys:

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

„Prometheus“ automatinis atradimas nustatytas į aplanką /etc/prometheus/auto_http, pavyzdį, kaip pridėti prieglobą prie stebėjimo (pagal numatytuosius nustatymus prieglobos nėra stebimos):

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 teikėjai, 2 BPI, bet kokio perdavimo perjungimas

Be visko, planavau prisijungti prie dviejų tiekėjų, kad internetas veiktų ir toliau, net jei vienam tiekėjui kiltų problemų su tinklu, ar pamirštų susimokėti už internetą ir pan., ir kiti žmogiškieji faktoriai.

Aprašyta pažangiausia vartotojo patirtis kelių wanų tema čia Mwan3 sistemai pagal Openwrt. Šis sprendimas turi daug funkcijų, tačiau nustatyti ir bendrai naudoti daugiafunkcius įrenginius yra gana varginantis. Tik vienas pavyzdys: jei ateini į kai kurias svetaines iš dviejų IP adresų vienu metu, tai jiems gali nepatikti, nustos veikti => „internetas neveikia“.

Atsižvelgdamas į šią patirtį, nusprendžiau, kad daugiabučių namų naudojimas dar nėra prioritetas, o tik nesėkmingas. Nors atrodo, kad naujausiose „Linux“ versijose viskas turėtų veikti su viena komanda, pavyzdžiui:

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

Taigi, norėdami išvengti vieno gedimo taško, paimame 2 BPI, kiekvienas jungiamės prie vieno tiekėjo, sujungiame juos ir užmezgame ryšį vienas su kitu dinamiškai nukreiptą per bird / OSPF.

Be to, kiekviename skelbiame tą patį IP adresą, jei paslauga yra prieinama (internetas, DNS). Tai yra, numatytąjį maršrutą nustatysime ne patys, o per paukštį. Sprendimas šnipinėjo čia .

Šis funkcionalumas dar neįdiegtas, klastingas koronavirusas sujaukė (ne viskas atkeliavo iš aliexpress; kita internetinė parduotuvė „Layta“ žadėjo pristatyti per savaitę, o praėjo daugiau nei mėnuo; antrasis tiekėjas nespėjo ištempti kabelį prieš karantiną, pavyko tik sienoje padaryti skylę kabeliui išgręžti).

Kaip užsisakyti R64

Pati lenta oficialioje parduotuvėje SinoVoip.
Taip pat geriau iš karto užsisakyti:

  • maistas + informuoti ES arba JAV kištuko standartą
  • šilumos kriauklė: radiatoriai/ventiliatoriai; nes šildomas ir CPU, ir jungiklio lustas
  • wifi antena, pavyzdžiui

Yra niuansas - oficialioje parduotuvėje pristatymo kaina nuo kurio laiko tapo neadekvačiai didelė. Vadybininkė Judy Huang patikino, kad nebuvo jokios klaidos, o ePacket galima rinktis už 5$, bet pamačiau, kad Rusijai yra tik EMS už >33$. Nemalonu, bet ne kritiška. Be to, pasirinkus bet kurią kitą šalį pristatymui (važiavau per visus žemynus), pristatymas kainuos ~5$. Rusofobai?.. Bet tada radau, kad Prancūzijai pristatymo kaina irgi ~30$, ir nusiraminau.

Dėl to Judy pasiūlė pateikti užsakymą, bet nemokėti (daryti aliuziją: įdėti į kortelę mažiau, kad mokėjimas nepraeitų automatiškai); parašyk jai ir ji sumažins siuntimo kainą iki normalios. Sėkmė.

Klausimai

Dar ne viskas veikia idealiai.

Našumas

Ansible=Python komandos vykdomos lėtai, net ir tuščiosios eigos, 20-30 sekundžių; eilės tvarka ilgiau nei x86 nešiojamajame kompiuteryje. Be to, iš pradžių jie atliekami gana greitai, ~ 3 sekundes, paskui smarkiai sulėtėja. Galbūt taip yra dėl procesoriaus įkaitimo (droselio). „Go“ kodas taip pat veikia ilgai:

# запрос метрик для прометея из 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 veikia, bet sustoja Armbian maždaug po dienos, rašo:

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

Padeda tik iš naujo. Turime eiti toliau sutvarkyti.

"Ethernet"

Ethernet veikia, bet po ~ dienos nustoja ateiti paketai (DHCP) iš R64.
Sąsajos paleidimas iš naujo padeda:

ifdown br0; sleep 30; ifup br0

Vairuotojas naujas, branduolys dar nepriimtas, tikiuosi kiniškas Landen Chao baigti.

Šaltinis: www.habr.com

Добавить комментарий