Router Banana Pi R64 – Debian, Wireguard, RKN

Banana Pi 64 je jednodeskový počítač podobný Raspberry Pi, ale s několika ethernetovými porty, což z něj dělá univerzální distribuční směrovač Linuxu.

Router Banana Pi R64 – Debian, Wireguard, RKN

Ano, Openwrt již existuje, ale má své vlastní GUI a CLI; je tam Mikrotik, ale ten má zase vlastní GUI/CLI a Wireguard nefunguje hned po vybalení... Obecně chci router s flexibilním nastavením a přitom zůstat v rámci standardního Linuxu, se kterým pracujete každý den.

V článku pod názvy BPI, R64, jednodeska budu mít na mysli to samé - samotnou jednodesku Banana Pi R64.

Výběr obrázku. Stáhnout přes eMMC

Úplně první dovednost, kterou si osvojíte při práci SBC obecně a u R64 zvlášť to znamená naučit se, jak do něj nahrát OS a umět s ním komunikovat, protože R64 nemá port pro monitor (například HDMI). Když vše spadlo - přestala fungovat Wifi, ethernetová síť, Bluetooth, USB atd. je tu UART, přes jehož rozhraní vždy vidíte, co se pokazilo, a případně i spustit pár příkazů z konzole.

Algoritmus připojení k R64 přes USB-UART:

  • běžte do obchodu s rádiovými součástkami pro kabel USB-UART (PL2303, Serial-to-USB)
  • připojíme jeden konec USB k počítači a druhý, UART, k R64, třemi ze čtyř vodičů, jako na obrázku níže
  • ve spuštění konzoly počítače sudo minicom

Poté se ve většině případů objeví jednodesková konzole = úspěch.
Další podrobnosti lze vidět zde.

Router Banana Pi R64 – Debian, Wireguard, RKN

Dále je nejjednodušší načíst operační systém z SD karty: stáhnout do odkaz obrázek a nahrajte jej:

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 R64 SD-slotu, zapneme, pozorujeme načítání ubootu nejprve na připojené konzoli, poté standardní boot Linuxu.

Alternativní možností spouštění je použití 64Gb karty již zabudované v R8, nazývané eMMC. Podle návodu na wiki přepíšeme obrázek do zařízení
/dev/mmcblk0 na BPI, restartujte, vyjměte SD kartu, znovu povolte BPI... a nefunguje to. Jak se tam dostat Boot select nezdržuj se.

Faktem je, že alespoň pro BPI musíte nastavit speciální příznak, abyste mohli zavést systém z interní 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]

Dále musíte zapsat preloader na speciální spouštěcí oddíl

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

Výrobce R64 (Čína) zveřejnil tento binární soubor zde. Co dělá, se neví (neexistují zdrojové kódy), ale bez něj to také nepůjde.

Obecně platí, že poté se obrázky začnou načítat z eMMC. Pokud na to chcete přijít a vytvořit obrázky od začátku, pak pro oba případy (SD / eMMC) musíte zapsat několik dalších souborů (preloader pro SD kartu, ATF, u-boot), abyste se dostali k jádru bota. Toto téma je stále se vyvíjí, ale pro nás je hlavní, že to funguje a je v pořádku.

Nyní, abych byl upřímný, nepoužívám stahování eMMC, stačí SD karty, ale strávil jsem docela dost času jeho zprovozněním, tak ať je to v článku.

Volba operačního systému. armbian

Prvním úkolem aplikace je spustit VPN, samozřejmě Wireguard. Okamžitě se ukázalo, že nebyl sestaven ze strany jádra a nebyly tam žádné hlavičky. Přestavěl jsem jádro a ze zvyku s x86 sestavil modul jádra pomocí DKMS. Rychlost montáže na arm64 i malých utilit mě však nepříjemně překvapila. A pak byl vyžadován další modul jádra a tak dále. Obecně se ukazuje, že vše, co souvisí s jádrem, je lepší sestavit na notebooku x86 s teplou trubicí, poté přenést na R64 jednoduchým zkopírováním, restartovat a otestovat.

Další věcí je část uživatelského prostoru. V mém případě výběru Debianu je vše pro architekturu arm64 již na packages.debian.org a není třeba nic přestavovat.

Abych nevyráběl další kolo, I přeneseno armbian na BPI R64.
Nebo spíše: část uživatelského prostoru je Armbian a jádro je převzato z úložiště Upřímný-A. Nejnovější obrázek lze stáhnout zde.

Veškerá činnost na vývoji softwarové části R64 probíhá na forum. Obecně lze říci, že sám výrobce se snaží router Openwrt popularizovat, ale díky aktivitě vývojáře Franka z Německa všechny funkce rychle končí v jádře Debianu. Frank je překvapivě aktivní v každém vláknu fóra.

Organizace pracovního prostoru: dráty

Samostatně vám chci říci, jak umístit SBC (nejen BPI) na stůl během vývoje / testování tak, aby k němu nevedl ethernetový kabel ze zdroje internetu přes celou místnost / kancelář. Fakt je, že na jednu stranu je potřeba do toho železu poskytnout internet a na druhou stranu se v tom železe může všechno rozbít a hlavně Wifi.

Nejprve jsem se rozhodl koupit levnou USB-Wifi „píšťalku“, zapojit ji do jediného portu na BPI a zapomenout na dráty. Za tímto účelem jsem si koupil levný TP-LINK TL-WN725N USB 2.0, ale velmi brzy bylo jasné, že nevzlétne: aby píšťalka fungovala, byl zapotřebí ovladač jádra, který tam samozřejmě nebyl. (později jsem zkompiloval potřebný ovladač RTL8XXXU, ale stále je to nepraktické). A ethernetový kabel na chvíli zkazil výhled na místnost.

Ve výsledku se mi podařilo zbavit se kabelu pomocí Tenda MW3 (Wifi mesh systém): jednoduše jsem jednu kostku umístil pod stůl a BPI připojil metrovým ethernetovým kabelem k LAN portu druhého. Úspěch.

Wiregard, RKN, Bird

Jednou z věcí, na které používám Banana PI, je mít volný přístup zejména na stránky blokované RKN, aby fungoval Telegram a volání na Slack. Články na toto téma již byly na Habré navrženy: čas, два, tři.

Implementoval jsem nasazení právě takového řešení pomocí Ansible: odkaz.

Předpokládá se, že VPS běží na Ubuntu 18.04. Výkon jsem ověřil na dvou hostitelích v Evropě: Amazon a Digital Ocean.

Nainstalovali jsme tedy výše uvedený Armbian na R64, je dostupný přes ssh pod jménem hm-bananapi-1 a má přístup k internetu. Nasadíme sekvenční ansible, automatizační skripty a spustíme samotnou instalaci 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

Dále je třeba nasadit naši VPN na VPS stejným způsobem:

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

Zde je argument vždy current-vpn a samotný název VPS je nakonfigurován v proměnné (v tomto případě 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

Ach ano, před všemi těmito operacemi musíte vygenerovat tajné klíče (zejména klíče Wireguard) ve složce ./secrets, adresář by měl vypadat takto tak.

Ansible automatizace v Pythonu

Můžete si všimnout, že namísto formátu YAML jsou příkazy Ansible zakódovány ve skriptech Pythonu. Pro srovnání, jak povolit ptačího démona obvyklým způsobem:

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

a jak to samé přes Python:

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

Psaní příkazů Ansible pomocí kódu Python umožňuje opětovné použití kódu a obecně jsou všechny možnosti univerzálního jazyka otevřené. Například instalace bird na R64 a VPS:

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

viz kód funkce install_bird().

Tato funkce se nazývá pybook implementováno zde. Na pybooku zatím není žádná dokumentace, pak tuto závadu opravím.

Co si myslí proti proudu při této příležitosti.

Sledování. Prometheus

Celkem: telegram funguje, linkedin a pornhub také, obecně je uživatelská zkušenost v pořádku. Ale všechno se může rozbít a čínské kusy železa taky.

Aktualizace jádra mohou být také zajímavé: chtěl jsem například aktualizovat jádro 5.4 => 5.6, dobře, z krabice je Wireguard, není třeba záplatovat ... Sotva řečeno, než uděláno: pečlivě přenesené záplaty z 5.4 na 5.6, jádro se spustilo, tunel k VPS pingl, ale pták se nemůže připojit s chybou "BGP Error"... "V hrůze se vrátil zpět" (c) až 5.4; přesun na 5.6 byl v TODO odložen.

Proto jsem kromě instalace routeru a VPS přidal monitoring (na x86 Ubuntu 18.04), který je nainstalován na samostatném hostiteli s následujícími komponentami:

  • prometheus, alertmanager, blackbox_exporter - vše v dockeru
  • výstrahy jsou odesílány na kanál telegramů pomocí robota metalmatze/alertmanager-bot – také v dockeru
  • tor pro robota, aby robot mohl upozornit na situace, kdy je k dispozici internet, ale telegram stále nefunguje a samotný robot se nemůže připojit
  • aplikovaný upozornění: NodeVPNTroubles (žádný ping na VPS), BirdVPNTroubles (žádná ptačí relace), AntifilterDownloadTroubles (nepodařilo se načíst blokované IP adresy), SiteTroubles (nešťastný telegram není k dispozici)
  • systémová upozornění jako HostGrowingDiskReadLatency (levná SD karta se přestane číst)

Příklad nastavení monitorování:

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

Automatické zjišťování pro prometheus je nastaveno na složku /etc/prometheus/auto_http, což je příklad přidání hostitele do monitorování (hostitelé nejsou ve výchozím nastavení monitorováni):

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 poskytovatelé, 2 BPI, převzetí služeb při selhání anycast

Ke všemu jsem plánoval připojení ke dvěma poskytovatelům, aby internet fungoval dál, i kdyby měl jeden poskytovatel problémy se sítí, nebo zapomněl zaplatit internet atd. a další lidský faktor.

Je popsána nejpokročilejší uživatelská zkušenost na téma multi-wan zde pro systém Mwan3 pod Openwrt. Toto řešení má bohatou funkčnost, ale obecně nastavení a provoz pro multi-wan je poměrně problematické. Jen jeden příklad: když přijdete na nějaké stránky ze dvou IP adres najednou, tak se jim to nemusí líbit, přestanou fungovat => "internet nefunguje."

Vzhledem k této zkušenosti jsem se rozhodl, že multihoming zatím není prioritou, pouze převzetí služeb při selhání. I když se zdá, že v nejnovějších verzích linuxu by vše mělo fungovat s jedním příkazem, jako je:

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

Abychom se vyhnuli jedinému bodu selhání, vezmeme 2 BPI, každý se připojí k jednomu poskytovateli, propojíme je a vytvoříme vzájemnou komunikaci dynamicky směrovanou přes bird / OSPF.

Dále na každém oznamujeme stejnou IP adresu, pokud je služba dostupná (Internet, DNS). To znamená, že výchozí trasu nepoložíme sami, ale přes ptáka. Řešení špehoval zde .

Tato funkcionalita zatím není implementována, zákeřný koronavirus pokazil (ne vše přišlo z aliexpressu, další internetový obchod Layta slíbil dodání do týdne a uběhl více než měsíc, druhému poskytovateli se nepodařilo natáhnout kabel před karanténou, podařilo se pouze udělat díru ve zdi pro vyvrtání kabelu).

Jak objednat R64

Samotná deska v oficiálním obchodě SinoVoip.
Je také lepší objednat okamžitě:

  • výživa + Informujte o standardu zástrčky EU nebo USA
  • chladič: radiátory/ventilátory; protože se zahřívá jak CPU, tak spínací čip
  • wifi anténa, například

Existuje nuance - cena dodání se od určité doby stala v oficiálním obchodě neadekvátně vysoká. Manažerka Judy Huang mě ujistila, že nedošlo k chybě a můžete si vybrat ePacket za 5 $, ale viděl jsem, že pro Rusko je pouze EMS za > 33 $. Nepříjemné, ale ne kritické. Navíc, pokud si pro doručení vyberete jakoukoli jinou zemi (prošel jsem všechny kontinenty), bude doručení stát ~5 $. Rusofobové?... Ale pak jsem zjistil, že pro Francii je cena dopravy také ~ 30 $, a uklidnil jsem se.

V důsledku toho Judy nabídla, že zadá objednávku, ale nezaplatí (náznak: dát na kartu méně, aby platba neprobíhala automaticky); napište jí a ona sníží cenu dopravy na normální. Úspěch.

Problémy

Ne vše zatím funguje dokonale.

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

Ansible=Příkazy Pythonu jsou prováděny pomalu, dokonce i nečinné, po dobu 20-30 sekund; řádově delší než u notebooku x86. Navíc se nejprve provádějí docela rychle, ~ 3 sekundy, pak se prudce zpomalí. Možná je to způsobeno zahříváním CPU (škrcení). Go kód je také dlouho spuštěný:

# запрос метрик для прометея из 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 asi po dni se zastaví na Armbianu, 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 pouze restart. Musíme jít dál vyřešit.

Ethernet

Ethernet funguje, ale po ~ dni přestanou přicházet pakety (DHCP) z R64.
Restartování rozhraní pomáhá:

ifdown br0; sleep 30; ifup br0

Ovladač je nový, kernel ještě nebyl přijat, doufám, že čínský Landen Chao Dokončit.

Zdroj: www.habr.com

Přidat komentář