Marshrutizaator Banana Pi R64 — Debian, Wireguard, RKN

Banana Pi 64 on üheplaatiline arvuti, mis sarnaneb Raspberry Pi'ga, kuid sisaldab mitmeid Etherneti porte, võimaldades luua selle baasil marsruuteri, kasutades tavalise Linuxi distributsiooni.

Marshrutizaator Banana Pi R64 — Debian, Wireguard, RKN

Jah, OpenWRT on juba olemas, kuid sellel on oma eripärad, sealhulgas GUI ja CLI; on olemas ka Mikrotik, kuid seal on samuti oma GUI/CLI ning WireGuard ei tööta kohe ... Ühesõnaga, soov on saada marsruuter paindlike seadistustega, jäädes samal ajal standardse Linuxi piiridesse, millega iga päev tööd teen.

Artiklis nimede BPI, R64, ja üheplaatilise arvuti all mõistan ma ühte ja sama — nimelt Banana Pi R64 üheplaatilist arvutit.

Pildi valimine. Laadimine eMMC kaudu

Esimene oskus, mida tuleb omandada R64-ga töötades, on osata laadida sinna operatsioonisüsteemi ja suuta sellega suhelda, eriti kuna R64-l puudub monitori (HDMI) port. Kui kõik justkui kokku kukub — Wifi, Ethernet, Bluetooth, USB ei tööta enam, on olemas UART, mille kaudu saab alati vaadata, mis valesti läks, ja vajadusel käivitada paar käsku konsoolist. SBC вообще, и с R64 в частности, это научиться грузить в него операционку и иметь возможность взаимодействовать с ним, ведь у R64 нет порта для монитора (HDMI, например). Когда все отвалилось — перестал работать Wifi, сеть Ethernet, Bluetooth, USB и прочее есть UART, через интерфейс которого всегда можно посмотреть, что пошло не так, а также запустить пару команд из консоли, по необходимости.

Ühendamise algoritm R64-ga USB-UART kaudu:

  • kiirustame raadioosade poodi USB-UART kaabli (PL2303, Serial-to-USB) järele
  • ühendame ühe USB-otsa arvutiga ja teise, UART, R64-ga, kasutades kolme juhet neljast, nagu alloleval pildil
  • arvuti konsoolis käivitame sudo minicom

Enamikul juhtudel ilmub pärast seda ühekiibiga arvuti konsool = edu.
Lisainfot saab vaadata siit.

Marshrutizaator Banana Pi R64 — Debian, Wireguard, RKN

Edasi, kõige lihtsam on operatsioonisüsteemi laadimine SD-kaardilt: laadime alla lingi kaudu pildi ja kirjutame selle:

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-slotisse, lülitame sisse, jälgime ühendatud konsoolist algul uboot'i laadimist, seejärel standardset Linuxi laadimist.

Alternatiivne laadimisvariant — juba R64-sse sisseehitatud 8Gb suurune kaardi, mida nimetatakse eMMC, abil. Järgime wiki juhiseid, et kirjutada pilt seadmesse
/dev/mmcblk0 в BPI, перегружаемся, вытаскиваем SD-карту, включаем BPI снова… и не работает. Как туда-сюда Boot select ära tõmba.

Asi on selles, et vähemalt BPI puhul tuleb seestpoolt laadimist võimaldava spetsiaalse lipu seadmiseks seada.

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]

Seejärel tuleb spetsiaalsesse boot-jaotusse kirjutada preloader.

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) avaldas selle binaari. siit. Mida see teeb, pole teada (allikaid pole), kuid ilma selleta samuti ei tööta.

Tegelikult hakkavad pärast seda pildid laadima ka eMMC-st. Kui aga soovi on aru saada ja pilte nullist luua, tuleb mõlema juhtumi (SD/eMMC) puhul üles kirjutada veel mõned failid (preloader SD-kaardi jaoks, ATF, u-boot), et jõuda kärude laadimiseni. See teema on endiselt arendatakse, kuid meie jaoks on oluline, et see töötab ja ongi kõik.

Praegu ei kasuta ma tõtt-öelda eMMC laadimist, SD-kaardid on piisavad, kuid ma kulutasin sellele piisavalt aega, et see toimima saada, seega las see olla artiklis.

Operatsioonisüsteemi valik. Armbian

Esimene praktiline ülesanne on VPN-i käivitamine, loomulikult Wireguard. Koheselt selgus, et tuuma jaoks ei ole see kokku pandud ja pealkirjad puuduvad. Taaskoostasin tuuma ja, vanadest harjumustest x86-ga, koostasin tuumamooduli läbi DKMS. Siiski üllatas mind arm64-l väikeste utiliitide koostamise kiirus negatiivselt. Edasi vajas veel üks tuumamoodul jne. Kokkuvõttes tundub, et kõik, mis on seotud tuumaga, on parem koguda soojas, vana kooli x86 sülearvutis ning pärast lihtsalt kopeerida R64-le, taaskäivitada ja testida.

Teine teema on userspace'i osa. Minu juhtumi puhul Debiani valimisel on kõik arm64 arhitektuurile juba olemas packages.debian.org-is ja midagi ei pea taaskoguma.

Et mitte luua uut jalgratast, ma portinud Armbian BPI R64-l.
Parem nii: userspace'i osa on Armbian ja tuum võetakse Frank'i hoidlast. Frank-ilt. Kõige värskema pildi saab alla laadida siit.

Kogu R64 tarkvara arendustegevus toimub foorumil. Üldiselt püüab tootja populaarsustada ruuteri kasutamist OpenWrt all, aga tänu Saksamaa arendaja Frank'i aktiivsusele satuvad kõik funktsioonid kiiresti Debiani tuuma.

Tööruumi korraldamine: kaablid

Soovin eraldi rääkida, kuidas arendamise/testimise ajal asetada SBC (mitte ainult BPI) lauale nii, et ei peaks tõmbama Ethernet-kaablit interneti allikast kogu toa/kontori kaudu. Asi on selles, et ühelt poolt tuleb seadmele tagada internetiühendus, samas võib selle seadme kasutamisel esineda tõrkeid, sealhulgas WiFi.

Alguses otsustasin osta odava USB-Wifi "mütsi", ühendasin selle BPI ainus porti ja unustasin kaablid. Selleks ostsin odava TP-LINK TL-WN725N USB 2.0, kuid väga kiiresti sai selgeks, et see ei tööta: mütsi jaoks on vajalik tuumadraiver, mida seal loomulikult ei olnud (hiljem kogusin vajaliku RTL8XXXU draiveri, kuid see polnud ikkagi praktiline). Ja Ethernet-kaabel rikkus toa ilmet mõnda aega.

Kokkuvõttes suutsin kaablitest lahti saada Tenda MW3 (Wifi mesh-süsteemi) abil: lihtsalt paigutasin ühe kuubiku laua alla ja ühendasin BPI viimase LAN-porti ühe meetri Ethernet-kaabli abil. Edu.

Wireguard, RKN, Bird

Üks põhjus, miks ma kasutan Banana PI-d, on soov omada vabalt juurdepääsu RKN-i blokeeritud veebisaitidele, sealhulgas Telegrami ja Slacki kõnedele. Sellel teemal on juba kirjutatud artikleid Habris: kord, kaks, kolm.

Selle lahenduse juurutamine toimus Ansible'i abil: link.

Eeldatakse, et VPS töötab Ubuntu 18.04 all. Töötavust olen kontrollinud kahe Euroopa hosti peal: Amazon ja Digital Ocean.

Nii et me installisime ülalnimetatud Armbiani R64-le, see on kergesti juurdepääsetav ssh kaudu nime all hm-bananapi-1 ja on ühendatud internetiga. Ükshaaval juurutame ansible'i, automatiseerimisprogrammid ja käivitame installatsiooni otse R64-le:

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

Seejärel tuleb sarnaselt juurutada meie VPN VPS-le:

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

Siin on argument alati current-vpn, samas kui VPS nimi seadistatakse muutuja kaudu (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

Ahjaa, enne kõiki neid toiminguid tuleb genereerida saladused (sealhulgas Wireguardi võtmed) kausta ./secrets, kataloog peaks välja nägema nii.

Automatiseerimine Ansible'i abil Pythonis

On võib märgata, et Ansible'i käsud on kooditud Pythonis YAML formaadi asemel. Näiteks, kuidas tavaliselt käivitada bird deemonit:

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

ja kuidas teha sama läbi Python:

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

Ansible'i käskude kirjutamine Python koodina võimaldab koodi uuesti kasutada ning avab kõik sihtkeele võimalused. Näiteks, bird installimine R64 ja VPS:

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

vaata funktsiooni koodi install_bird().

Seda funktsiooni nimetatakse pybook on rakendatud siit. Dokumentatsiooni pybooki kohta ei ole veel, hiljem parandan selle puuduse.

Mida arvab upstream sellega seoses.

Monitooring. Prometheus

Kokkuvõttes: telegram töötab, linkedin ja pornhub ka, üldiselt on kasutajakogemus — okei. Aga kõik võib katki minna, ja Hiina seadmed samuti.

Kernel'i suurendamine võib samuti huvitav olla: näiteks soovisin viia kernel versioonist 5.4 versioonini 5.6, noh, seal on ju Wireguard vaikimisi olemas, ei pea lappe tegema... Öeldud-tehtud: hoolikalt kandsin lapid üle 5.4-lt 5.6-le, kernel hakkas tööle, tunnel VPS-ini pingsub, kuid bird ei suuda ühendust luua vea "BGP Error" tõttu... "Kohutavalt tagurdasin tagasi" (c) 5.4-le; liikumine 5.6-le jäi TODO-listi.

Seetõttu lisasin koos ruuteri ja VPS-i installeerimisega ka jälgimise (x86 Ubuntu 18.04-l), mis paigaldatakse eraldi hostile järgmiste komponentidega:

  • prometheus, alertmanager, blackbox_exporter — kõik Dockeris
  • alertid suunatakse Telegrami kanalisse metallmatze/alertmanager-boti abil — samuti Dockeris
  • Tor botile, et bot saaks teavitada olukordadest, kus Internet on olemas, kuid Telegram ei tööta ning bot ise ei saa ühendust luua
  • rakenduslikud teavitused: NodeVPNTroubles (pole ping'i VPS-ini), BirdVPNTroubles (pole Bird sessioon), AntifilterDownloadTroubles (vead blokeeritud IP-aadresside allalaadimisel), SiteTroubles (probleemne Telegram ei ole saadaval)
  • süsteemi teavitused, näiteks HostGrowingDiskReadLatency (odav SD-kaart lõpetab lugemise)

Näide jälgimise seadistamisest:

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

Auto Discovery prometea on seadistus kaustas /etc/prometheus/auto_http, näide hosti lisamisest jälgimise alla (vaikimisi hoste 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

TODO: 2 teenusepakkujat, 2 BPI, anycast failover

Lisaks olen kavandanud ühendust kahe teenusepakkujaga, et internet jätkuks, isegi kui ühel teenusepakkujal on võrguprobleeme või on unustatud interneti eest maksta jne, ning muud inimfaktorid.

Kõige arenenum kasutajakogemus multi-wan teemal on kirjeldatud siit Openwrt`i Mwan3 süsteemile. Sellel lahendusel on rikkalik funktsionaalsus, kuid seadistamine ja kasutamine on multi-wan puhul üsna vaevarikkad. Ainult üks näide: kui pääsete mõnedele veebilehtedele kohe kahest IP-aadressist, ei pruugi see neile meeldida, nad lakkavad töötamast => "internet ei tööta."

Tuginedes sellele kogemusele, otsustasin, et multihoming ei ole hetkel prioriteediks, ainult failover. Kuigi tundub, et Linuxi viimasetes versioonides peaks kõik töötama ühe käsu abil:

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

Nii et vältida ühte tõrkepunkti, võtame 2 BPI, ühendame igaühe ühe teenusepakkujaga, ühendame need omavahel ja teeme nende vahelise ühenduse dünaamiliseks marsruutimise kaudu bird/OSPF.

Edasi, kuulutame igal pool sama IP-aadressi välja, kui teenus on saadaval (internetti, DNS). See tähendab, et marsruudi seadistame mitte käsitsi, vaid birdi kaudu. Lahendust vaatasin. siit .

Seda funktsionaalsust pole veel realiseeritud, salakaval koroonaviirus segas ka siin asju (kõik ei jõudnud aliexpressist; veel üks internetipood, Layta, lubas nädalaga kohale toimetada, aga nüüd on juba rohkem kui kuu möödas; teine teenusepakkuja ei suutnud enne karantiini kaablit vedada, jõudis vaid seina auk seadistada).

Kuidas tellida R64

Ise plaat ametlikust poest SinoVoip.
Samuti on parem kohe tellida:

  • toide + teatage EL või USA pistiku standardist
  • jahutus: radiaatorid/ventilaatorid; sest CPU kuumeneb ja ka switch-i chip
  • wifi antenn, näiteks

On üks nüanss — päeva jooksul on ametlikus poes kohaletoimetamise hind muutunud ebanormaalselt kõrgeks. Juhataja Judy Huang veenis mind, et viga ei ole ja saame valida ePacket 5 dollari eest, kuid ma nägin, et Venemaale on saadaval ainult EMS rohkem kui 33 dollarit. Ebameeldiv, kuid mitte kriitiline. Tõsi, kui valida mingi muu riik kohaletoimetamiseks (proovisin kõiki kontinente), siis on kohaletoimetamine umbes 5 dollarit. Russophobiad?.. Kuid hiljem avastasin, et Prantsusmaal on kohaletoimetamise hind samuti umbes 30 dollarit ja rahunesin maha.

Kokkuvõttes pakkus Judy tellimuse esitamist, kuid mitte maksma (hint: laadida kaardile vähem, et automaatne makse ei läheks läbi); kirjutada talle ja ta vähendab kohaletoimetamise hinda normaalsele tasemele. Edu.

Probleemid

Kaugel pole kõik veel ideaalne.

Tootlikkus

Ansible=Python käsud täidetakse aeglaselt, isegi tühjad, 20-30 sekundit; oluliselt kauem kui x86 sülearvutis. Alguses täidetakse piisavalt kiiresti, umbes 3 sekundit, seejärel aeglustuvad järsult. Võib-olla juhtub see ülekuumeneva CPU tõttu (throttling). Go kood töötab samuti kaua:

# запрос метрик для прометея из 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 Armbian'is lõpetab see kuskil päeva jooksul töö ja ütleb:

sa@bananapir64:~$ dmesg | grep -E 'mt7622_wmac.*timeout'
[470303.802539] mt7622_wmac 18000000.wmac: Sõnum 38 (seq 3) aegumisega
[470314.042508] mt7622_wmac 18000000.wmac: Sõnum 50 (seq 4) aegumisega
...

Ainult taaskäivitamine aitab. Peame edasi uurima.

Ethernet

Ethernet töötab, kuid umbes ~päeva pärast lakkavad R64-st pakettide (DHCP) saabumine.
Interfääsi taaskäivitamine aitab:

ifdown br0; sleep 30; ifup br0

Juhtimisseade on uus, tuuma pole veel vastu võetud, loodan, et hiinlane Landen Chao saab valmis.

Allikas: habr.com

Osta usaldusväärne veebihosting DDoS kaitsega, VPS VDS serverid 🔥 Osta usaldusväärne veebihosting DDoS kaitsega, VPS VDS serverid | ProHoster