Ruuter Banana Pi R64 — Debian, Wireguard, RKN

Banana Pi 64 on üheplatvormne arvuti, mis sarnaneb Raspberry Pi-le, kuid millel on mitu Etherneti porti, võimaldades luua sellest marsruuteri üldotstarbelise Linuх'i jaotuse põhjal.

Ruuter Banana Pi R64 — Debian, Wireguard, RKN

Jah, OpenWrt on juba saadaval, kuid sellel on oma eripärad – oma GUI ja CLI; on olemas Mikrotik, kuid sellel on jälle oma GUI/CLI, ja Wireguard ei tööta kohe välja… Ühesõnaga, soovin marsruuteri, millel on paindlikud seadistused, jäädes samas tavalise Linuxi piiridesse, millega iga päev töötan.

Mõisted BPI, R64 ja üheplatvormne viitavad samale asjale – nimelt Banana Pi R64-le.

Pildi valimine. Laadimine eMMC kaudu.

Esimene oskus, mida tuleb omandada R64-ga töötades, on oskus operatsioonisüsteemi üles laadida ja sellega suhelda, kuna R64-l puudub monitori port (näiteks HDMI). Kui kõik peatub – Wifi, Ethernet, Bluetooth, USB ja muud ei tööta, on olemas UART, mille kaudu saab alati vaadata, mis valesti läks, ja vajadusel käivitada paar käsku konsoolis. SBC Juhised R64-le USB-UART kaudu ühendamiseks:

kiiresti poodi raadiokomponente USB-UART kaabli järele (PL2303, Serial-to-USB)

  • ühenda üks USB-ots arvutiga ja teine, UART, R64-ga, kolme juhtmega neljast, nagu pildil allpool.
  • konsoolis käivitame
  • sudo minicom Pärast seda ilmub enamasti üheplatvormi konsool = edu.

Rohkem teavet saab vaadata
Edasi, kõige lihtsam on laadida operatsioonisüsteem SD-kaardilt: allalaadime siin.

Ruuter Banana Pi R64 — Debian, Wireguard, RKN

pildi ja laadime selle: lingil 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

sisesta kaart R64 SD-pessa, lülita sisse ja jälgi ühendatud konsoolist esmalt uboot'i, seejärel standardset Linuxi laadimist.

Alternatiivne laadimisvõimalus – juba R64-sse ehitatud 8Gb mälukaardi, mida nimetatakse eMMC, abil. Juhiste kohaselt kirjuta pilt seadmele

Boot valik
/dev/mmcblk0 в BPI, перегружаемся, вытаскиваем SD-карту, включаем BPI снова… и не работает. Как туда-сюда Ärge tõmmake. Asi on selles, et vähemalt BPI jaoks tuleb seadistada spetsiaalne lipp, et saaks korralikult käivitada sisemiselt mälult:

root@bpi-r64:~# .\/mmc extcsd read \/dev\/mmcblk1 | grep 'PARTITION_CONFIG'\nBoot configuration bytes [PARTITION_CONFIG: 0x00]\nroot@bpi-r64:~# .\/mmc bootpart enable 1 1 \/dev\/mmcblk1\nroot@bpi-r64:~# .\/mmc extcsd read \/dev\/mmcblk1 | grep 'PARTITION_CONFIG'\nBoot configuration bytes [PARTITION_CONFIG: 0x48]

Järgmine samm on kirjutada eellaadija boot-sektori.

Järgmine peate kirjutama eellaadija spetsiaalsesse boot-segmenti.

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) on avaldanud selle binaari siin. Mida see teeb, pole teada (allikaid pole), kuid ilma selleta ei saa see samuti tööle.

Ühesõnaga, pärast seda hakkavad pildid laadima ka eMMC-st. Kui aga soovida süveneda ja luua pilte nullist, siis mõlema juhtumi (SD/eMMC) jaoks tuleb salvestada veel mõned failid (preloader SD-kaardile, ATF, u-boot), et jõuda juba kernelini. See teema on endiselt areneb, kuid meie jaoks on peamine, et see töötab ja on kõik.

Praegu ma eMMC kaudu käivitamist ausalt öeldes ei kasuta, SD-kaardid on piisavad, aga ma olen kulutanud sellele, et see tööle hakkaks, seega las jääb artiklisse.

Operatsioonisüsteemi valik. Armbian

Esimene praktiline ülesanne — käivitada VPN, loomulikult Wireguard. Koheselt selgus, et tuuma poolelt ei ole see kokku pandud ja pea ei ole. Taaskompileerisin tuuma ja, nagu x86 puhul, panin tuumamooduli kokku DKMS-i abil. Siiski valmistus mind üllatama arm64 väikeste utiliitide kokkupaneku kiirus. Edasi tuli veel üks tuumamoodul, jne. Ühesõnaga, välja tuleb, et kõik, mis puututab tuuma, on parem kokku panna soojal-lampal x86 sülearvutis, seejärel lihtsalt kopeerida R64-le, taaskäivitada ja testida.

Teine asi on userspace'i osa. Minu puhul, valides Debian, on kõik arm64 arhitektuuri jaoks juba olemas packages.debian.org ja midagi pole vaja uuesti kokku panna.

Kuna ma ei soovi luua uut jalgratast, siis portinud Armbian BPI R64-l.
Tõigemini nii: userspace'i osa — Armbian, ja tuum saadakse Franki repolt -st. Kõige värskem pilt on saadaval allalaadimiseksKogu R64 tarkvaraarenduse aktiivsus toimub siin.

. Üldiselt püüab tootja populariseerida ruuteri Openwrt all, kuid tänu Saksamaa arendaja Franki aktiivsusele jõuavad kõik funktsioonid kiiresti Debian'i tuuma. Üllatav, kuid Frank on aktiivne igas foorumi haru. foorumisTöökeskkonna korraldamine: kaablid

Eraldi tahan rääkida, kuidas arendamise/testimise käigus paigutada SBC (mitte ainult BPI) laua peale nii, et ei peaks Interneti allikast kogu toa/ruumi kaudu Ethernet-kaabli tõmbama. Asi on selles, et ühelt poolt tuleb seadmele internetti tagada, samas aga võib selles samas seadmes kõik katki minna ja eelkõige Wifi.

Отдельно хочу рассказать, как во время разработки/тестирования разместить SBC (не только BPI) на столе так, чтоб не вести Ethernet-кабель к нему от источника интернета через всю комнату/офис. Дело в том, что с одной стороны нужно обеспечить железке интернет, а с другой стороны в этой самой железке может все ломаться, и в первую очередь Wifi.

Esialgu otsustasin osta odava USB-Wifi "pingviini", ühendada see BPI ainusesse porti ja unustada kaablid. Selleks ostsin odava TP-LINK TL-WN725N USB 2.0, kuid varsti selgus, et see ei tööta: pingviini jaoks oli vajalik tuuma draiver, mida seal loomulikult ei olnud (hiljem kogusin vajaliku RTL8XXXU draiveri, kuid siiski ei olnud see praktiline). Ja Etherneti kaabel rikkus toa välimust mõneks ajaks.

Lõpuks sain kaablitest lahti Tenda MW3 (Wifi mesh-süsteem) abil: lihtsalt paigaldasin ühe kuubiku laua alla ja meetrise Etherneti kaabliga ühendasin BPI viimase LAN-porti. Edu.

Wireguard, RKN, Bird

Üks minu soove selle Banana PI kasutamise jaoks on saada vaba ligipääs RKN-i blokeeritud saitidele, eelkõige, et Telegram ja Slack kõned töötaksid. Sellel teemal on juba kirjutatud artikleid Habr-s: üks, kaks, kolmest.

Selle konkreetse lahenduse rakendamise tegin Ansible'i abil: link.

Eeldatakse, et VPS töötab Ubuntu 18.04 all. Tõestasin toimivust kahel Euroopa hostimisplatvormil: Amazon ja Digital Ocean.

Nii et installisime ülaltoodud Armbiani R64-le, see on saadaval ssh all nimega hm-bananapi-1 ja on internetti ühendatud. Järk-järgult rakendame ansible, automatiseerimis skripte ja käivitame installatsiooni R64-l:

# зависимости для 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 VPS-is meie VPN-i deployida:

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

Siin on argument alati current-vpn, kuid 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 neid toiminguid tuleb genererida saladused (eriti Wireguardi võtmed) kausta .\/secrets, kataloog peaks välja nägema nii.

Ansible automatiseerimine Pythonis

Võib märkida, et YAML formaadi asemel on Ansible'i käsud kodeeritud Python skriptidesse. Võrdluseks, kuidas tavapärasel viisil käivitada bird deemon:

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

ja kuidas sama asi Pythonis:

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

Ansible'i käskude salvestamine Python koodina võimaldab koodi uuesti kasutada ja avab kindlasti kõik üldotstarbelise keele võimalused. Näiteks birdi installimine R64 ja VPS:

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

vaata funktsiooni koodi install_bird().

See funktsioon, mille nimi on pybook rakendatud siinDokumentatsiooni pybooki kohta pole veel, hiljem parandatakse see puudus.

Mida arvab upstream selle kohta.

Monitooring. Prometheus

Kokkuvõtteks: telegramm töötab, linkedin ja pornhub ka, üldiselt kasutajakogemus – okei. Aga kõik võib katki minna ja Hiina riistvara ka.

Kernete värskendused on ka huvitavad: näiteks tahtsin värskendada kernet 5.4 => 5.6, noh, seal on ju Wireguard kasti sees, ei pea patchima… Öeldud-tehtud: hoolikalt kandsin patchid 5.4 pealt 5.6 peale, kerned käivitusid, tunnel VPS-ni pingitakse, aga bird ei saa ühendust veaga "BGP Error"… "Hirmuga tagasilangemine" (c) 5.4-le; üleminek 5.6-le lükatud TODO-sse.

Seetõttu lisasin roteri ja VPS-i paigaldamisele monitooringu (x86 Ubuntu 18.04 peal), mis installitakse eraldi hostile järgmiste komponentidega:

  • prometheus, alertmanager, blackbox_exporter – kõik dockeris
  • alerte saadetakse telegrammikanalisse botiga metalmatze/alertmanager-bot – samuti dockeris
  • tor botile, et bot saaks teavitada olukordadest, kui internet on olemas, aga telegramm ei tööta ja bot ei saa ühendust
  • rakenduslikud alerte: NodeVPNTroubles (pole pingit VPS-iga), BirdVPNTroubles (pole Bird sessiooni), AntifilterDownloadTroubles (vea laadimine blokeeritud IP-aadressidega), SiteTroubles (karm телеграм не доступен)
  • süsteemi alerte, näiteks, HostGrowingDiskReadLatency (odav SD-kaart lõpetab lugemise)

Monitooringu installimise näide:

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

Prometheuse Auto Discovery on seadistatud katalooge /etc/prometheus/auto_http, näide hosti lisamisest monitooringusse (vaikimisi ei jälgita hoste):

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 pakkujat, 2 BPI, anycast failover

Kõigele lisaks plaanisin ühendada kaks teenusepakkujat, et internet jätkuks, isegi kui ühel pakkujal on võrguga probleeme, või kui on unustatud interneti eest maksta jne, ja muud inimfaktorid.

Kõige arenenum kasutajakogemus multi-wan teemal on kirjeldatud siin süsteemi Mwan3 all Openwrt. Selle lahenduse funktsionaalsus on rikkalik, kuid seadistamine ja kasutamine on multi-wan puhul üsna vaevaline. Ainult ühe näitena: kui minna mõnele veebilehele korraga kahest IP-aadressist, siis võib see neile mitte meeldida, nad lõpetavad töötamise => "internet ei tööta".

Arvestades seda kogemust, otsustasin, et multihoming ei ole hetkel prioriteet, vaid ainult failover. Kuigi tundub, et viimastes linuxi versioonides peaks kõik töötama ühe käsuga, nagu:

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

Nii et, et ei tekiks ühtegi tõrkepunkti, võtame kaks BPI-d, igaühe ühendame ühe teenusepakkujaga, need omavahel ühendame ja teeme dünaamilise marsruutimise bird/OSPF kaudu.

Edasi, anname igal juhul teada sama IP-aadressi juhul, kui teenus on saadaval (interneti, DNS). See tähendab, et me ei sea vaikimisi marsruuti ise, vaid teeme seda birdi kaudu. Lahendust vaatasin siin .

Seda funktsionaalsust pole ma veel rakendanud, salakaval koronaviirus segas asja (kõik ei jõudnud aliexpressist; teine internetipood, Layta, lubas ühe nädalaga kohale toimetada, aga nüüd on juba üle kuu aega möödas; teine teenusepakkuja ei jõudnud kaablit enne karantiini vedada, jõudis vaid seina augu puurida).

Kuidas tellida R64

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

  • toide + teata Euroopa või Ameerika Ühendriikide pistiku standardist
  • soojuse äravool: radiaatorid/ventilaatorid; sest nii CPU kui ka lüliti kiip kuumeneb
  • antenni wifi jaoks, näiteks

On üks nüanss — alates mingist ajast on ametlikus poes saatmiskulu muutunud ebamugavalt kõrgeks. Halduse töötaja Judy Huang kinnitas mulle, et viga pole, ja võin valida ePacketi $5 eest, kuid ma nägin, et Venemaale on saadaval ainult EMS >33$ eest. Ebameeldiv, aga mitte kriitiline. Lisaks, kui valida mis tahes muu riik (katsusin kõik kontinendid), on saatmine ~5$. Venemaa vastased?.. Aga siis leidsin, et ka Prantsusmaale on saatmiskulu umbes 30$, ja rahunesin.

Kokkuvõttes pakkus Judy tellimust teha, kuid mitte maksta (hint: laadida kaardile vähem, et automaatne makse ei läheks); kirjutage talle, ja ta alandab saatmiskulu normaalseks. Õnnestus.

Probleemid

Kaugel pole kõik veel ideaalne.

Tõhusus

Ansible=Python käsud kestavad aeglaselt, isegi tühjad, 20-30 sekundit; oluliselt kauem kui x86 sülearvutil. Esialgu saavad need päris kiiresti tehtud, ~3 sekundit, seejärel aeglustuvad järsult. Võib-olla juhtub see kuumeneva 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 Armbianis lakkab ta kuskil tunni jooksul toimimast, 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
...

A restart only helps. We need to investigate further to figure it out.

Ethernet

Ethernet works, but after about a day, the packets (DHCP) from R64 stop coming.
Restarting the interface helps:

ifdown br0; sleep 30; ifup br0

The driver is new, it hasn't been accepted into the kernel yet, I hope the Chinese developer Landen Chao will finalize it.

Allikas: habr.com

Osta usaldusväärne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid 🔥 Osta usaldusväärne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid | ProHoster