Banana Pi R64 ruuter – Debian, Wireguard, RKN

Banana Pi 64 on Raspberry Pi-ga sarnane ühe pardaarvuti, kuid mitme Etherneti pordiga, mis võimaldab muuta selle üldotstarbelisel Linuxi distributsioonil põhinevaks ruuteriks.

Banana Pi R64 ruuter – Debian, Wireguard, RKN

Jah, Openwrt on juba olemas, kuid sellel on oma probleemid, selle GUI ja CLI; Mikrotik on olemas, aga sellel on jällegi oma GUI/CLI ja Wireguard ei tööta karbist välja... Üldiselt tahaks paindlike seadistustega ruuterit, jäädes samas standardse Linuxi raamidesse, millega sa töötad iga päevaga.

Artiklis nimede BPI, R64, ühe plaadi all, pean silmas sama asja - Banana Pi R64 ühe plaadi enda.

Pildi valimine. Laadige alla eMMC kaudu

Kõige esimene oskus, millega töötades pead omandama SBC üldiselt ja eriti R64 puhul tähendab see õppimist, kuidas sellesse operatsioonisüsteem laadida ja sellega suhelda, sest R64-l pole monitori porti (näiteks HDMI). Kui kõik ära kukkus - lakkas töötamast Wifi,Ethernet,Bluetooth,USB jne.On olemas UART,mille liidese kaudu on alati näha mis valesti läks ja vajadusel ka paar käsku konsoolist käivitada.

Algoritm R64-ga ühendamiseks USB-UART-i kaudu:

  • jookseme raadioosade poodi USB-UART-kaabli (PL2303, Serial-to-USB) järele
  • ühendage üks USB-ots arvutiga ja teine, UART, R64-ga kolme juhtmega neljast, nagu alloleval pildil
  • käivitada arvutikonsoolis sudo minicom

Pärast seda ilmub enamikul juhtudel ühe tahvli konsool = edu.
Näete rohkem üksikasju siin.

Banana Pi R64 ruuter – Debian, Wireguard, RKN

Järgmiseks on lihtsaim viis laadida operatsioonisüsteem SD-kaardilt: laadige alla link pilt ja täitke see:

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

Sisestame kaardi R64 SD pessa, lülitame selle sisse ja jälgime ühendatud konsooli laadimist esmalt uboot, seejärel tavalist Linuxi laadimist.

Alternatiivne alglaadimisvõimalus on R64-sse juba sisseehitatud 8 GB kaardi kasutamine, mida nimetatakse eMMC-ks. Vastavalt vikis olevatele juhistele kopeerime pildi seadmesse
/dev/mmcblk0 BPI-ks, taaskäivitage, eemaldage SD-kaart, lülitage BPI uuesti sisse ... ja see ei tööta. Kuidas edasi-tagasi minna Boot select ära viitsi.

Fakt on see, et vähemalt BPI jaoks peate sisemiselt mälupulgalt käivitamiseks määrama spetsiaalse lipu:

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]

Järgmisena peate kirjutama eellaadija spetsiaalsesse alglaadimissektsiooni

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

Tootja R64 (Hiina) postitas selle kahendfaili siin. Mida see teeb, pole teada (lähtekoodid puuduvad), kuid see ei tööta ka ilma selleta.

Üldiselt hakkavad pärast seda pilte eMMC-st laadima. Kui soovite selle selgeks teha ja pilte nullist luua, peate mõlemal juhul (SD/eMMC) kirjutama veel mitu faili (SD-kaardi eellaadija, ATF, u-boot), et jõuda kerneli laadimiseni. See teema on alles areneb, aga meie jaoks on peaasi, et see toimib ja korras.

Nüüd laadin alla eMMC kaudu, ausalt öeldes ma ei kasuta seda, piisab SD-kaardist, kuid kulutasin selle tööle panemiseks üsna palju aega, nii et las see olla artiklis.

Operatsioonisüsteemi valimine. Armbia

Rakenduse esimene ülesanne on käivitada VPN, loomulikult Wireguard. Kohe avastati, et kerneli poolelt oli see kokku panemata ja päised puuduvad. Ehitasin kerneli ümber ja nagu mul x86 puhul kombeks on, panin kerneli mooduli DKMS-i kasutades kokku. Kuid isegi väikeste kommunaalteenuste ehitamise kiirus arm64-le üllatas mind ebameeldivalt. Ja siis oli vaja veel kerneli moodulit jne. Üldiselt selgub, et kõik kerneliga seonduv on kõige parem kokku panna soojale x86 sülearvutile, seejärel lihtsa kopeerimisega R64-le üle kanda, taaskäivitada ja testida.

Teine asi on kasutajaruumi osa. Minu puhul on Debiani valimisel kõik arm64 arhitektuuri jaoks juba saidil packages.debian.org ja pole vaja midagi ümber ehitada.

Et mitte toota teist jalgratast, I teisaldatud Armbia BPI R64 peal.
Õigemini see: kasutajaruumi osa on Armbian ja tuum on võetud hoidlast Avameelne-A. Uusima pildi saab alla laadida siin.

Kogu tegevus R64 tarkvaraosa arendamiseks toimub foorum. Üldiselt püüab tootja ise Openwrt ruuterit populariseerida, kuid tänu Saksamaa arendaja Franki tegevusele jõuavad kõik funktsioonid kiiresti Debiani tuumasse. Üllatuslikult on Frank aktiivne igas foorumi lõimes.

Tööruumi korraldus: juhtmed

Eraldi tahaksin teile rääkida, kuidas asetada arenduse/testimise ajal SBC (mitte ainult BPI) lauale, et mitte juhtida selleni Etherneti kaablit Interneti-allikast kogu ruumis/kontoris. Fakt on see, et ühest küljest peate varustama Internetiga riistvara, kuid teisest küljest võib kõik selles riistvaras rikki minna ja ennekõike Wifi.

Esiteks otsustasin osta odava USB-Wifi vile, ühendada selle BPI ainsasse porti ja unustada juhtmed. Selleks ostsin odava TP-LINK TL-WN725N USB 2.0, kuid üsna pea sai selgeks, et see ei tõuse: selleks, et vile töötaks, on vaja tuumadraiverit, mida seal muidugi polnud. (hiljem panin kokku vajaliku RTL8XXXU draiveri, kuid see on endiselt ebapraktiline ). Ja Etherneti kaabel rikkus korraks ruumi välimust.

Selle tulemusena õnnestus mul Tenda MW3 (Wifi mesh system) abil kaablist lahti saada: asetasin lihtsalt ühe kuubiku laua alla ja ühendasin BPI meetripikkuse Etherneti kaabliga viimase LAN-porti. Edu.

Traatkaitse, RKN, lind

Üks asi, mille jaoks Banana PI-d kasutada tahan, on tasuta juurdepääs RKN-i blokeeritud saitidele, et Telegrami ja Slacki kõned toimiksid. Sellel teemal on juba pakutud artikleid Habré kohta: aeg, два, kolm.

Ma juurutasin Ansible abil täpselt selle lahenduse: link.

Eeldatakse, et VPS töötab Ubuntu 18.04. Kontrollisin kahe Euroopa hosti funktsionaalsust: Amazon ja Digital Ocean.

Niisiis, installisime ülaltoodud Armbiani R64-le, see on nime all ssh kaudu juurdepääsetav hm-bananapi-1 ja sellel on Interneti-ühendus. Juurutame järjekindlalt Ansible automatiseerimisskripte ja käivitame installimise R64-s:

# зависимости для 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

Järgmiseks peate meie VPN-i VPS-i juurutama samal viisil:

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

Siin on argument alati current-vpn ja tegelik VPS-i nimi on konfigureeritud muutujas (antud juhul on see 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 jah, enne kõiki neid toiminguid peate genereerima kausta saladused (eriti Wireguardi võtmed) ./secrets, peaks kataloog välja nägema nii.

Võimalik automatiseerimine Pythonis

Võite märgata, et YAML-vormingus asemel on Ansible käsud kodeeritud Pythoni skriptides. Võrdluseks, kuidas lubada lindudeemon tavalisel viisil:

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

ja kuidas seda teha Pythoni kaudu:

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

Ansible käskude kirjutamine Pythonis võimaldab koodi uuesti kasutada ja avab üldiselt kõik üldotstarbelise keele võimalused. Näiteks linnu installimine R64-le ja VPS-ile:

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

vaadake funktsiooni koodi install_bird().

See funktsioon kutsus pybook rakendatud siin. Pybooki kohta pole veel dokumentatsiooni, kuid parandan selle probleemi hiljem.

Mida ta arvab vastuvoolu sellest.

Järelevalve. Prometheus

Kokku: telegramm töötab, linkedin ja pornhub ka, üldiselt on kasutuskogemus ok. Kuid kõik võib puruneda, sealhulgas Hiina riistvara.

Kerneli uuendused võivad samuti olla huvitavad: näiteks tahtsin uuendada kerneli 5.4 => 5.6, noh, Wireguard on karbist väljas, pole vaja lappida... Polegi varem öeldud: kandsin plaastrid vaevaga üle 5.4-st 5.6-le, kernel käivitus, VPS-i tunnel pingestati, kuid lind ei saa ühendust luua veaga "BGP Error" ... "Ma veeresin õudusega tagasi" (c) 5.4-le; Üleminek 5.6-le lükati TODO-s edasi.

Seetõttu lisasin lisaks ruuteri ja VPS-i installimisele ka jälgimise (x86 Ubuntu 18.04 puhul), mis on installitud eraldi hostile järgmiste komponentidega:

  • prometheus, alertmanager, blackbox_exporter – kõik dockeris
  • Hoiatused saadetakse telegrammi kanalile roboti metalmatze/alertmanager-bot abil – ka Dockeris
  • tor boti jaoks, et bot saaks hoiatada olukordadest, kui Internet on olemas, kuid Telegram ikka ei tööta ja bot ise ei saa ühendust luua
  • rakendatud hoiatused: NodeVPNTprobleemid (VPS-i ping puudub), BirdVPNTprobleemid (Birdi seanss puudub), Antifiltri allalaadimisprobleemid (tõrge blokeeritud IP-aadresside laadimisel), saidiprobleemid (õnnetu telegramm pole saadaval)
  • süsteemihoiatused, näiteks HostGrowingDiskReadLatency (odav SD-kaart muutub loetamatuks)

Paigalduse jälgimise näide:

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

Prometheuse automaatne avastamine on konfigureeritud kaustas /etc/prometheus/auto_http, mis on näide hosti lisamisest jälgimisse (hoste vaikimisi ei jälgita):

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

ÜLESANNE: 2 pakkujat, 2 BPI, Anycasti tõrkesiirde

Lisaks kõigele plaanisin ühendada kahe pakkujaga, et internet töötaks edasi ka siis, kui ühel pakkujal oleks võrguga probleeme või unustati interneti eest maksta vms ja muud inimlikud tegurid.

Kirjeldatakse kõige arenenumat kasutajakogemust multi-wani teemal siin Mwan3 süsteemi jaoks Openwrt all. Sellel lahendusel on rikkalik funktsionaalsus, kuid selle seadistamine ja kasutamine üldiselt multi-wani jaoks on üsna tülikas. Üks näide: kui tulete mõnele saidile korraga kahelt IP-aadressilt, ei pruugi see neile meeldida, nad lakkavad töötamast => "Internet ei tööta."

Seda kogemust arvesse võttes otsustasin, et multihoming pole veel prioriteet, vaid ainult tõrkeotsing. Kuigi tundub, et Linuxi uusimates versioonides peaks kõik töötama ühe käsuga, näiteks:

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

Nii et ühe tõrkepunkti vältimiseks võtame 2 BPI-d, ühendame mõlemad ühe pakkujaga, ühendame need üksteisega ja loome üksteisega ühenduse linnu/OSPF-i kaudu dünaamilise marsruutimise teel.

Järgmisena reklaamime igaühel sama IP-aadressi, kui teenus on saadaval (Internet, DNS). See tähendab, et me ei määra vaikemarsruuti ise, vaid läbi linnu. Luurasin lahendust siin .

Seda funktsiooni pole veel juurutatud, salakaval koroonaviirus mängis siin triki (kõik ei jõudnud Aliexpressist; teine ​​veebipood Layta lubas kohale toimetada nädalaga, kuid möödas on üle kuu; teisel pakkujal polnud aega kaabli pikendamiseks enne karantiini, õnnestus ainult kaabli jaoks seina puurida auk).

Kuidas tellida R64

Tahvel ise on ametlikus poes SinoVoip.
Samuti on parem kohe tellida:

  • toit + teavitage EL või USA pistikustandardit
  • jahutusradiaator: radiaatorid/ventilaatorid; sest nii CPU kui ka lüliti kiip kuumenevad
  • wifi antenn, näiteks

Siin on nüanss - tarnehind on ametlikus poes juba mõnda aega ebaadekvaatselt kõrgeks läinud. Mänedžer Judy Huang veenis mind, et viga ei olnud ja ePacketi sai valida 5 dollari eest, kuid ma nägin, et Venemaal on ainult EMS, mille hind on >33 dollarit. Ebameeldiv, kuid mitte kriitiline. Veelgi enam, kui valite kohaletoimetamiseks mõne muu riigi (käisin kõik mandrid läbi), maksab kohaletoimetamine ~5 dollarit. Russofoobid?.. Siis aga leidsin, et Prantsusmaa jaoks on ka kohaletoimetamise hind ~30$ ja rahunesin maha.

Selle tulemusena pakkus Judy, et teeb tellimuse, kuid ei maksa (vihje: pane kaardile vähem, et automaatmakse läbi ei läheks); kirjuta talle ja ta langetab kohaletoimetamise hinna normaalseks. Edu.

Küsimused

Kõik ei tööta veel ideaalselt.

Производительность

Ansible=Pythoni käske täidetakse aeglaselt, isegi tühikäigul olevaid käske 20-30 sekundi jooksul; suurusjärgu võrra pikem kui x86 sülearvutil. Pealegi täidetakse neid alguses üsna kiiresti, ~3 sekundit, siis aeglustuvad järsult. Selle põhjuseks võib olla protsessori kuumenemine (drossel). Go-koodi toimimine võtab samuti kaua aega:

# запрос метрик для прометея из 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 töötab, kuid Armbianil peatub umbes päeva pärast, kirjutab:

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

Ainult restart aitab. Peame edasi liikuma Uuri välja.

Ethernet

Ethernet töötab, kuid ~64 tunni pärast ei tule RXNUMX paketid (DHCP) enam kohale.
Liidese taaskäivitamine aitab:

ifdown br0; sleep 30; ifup br0

Draiver on uus, seda pole veel kernelisse vastu võetud, loodan, et see on hiina Landen Chao lõpetab selle.

Allikas: www.habr.com

Lisa kommentaar