Router Banana Pi R64 — Debian, Wireguard, RKN

Banana Pi 64 je jednodeskový počítač typu Raspberry Pi, ale s několika ethernetovými porty, což umožňuje vytvořit z něj router na základě distribuce Linuxu pro obecné použití.

Router Banana Pi R64 — Debian, Wireguard, RKN

Ano, už existuje OpenWrt, ale má své vlastní zvláštnosti, jak v GUI, tak v CLI; existuje Mikrotik, ale ten má opět své vlastní GUI/CLI a Wireguard nefunguje hned po instalaci... Celkově toužím po routeru s flexibilním nastavením, přičemž zůstanu v rámci standardního Linuxu, se kterým pracuji každý den.

V článku pod názvy BPI, R64, jednodeskový počítač budu mít na mysli to samé — vlastně samotný jednodeskový počítač Banana Pi R64.

Výběr obrazu. Spuštění pomocí eMMC.

Nejprve je třeba se naučit, jak nahrát operační systém do R64, protože R64 nemá port pro monitor (například HDMI). Když se vše zhroutí — přestane fungovat Wi-Fi, ethernet, Bluetooth, USB a další, je zde UART, přes který se vždy můžete podívat, co se pokazilo, a také spustit pár příkazů z konzole, pokud je to potřeba. SBC celkově a u R64 zvlášť.

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

  • běžíme do obchodu s elektronikou pro USB-UART kabel (PL2303, Serial-to-USB).
  • připojíme jeden USB konec k počítači a druhý, UART, k R64, třemi dráty ze čtyř, jak je na obrázku níže.
  • v konzole počítače spustíme sudo minicom

Poté se ve většině případů objeví konzole jednodeskového počítače = úspěch.
Více informací můžete nalézt na zde.

Router Banana Pi R64 — Debian, Wireguard, RKN

Dále je nejjednodušší nahrát operační systém z SD karty: stáhněte si to podle odkazu obraz 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 SD slotu R64, zapneme ji, a pozorujeme na připojené konzoli, jak se spouští nejprve uboot, poté standardní spuštění Linuxu.

Alternativní způsob spuštění — pomocí již vestavěné karty R64 velikosti 8 Gb, nazývané eMMC. Podle pokynů na wiki zapíšeme obraz na zařízení.
/dev/mmcblk0 в BPI, перегружаемся, вытаскиваем SD-карту, включаем BPI снова… и не работает. Как туда-сюда Boot select nežmýkej.

Faktem je, že alespoň pro BPI je třeba nastavit speciální příznak, aby bylo možné bootovat z interní paměti:

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]

Dále je třeba do speciální bootovací části zapsat preloader.

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) vydal tento binární soubor zde. Co přesně dělá, není známo (zdrojové kódy nejsou), ale bez něj to také nefunguje.

Obecně po tom začínají obrazy bootovat i z eMMC. Pokud byste si chtěli poradit a vytvářet obrazy od nuly, je také nutné zapsat ještě několik souborů (preloader pro SD kartu, ATF, u-boot), jen aby se dostali k načtení jádra. Tohle téma je stále se vyvíjí, ale pro nás je hlavní, že to funguje a to je vše.

Momentálně pro eMMC boot doslova nepoužívám, SD karty stačí, ale strávil jsem poměrně dost času, abych to dostal do funkčního stavu, takže ať je to v článku.

Výběr operačního systému. Armbian

První praktický úkol — spustit VPN, samozřejmě Wireguard. Hned jsem zjistil, že není sestaven z jádra a nejsou k dispozici hlavičky. Přepracoval jsem jádro a ze zvyku z x86 jsem sestavil modul jádra pomocí DKMS. Nicméně rychlost sestavování na arm64, i pro malé utility, mě nepříjemně překvapila. A pak bylo potřeba ještě další jádro modulu, atd. Celkově vychází, že všechno, co souvisí s jádrem, je lepší sestavit na teplém vintage notebooku x86 a poté jednoduše zkopírovat na R64, restartovat a testovat.

Druhá věc — uživatelská část. V mém případě výběru Debianu je vše pro architekturu arm64 již dostupné na packages.debian.org a nic znovu sestavovat nemusím.

Abych nevytvářel další kolo, já portoval Armbian na BPI R64.
Přesněji řečeno: uživatelská část — Armbian, a jádro se získává z repozitáře Frank-a. Nejnovější obraz si můžete stáhnout zde.

Veškerá aktivita na vývoji softwarové části R64 probíhá na fóru. Vlastně výrobce se snaží zpopularizovat router pod Openwrt, ale díky aktivitě vývojáře Frank-a z Německa všechny funkce rychle končí v jádru pro Debian. Je překvapující, že Frank je aktivní v každé větvi fóra.

Organizace pracovního prostoru: kabely

Samostatně chci říct, jak během vývoje/testování umístit SBC (nejen BPI) na stůl tak, aby nebylo nutné vést Ethernetový kabel k němu od zdroje internetu napříč celou místností/kanceláří. Je to proto, že na jedné straně je potřeba zajistit zařízení internet, a na druhé straně může v tomto zařízení všechno selhávat, a především Wifi.

Nejprve jsem se rozhodl pořídit levný USB-Wifi „stick“, zapojit ho do jediného portu na BPI a zapomenout na kabely. K tomu jsem zakoupil levný TP-LINK TL-WN725N USB 2.0, ale velmi brzy bylo jasné, že to nebude fungovat: k provozu sticku potřeboval ovladač jádra, který tam samozřejmě nebyl (později jsem zkompiloval potřebný ovladač RTL8XXXU, ale stále to není praktické). A Ethernetový kabel kazil vzhled pokoje nějakou dobu.

Nakonec se mi podařilo se kabelu zbavit pomocí Tenda MW3 (Wifi mesh systém): jednoduše jsem umístil jeden blok pod stolem a metrovým Ethernetovým kabelem připojil BPI k LAN portu posledního. Úspěch.

Wireguard, RKN, Bird

Jedním z cílů, pro které používám Banana PI, je mít volný přístup na stránky, které jsou blokované RKN, konkrétně, aby fungoval Telegram a volání v Slacku. Na toto téma již byly navrženy články na Habru: jedna, dva, tři.

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

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

Takže jsme nainstalovali výše uvedený Armbian na R64, je dostupný přes ssh pod názvem hm-bananapi-1 a má přístup na internet. Postupně nasazujeme ansible, automatizační skripty a zahajujeme 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 potřeba podobně nasadit na VPS naši VPN:

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

Zde je argument vždy current-vpn, a vlastně název VPS se nastavuje 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 je potřeba vygenerovat tajemství (konkrétně klíče Wireguard) do složky .\/secrets, adresář by měl vypadat takto.

Automatizace Ansible v Pythonu

Můžeme si všimnout, že místo formátu YAML jsou příkazy Ansible zakódovány ve skriptech Python. Pro srovnání, jak obvyklým způsobem spustit démon bird:

- 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")

Zapisování příkazů Ansible kódem v Pythonu umožňuje opětovné použití kódu, a vůbec jsou otevřeny všechny možnosti jazyka obecného účelu. Například instalace bird na R64 a VPS:

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

podívat se na kód funkce install_bird().

Tato funkce nazvaná pybook byla implementována zdeDokumentace k pybooku zatím není, později tento nedostatek opravím.

Co si myslí upstream o tom.

Monitoring. Prometheus

Celkově: Telegram funguje, LinkedIn a Pornhub také, uživatelská zkušenost je v pořádku. Ale všechno se může rozpadnout a čínské zařízení také.

Aktualizace jádra mohou být také zajímavé: například jsem chtěl aktualizovat jádro z 5.4 na 5.6, je tam přece Wireguard v základu, nemusím patchovat… Řekl jsem, udělal jsem: cílevědomě jsem přenášel patche z 5.4 do 5.6, jádro se rozjelo, tunel na VPS pinguje, ale bird se nemůže připojit s chybou "BGP Error"… "V hrůze jsem se vrátil zpět" (c) na 5.4; přesun na 5.6 jsem odložil na TODO.

Proto jsem kromě instalace routeru a VPS přidal monitoring (na x86 Ubuntu 18.04), který se instaluje na samostatný host s následujícími komponenty:

  • prometheus, alertmanager, blackbox_exporter — všechno v dockeru
  • Upozornění se posílají do telegramového kanálu pomocí bota metalmatze/alertmanager-bot — také v dockeru
  • tor pro bota, aby bot mohl upozorňovat na situace, když internet je, ale Telegram přesto nefunguje, a sám bot se nemůže připojit
  • aplikovní upozornění: NodeVPNTroubles (žádný ping na VPS), BirdVPNTroubles (žádná relace Bird), AntifilterDownloadTroubles (chyba při stahování blokovaných IP adres), SiteTroubles (nedostupný prokletý Telegram)
  • systémová upozornění, například HostGrowingDiskReadLatency (levná SD karta přestává číst)

Příklad instalace monitoringu:

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

Auto Discovery pro Prometheus je nastaveno na složku /etc/prometheus/auto_http, příklad přidání hosta do monitoringu (ve výchozím nastavení se hosté nesledují):

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, anycast failover

Kromě všeho jsem naplánoval připojení k dvěma poskytovatelům, aby internet pokračoval v práci, i když u jednoho poskytovatele jsou síťové problémy, nebo zapomněli zaplatit za internet atd., a další lidský faktor.

Nejvyspělejší uživatelská zkušenost na téma multi-wan je popsána zde pro systém Mwan3 pod OpenWRT. Toto řešení má bohatou funkčnost, ale nastavení a provoz pro multi-wan je obecně dost obtížné. Například: pokud navštěvujete některé stránky současně se dvěma IP adresami, nemusí se jim to líbit, přestanou fungovat => "internet nefunguje".

Po zhodnocení této zkušenosti jsem se rozhodl, že multihoming zatím není prioritou, pouze failover. I když se zdá, že v posledních verzích Linuxu by to vše mělo fungovat jedním příkazem ve formátu:

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

Takže, abychom neměli jediný bod selhání, vezmeme 2 BPI, každý připojíme k jednomu poskytovateli, spojíme je mezi sebou a spojení uděláme dynamickým routováním pomocí bird/OSPF.

Dále na každém oznámíme stejnou IP adresu, pokud je služba dostupná (internet, DNS). To znamená, že trasu nastavíme ne sami, ale prostřednictvím bird. Řešení jsem odpozoroval zde .

Tuto funkci jsem zatím neimplementoval, zrádný koronavirus zde také zasáhl (neslo už všechno z AliExpress; další internetový obchod, Layta, slíbil dodání za týden, ale už to trvá déle než měsíc; druhý poskytovatel nestihl natáhnout kabel před karanténou, stihl jen vyvrtat díru ve zdi pro kabel).

Jak objednat R64

Samotná deska v oficiálním obchodě SinoVoip.
Také je lepší hned objednat:

  • napájení + sdělit standard konektoru EU nebo USA
  • chladič: radiátory/větráky; protože se zahřívá jak CPU, tak čip switche
  • anténu pro wifi, například

Je tu nuance - cena dopravy se od nějakého momentu stala nepřiměřeně vysokou v oficiálním obchodě. Manažerka Judy Huang mě přesvědčovala, že chyba není, a mohu zvolit ePacket za 5 USD, ale viděl jsem, že pro Rusko je dostupná pouze EMS za >33 USD. Nepříjemné, ale ne kritické. Přičemž pokud vyberu jakoukoli jinou zemi pro dopravu (prošel jsem všechny kontinenty), doprava bude za ~5 USD. Rusofobové?.. Ale pak jsem zjistil, že pro Francii je cena dopravy také ~30 USD, a uklidnil jsem se.

Nakonec Judy navrhla udělat objednávku, ale neplatit (hint: vložit na kartu méně, aby automaticky neprošla platba); napsat jí a ona sníží cenu dopravy na přijatelnou. Úspěch.

Problémy

Zatím všechno nefunguje ideálně.

Výkon

Příkazy Ansible=Python se vykonávají pomalu, i prázdné, po 20-30 sekundách; v pořádku delší dobu než na notebooku x86. Přičemž na začátku se vykonávají dost rychle, ~3 sekundy, pak se náhle zpomalují. Možná to je způsobeno přehříváním CPU (throttling). Kód napsaný v Go také běží dlouho:

# запрос метрик для прометея из 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 Armbianu po přibližně dni přestane, 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áhá pouze restart. Je třeba pokračovat ve vyšetřování.

Ethernet

Ethernet funguje, ale po ~24 hodinách přestávají přicházet pakety (DHCP) od R64.
Pomáhá restartování rozhraní:

ifdown br0; sleep 30; ifup br0

Ovladač je nový, do jádra ještě nebyl přijat, doufám, že Číňan Landen Chao to doladí.

Zdroj: habr.com

Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster