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, existuje OpenWRT, ale má své vlastní zvláštnosti, vlastní GUI a CLI; existuje Mikrotik, ale ten má opět vlastní GUI/CLI a Wireguard Z krabice to nefunguje... V podstatě chci router s flexibilním nastavením, a přitom zůstat v rámci standardního Linuxu, se kterým denně pracuji.

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 praktickým úkolem je samozřejmě spuštění VPN WireguardOkamžitě jsem zjistil, že jádro nebylo správně zkompilováno a nebyly v něm žádné hlavičkové soubory. Jádro jsem znovu sestavil a, jak je u x86 zvykem, sestavil modul jádra pomocí DKMS. Rychlost sestavení na ARM64, a to i u malých utilit, však byla nepříjemně překvapivá. Pak byl potřeba další modul jádra a tak dále. V podstatě se ukázalo, že cokoli souvisejícího s jádrem se nejlépe kompiluje na ošuntělém notebooku s x86, pak se to prostě zkopíruje a vloží do ARM64, restartuje a otestuje.

Část s využitím prostoru je jiná věc. V mém případě je to volba Debian, vše pro architekturu arm64 je již v balíčcích.debian.org a není potřeba nic znovu kompilovat.

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 forumObecně řečeno, samotný výrobce se snaží router pro OpenWrt zpopularizovat, ale díky aktivitě vývojáře Franka z Německa se všechny funkce rychle dostanou do jádra. Debian-a. Frank je překvapivě aktivní v každém vlákně 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.

Wireguard, RKN, Pták

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ěží pod Ubuntu 18.04. dubna. Funkčnost jsem otestoval u dvou poskytovatelů hostingu 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

Ano, před všemi těmito operacemi je potřeba vygenerovat tajné kódy (zejména klíče). Wireguard) do složky ./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é: například jsem chtěl aktualizovat jádro 5.4 => 5.6, no, tam Wireguard Po vybalení z krabice není třeba patchovat... Sotva řečeno, to udělám: Pečlivě jsem převedl patche z 5.4 na 5.6, jádro se nastartovalo, tunel k VPS pingne, ale Bird se nemůže připojit s chybou „BGP Error“... „S hrůzou jsem se vrátil“ (c) na 5.4; přechod na 5.6 byl zadán do TODO.

Proto jsem kromě instalace routeru a VPS přidal i 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

Kupte si spolehlivý hosting pro stránky s DDoS ochranou, VPS VDS servery 🔥 Kupte si spolehlivý webhosting s ochranou DDoS, VPS VDS servery | ProHoster