Router Banana Pi R64 – Debian, Wireguard, RKN

Banana Pi 64 je jednodoskový počítač podobný Raspberry Pi, no s niekoľkými ethernetovými portami, čo umožňuje premeniť ho na router založený na všeobecnej distribúcii Linuxu.

Router Banana Pi R64 – Debian, Wireguard, RKN

Áno, Openwrt už existuje, ale má svoje vlastné problémy, svoje GUI a CLI; Je tam Mikrotik, ale zas ma svoje GUI/CLI a Wireguard nefunguje po vybaleni... Vo vseobecnosti chcem router s flexibilnym nastavenim, pricom ostanem v ramci standardneho linuxu, na ktorom pracujes s každým dňom.

V článku pod názvami BPI, R64, jednodoska budem mať na mysli to isté - samotná jednodoska Banana Pi R64.

Výber obrázka. Stiahnite si cez eMMC

Úplne prvá zručnosť, ktorú musíte získať pri práci SBC vo všeobecnosti a pri R64 zvlášť to znamená naučiť sa doň nahrať operačný systém a vedieť s ním interagovať, pretože R64 nemá port pre monitor (napríklad HDMI). Keď všetko spadlo - prestala fungovať Wifi, Ethernet, Bluetooth, USB atď.. Existuje UART, cez rozhranie ktorého môžete vždy vidieť, čo sa pokazilo, a v prípade potreby spustiť aj niekoľko príkazov z konzoly.

Algoritmus na pripojenie k R64 cez USB-UART:

  • bežíme do obchodu s rádiovými súčiastkami pre kábel USB-UART (PL2303, Serial-to-USB)
  • pripojte jeden koniec USB k počítaču a druhý, UART, k R64, pomocou troch káblov zo štyroch, ako na obrázku nižšie
  • spustiť v konzole počítača sudo minicom

Potom sa vo väčšine prípadov objaví jednodosková konzola = úspech.
Viac podrobností nájdete tu.

Router Banana Pi R64 – Debian, Wireguard, RKN

Ďalej, najjednoduchším spôsobom je načítať operačný systém z SD karty: stiahnuť do odkaz obrázok a vyplňte ho:

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

Vložíme kartu do slotu R64 SD, zapneme ju a pozorujeme, ako sa pripojená konzola načítava najskôr uboot, potom štandardne načítava Linux.

Alternatívnou možnosťou zavádzania je použitie 64Gb karty, ktorá je už zabudovaná v R8, nazývaná eMMC. Podľa návodu na wiki skopírujeme obrázok do zariadenia
/dev/mmcblk0 na BPI, reštartujte, vyberte SD kartu, znova zapnite BPI... a nefunguje to. Ako ísť tam a späť Boot select neobťažuj sa.

Faktom je, že aspoň pre BPI musíte nastaviť špeciálny príznak, aby ste mohli zaviesť systém z internej jednotky flash:

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]

Ďalej musíte napísať preloader do špeciálnej zavádzacej oblasti

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

Výrobca R64 (Čína) zverejnil tento binárny súbor tu. Čo robí, nie je známe (neexistujú žiadne zdrojové kódy), ale bez toho to nebude fungovať.

Vo všeobecnosti sa potom obrázky začnú načítavať z eMMC. Ak na to chcete prísť a vytvárať obrázky od začiatku, potom v oboch prípadoch (SD/eMMC) musíte napísať niekoľko ďalších súborov (prednahrávač pre SD kartu, ATF, u-boot), aby ste sa dostali k načítaniu jadra. Táto téma je stále sa vyvíja, ale pre nás je hlavné, že to funguje a je v poriadku.

Teraz sťahujem cez eMMC, pravdu povediac, nepoužívam, stačí SD karta, ale strávil som dosť veľa času jej uvedením do prevádzky, tak nech je v článku.

Výber operačného systému. Armbian

Prvou úlohou aplikácie je spustiť VPN, prirodzene Wireguard. Okamžite sa zistilo, že na strane jadra nebol zostavený a neboli tam žiadne hlavičky. Prerobil som jadro a ako je u x86 mojím zvykom, zostavil som modul jadra pomocou DKMS. Rýchlosť budovania aj malých utilít na arm64 ma však nepríjemne prekvapila. A potom bol potrebný ďalší modul jadra atď. Vo všeobecnosti sa ukazuje, že všetko, čo súvisí s jadrom, je najlepšie zostaviť na teplom x86 notebooku, potom preniesť na R64 jednoduchým kopírovaním, reštartovať a otestovať.

Ďalšia vec je časť používateľského priestoru. V mojom prípade výberu Debianu je všetko pre architektúru arm64 už na packages.debian.org a nie je potrebné nič prestavovať.

Aby som nevyrábal ďalší bicykel, I prenesené armbiansky na BPI R64.
Alebo skôr toto: časť používateľského priestoru je Armbian a jadro je prevzaté z úložiska úprimný-A. Najnovší obrázok je možné stiahnuť tu.

Všetky aktivity na vývoji softvérovej časti R64 sa vykonávajú na forum. Všeobecne možno povedať, že samotný výrobca sa snaží router pre Openwrt spopularizovať, no vďaka aktivite vývojára Franka z Nemecka všetky funkcie rýchlo skončia v jadre pre Debian. Prekvapivo je Frank aktívny v každom vlákne fóra.

Organizácia pracovného priestoru: drôty

Samostatne by som vám rád povedal, ako počas vývoja/testovania umiestniť SBC (nielen BPI) na stôl tak, aby k nemu neviedol ethernetový kábel z internetového zdroja cez celú miestnosť/kanceláriu. Faktom je, že na jednej strane potrebujete poskytnúť kus hardvéru s internetom, ale na druhej strane sa môže pokaziť všetko v tomto hardvéri a v prvom rade Wifi.

Najprv som sa rozhodol kúpiť lacnú USB-Wifi „píšťalku“, zapojiť ju do jediného portu na BPI a zabudnúť na káble. Aby som to urobil, kúpil som si lacný TP-LINK TL-WN725N USB 2.0, ale veľmi skoro sa ukázalo, že to nevzlietne: aby píšťalka fungovala, potrebujete ovládač jadra, ktorý tam samozrejme nebol. (neskôr som zostavil potrebný ovládač RTL8XXXU, ale stále je to nepraktické). A ethernetový kábel na chvíľu pokazil vzhľad miestnosti.

V dôsledku toho sa mi podarilo zbaviť sa kábla pomocou Tenda MW3 (Wifi mesh systém): jednoducho som položil jednu kocku pod stôl a pripojil BPI k jeho LAN portu metrovým ethernetovým káblom. Úspech.

Wiregard, RKN, Bird

Jednou z vecí, na ktoré chcem použiť Banana PI, je mať bezplatný prístup k stránkam blokovaným RKN, aby mohli fungovať hovory Telegram a Slack. Na túto tému už boli navrhnuté články o Habrém: čas, два, tri.

Nasadil som presne toto riešenie pomocou Ansible: odkaz.

Predpokladá sa, že VPS používa Ubuntu 18.04. Funkčnosť som overil na dvoch hostiteľoch v Európe: Amazon a Digital Ocean.

Takže sme nainštalovali vyššie uvedený Armbian na R64, je prístupný cez ssh pod názvom hm-bananapi-1 a má prístup na internet. Dôsledne nasadzujeme Ansible, automatizačné skripty a spúšťame samotnú inštaláciu 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

Ďalej musíte nasadiť našu VPN na VPS rovnakým spôsobom:

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

Tu je argument vždy current-vpn a skutočný názov VPS je nakonfigurovaný v premennej (v tomto prípade 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

Áno, pred všetkými týmito operáciami musíte vygenerovať tajomstvá (najmä kľúče Wireguard) do priečinka ./secrets, adresár by mal vyzerať tak.

Ansible Automation v Pythone

Môžete si všimnúť, že namiesto vo formáte YAML sú príkazy Ansible zakódované v skriptoch Pythonu. Pre porovnanie, ako povoliť vtáčieho démona obvyklým spôsobom:

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

a ako urobiť to isté cez Python:

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

Písanie príkazov Ansible v Pythone umožňuje opätovné použitie kódu a vo všeobecnosti otvára všetky možnosti univerzálneho jazyka. Napríklad inštalácia vtáka na R64 a VPS:

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

pozrite si kód funkcie install_bird().

Táto funkcia tzv pybook implementovaná tu. K pybooku zatiaľ nie je žiadna dokumentácia, ale tento problém vyriešim neskôr.

Čo si myslí upstream o tom.

Monitorovanie. Prometheus

Celkom: telegram funguje, linkedin a pornhub tiež, vo všeobecnosti je používateľská skúsenosť v poriadku. Pokaziť sa však môže všetko, vrátane čínskeho hardvéru.

Aktualizácie jadra môžu byť tiež zaujímavé: napríklad som chcel aktualizovať jadro 5.4 => 5.6, no, Wireguard je tam po vybalení, nie je potrebné ho opravovať... Len čo sa povie: Usilovne som preniesol záplaty z 5.4 do 5.6 sa jadro spustilo, tunel do VPS bol pingnutý, ale vták sa nevie spojiť s chybou "BGP Error" ... "Z hrôzy som sa vrátil späť" (c) do 5.4; Presun na 5.6 bol v TODO odložený.

Preto som okrem inštalácie smerovača a VPS pridal monitorovanie (na x86 Ubuntu 18.04), ktoré je nainštalované na samostatnom hostiteľovi s nasledujúcimi komponentmi:

  • prometheus, alertmanager, blackbox_exporter - všetko v dockeri
  • Výstrahy sa odosielajú na kanál telegramov pomocou robota metalmatze/alertmanager-bot – aj v Dockeri
  • tor pre robota, aby robot mohol upozorniť na situácie, keď je internet, ale telegram stále nefunguje a samotný robot sa nemôže pripojiť
  • aplikovaný upozornenia: NodeVPNTroubles (žiadny ping na VPS), BirdVPNTroubles (žiadna relácia Bird), AntifilterDownloadTroubles (chyba pri načítavaní blokovaných IP adries), SiteTroubles (nešťastný telegram nie je k dispozícii)
  • systémové upozornenia, napríklad HostGrowingDiskReadLatency (lacná SD karta sa stane nečitateľnou)

Príklad nastavenia monitorovania:

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

Automatické zisťovanie pre Prometheus je nakonfigurované v priečinku /etc/prometheus/auto_http, čo je príklad pridania hostiteľa do monitorovania (hostitelia nie sú predvolene monitorovaní):

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

ÚLOHA: 2 poskytovatelia, 2 BPI, núdzové prepnutie cez Anycast

Popri všetkom som plánoval pripojiť sa k dvom poskytovateľom, aby internet fungoval ďalej, aj keby mal jeden poskytovateľ problémy so sieťou, alebo zabudli zaplatiť internet a pod., a iné ľudské faktory.

Je popísaná najpokročilejšia používateľská skúsenosť na tému multi-wan tu pre systém Mwan3 pod Openwrt. Toto riešenie má bohatú funkčnosť, ale jeho nastavenie a prevádzka vo všeobecnosti pre multi-wan je dosť problematická. Len jeden príklad: ak prídete na niektoré stránky z dvoch IP adries naraz, nemusí sa im to páčiť, prestanú fungovať => “internet nefunguje.”

S prihliadnutím na túto skúsenosť som sa rozhodol, že multihoming zatiaľ nie je prioritou, iba núdzovým riešením. Aj keď sa zdá, že v najnovších verziách Linuxu by všetko malo fungovať s jedným príkazom, ako napríklad:

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

Takže, aby sme sa vyhli jedinému bodu zlyhania, vezmeme 2 BPI, pripojíme každé k jednému poskytovateľovi, prepojíme ich navzájom a vytvoríme vzájomné dynamické smerovanie cez bird/OSPF.

Ďalej na každej inzerujeme rovnakú IP adresu, ak je služba dostupná (Internet, DNS). To znamená, že predvolenú trasu nenastavíme sami, ale cez vtáka. Špehoval som riešenie tu .

Táto funkcionalita ešte nie je implementovaná, zahral si tu zákerný koronavírus (nie všetko dorazilo z Aliexpressu, ďalší internetový obchod Layta sľúbil dodanie o týždeň, ale už ubehol viac ako mesiac, druhý poskytovateľ nestihol na predĺženie kábla pred karanténou sa podarilo iba vyvŕtať dieru do steny pre kábel).

Ako objednať R64

Samotná doska je v oficiálnom obchode SinoVoip.
Je tiež lepšie objednať ihneď:

  • jedlo + informujte o štandarde zástrčky v EÚ alebo USA
  • chladič: radiátory/ventilátory; pretože sa zahrieva CPU aj prepínací čip
  • wifi anténa, napríklad

Existuje nuansa - cena za dodanie sa v oficiálnom obchode už nejaký čas stala neprimerane vysokou. Manažérka Judy Huang ma presvedčila, že nedošlo k žiadnej chybe a môžete si vybrať ePacket za 5 dolárov, ale videl som, že pre Rusko existuje iba EMS za viac ako 33 dolárov. Nepríjemné, ale nie kritické. Navyše, ak si na doručenie vyberiete akúkoľvek inú krajinu (prešiel som všetky kontinenty), doručenie bude stáť ~ 5 USD. Rusofóbi?... Ale potom som zistil, že pre Francúzsko je cena dopravy tiež ~30$ a upokojil som sa.

V dôsledku toho Judy ponúkla, že zadá objednávku, ale nezaplatí (náznak: dať na kartu menej, aby neprešla automatická platba); napíš jej a ona zníži cenu doručenia na normálnu. Úspech.

Problémy

Nie všetko zatiaľ funguje dokonale.

produktivita

Ansible=Príkazy Pythonu sa vykonávajú pomaly, dokonca aj nečinné, po dobu 20-30 sekúnd; rádovo dlhšie ako na notebooku x86. Navyše sa najprv vykonávajú pomerne rýchlo, ~ 3 sekundy, potom sa prudko spomalia. Môže to byť spôsobené zahrievaním (obmedzením) procesora. Kód Go tiež dlho funguje:

# запрос метрик для прометея из 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 funguje, ale na Armbiane sa asi po dni zastaví, píš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
...

Pomôže len reštart. Musíme ísť ďalej roztriediť.

Ethernet

Ethernet funguje, ale po ~64 hodinách pakety (DHCP) z RXNUMX prestanú prichádzať.
Reštartovanie rozhrania pomáha:

ifdown br0; sleep 30; ifup br0

Ovládač je nový, ešte nebol prijatý do jadra, dúfam, že je to čínsky Landen Chao dokončí to.

Zdroj: hab.com

Pridať komentár