Router Banana Pi R64 — Debian, Wireguard, RKN

Banana Pi 64 to komputer jednopłytkowy podobny do Raspberry Pi, ale z wieloma portami Ethernet, co czyni go uniwersalnym routerem do dystrybucji Linuksa.

Router Banana Pi R64 — Debian, Wireguard, RKN

Tak, Openwrt już istnieje, ale ma własne GUI i CLI; jest Mikrotik, ale znowu ma swój własny GUI/CLI, a Wireguard nie działa od razu... Generalnie chcę router z elastycznymi ustawieniami, pozostając jednocześnie w ramach standardowego Linuksa, z którym pracujesz codziennie.

W artykule pod nazwami BPI, R64, single-board, będę miał na myśli to samo - samą jednopłytkę Banana Pi R64.

Wybór obrazu. Pobierz przez eMMC

Pierwsza umiejętność, którą należy zdobyć podczas pracy z SBC ogólnie, aw przypadku R64 w szczególności, oznacza to nauczenie się ładowania do niego systemu operacyjnego i możliwości interakcji z nim, ponieważ R64 nie ma portu monitora (na przykład HDMI). Kiedy wszystko się zepsuło - Wi-Fi przestało działać, sieć Ethernet, Bluetooth, USB itp. jest UART, przez którego interfejs zawsze możesz zobaczyć, co poszło nie tak, a także, jeśli to konieczne, uruchomić kilka poleceń z konsoli.

Algorytm połączenia z R64 przez USB-UART:

  • biegnij do sklepu z częściami radiowymi po kabel USB-UART (PL2303, Serial-to-USB)
  • jedną końcówkę USB podłączamy do komputera, a drugą, UART, do R64, trzema z czterech przewodów, jak na obrazku poniżej
  • w uruchomieniu konsoli komputera sudo minicom

Następnie w większości przypadków pojawi się konsola jednopłytkowa = sukces.
Możesz zobaczyć więcej tutaj.

Router Banana Pi R64 — Debian, Wireguard, RKN

Następnie najłatwiejszym sposobem jest załadowanie systemu operacyjnego z karty SD: pobierz przez powiązanie zdjęcie i wgraj:

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

wkładamy kartę do gniazda R64 SD, włączamy ją, obserwujemy najpierw ładowanie uboot na podłączonej konsoli, a następnie standardowy rozruch Linuksa.

Alternatywną opcją rozruchu jest użycie karty 64 Gb już wbudowanej w R8, zwanej eMMC. Zgodnie z instrukcjami na wiki przepisujemy obraz na urządzenie
/dev/mmcblk0 do BPI, uruchom ponownie, wyjmij kartę SD, ponownie włącz BPI ... i to nie działa. Jak się tam dostać Boot select nie trzymaj się.

Faktem jest, że przynajmniej dla BPI musisz ustawić specjalną flagę, aby móc uruchomić komputer z wewnętrznego dysku 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]

Następnie musisz zapisać preloader na specjalnej partycji rozruchowej

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

Producent R64 (Chiny) opublikował ten plik binarny tutaj. Nie wiadomo, co robi (nie ma kodów źródłowych), ale bez niego też nie zadziała.

Ogólnie rzecz biorąc, po tym obrazy zaczynają się ładować z eMMC. Jeśli chcesz to rozgryźć i tworzyć obrazy od podstaw, to w obu przypadkach (SD/eMMC) musisz napisać jeszcze kilka plików (preloader na kartę SD, ATF, u-boot), aby dostać się do jądra uruchomić. Ten temat jest nadal rozwija się, ale dla nas najważniejsze jest to, że działa i jest w porządku.

Szczerze mówiąc, nie korzystam z pobierania eMMC, wystarczą karty SD, ale spędziłem sporo czasu, aby to działało, więc niech będzie w artykule.

Wybór systemu operacyjnego. ormiański

Pierwszym zadaniem aplikacji jest uruchomienie VPN, oczywiście Wireguard. Od razu okazało się, że nie został zmontowany od strony jądra i nie ma nagłówków. Przebudowałem jądro i z przyzwyczajenia do x86 zbudowałem moduł jądra przy użyciu DKMS. Jednak szybkość montażu na ramieniu64 nawet niewielkich narzędzi niemile mnie zaskoczyła. A potem potrzebny był inny moduł jądra i tak dalej. Ogólnie rzecz biorąc, okazuje się, że wszystko, co dotyczy jądra, lepiej jest zmontować na laptopie x86 z ciepłą rurką, a następnie przenieść na R64 przez proste skopiowanie, ponowne uruchomienie i przetestowanie.

Kolejną rzeczą jest część przestrzeni użytkownika. W moim przypadku wybrania Debiana wszystko dla architektury arm64 jest już na packages.debian.org i nie ma potrzeby niczego przebudowywać.

Aby nie produkować kolejnego roweru, I przeniesiony armbianski na BPI R64.
A raczej: część przestrzeni użytkownika to Armbian, a rdzeń jest pobierany z repozytorium Szczery-A. Najnowszy obraz można pobrać tutaj.

Cała działalność związana z rozwojem części programowej R64 jest prowadzona na forum. Ogólnie rzecz biorąc, producent sam dąży do spopularyzowania routera Openwrt, ale dzięki aktywności dewelopera Franka z Niemiec wszystkie funkcje szybko lądują w jądrze Debiana. Co zaskakujące, Frank jest aktywny we wszystkich wątkach na forum.

Organizacja miejsca pracy: przewody

Osobno chcę powiedzieć, jak umieścić SBC (nie tylko BPI) na stole podczas opracowywania / testowania, aby nie poprowadzić do niego kabla Ethernet ze źródła Internetu przez całe pomieszczenie / biuro. Faktem jest, że z jednej strony trzeba zapewnić Internet do kawałka żelaza, az drugiej strony wszystko może się zepsuć w tym kawałku żelaza, a zwłaszcza Wi-Fi.

Najpierw zdecydowałem się na zakup taniego „gwizdka” USB-Wifi, wpięcie go do jedynego portu na BPI i zapomnij o przewodach. Aby to zrobić, kupiłem niedrogi TP-LINK TL-WN725N USB 2.0, ale bardzo szybko stało się jasne, że nie wystartuje: aby gwizdek działał, potrzebny był sterownik jądra, którego oczywiście nie było (później skompilowałem niezbędny sterownik RTL8XXXU, ale nadal jest to niepraktyczne). A kabel ethernetowy na chwilę zepsuł widok pokoju.

W rezultacie udało mi się pozbyć kabla za pomocą Tenda MW3 (system Wifi mesh): po prostu umieściłem jedną kostkę pod stołem i podłączyłem BPI do portu LAN tego ostatniego za pomocą metrowego kabla Ethernet. Powodzenie.

Wireguard, RKN, Bird

Jedną z rzeczy, do których używam Banana PI, jest swobodny dostęp do stron zablokowanych przez RKN, w szczególności po to, aby Telegram i połączenia do Slacka działały. Artykuły na ten temat zostały już zaproponowane na Habré: czas, два, trzy.

Wdrożenie właśnie takiego rozwiązania zaimplementowałem za pomocą Ansible: łącze.

VPS powinien działać pod kontrolą Ubuntu 18.04. Sprawdziłem wydajność na dwóch hosterach w Europie: Amazon i Digital Ocean.

Więc zainstalowaliśmy powyższy Armbian na R64, jest dostępny przez ssh pod nazwą hm-bananapi-1 i posiada dostęp do internetu. Wdrażamy sekwencyjnie ansible, automatyzujące skrypty i uruchamiamy samą instalację 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

Następnie musisz wdrożyć naszą sieć VPN na VPS w ten sam sposób:

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

Tutaj argumentem jest zawsze current-vpn, a sama nazwa VPS jest skonfigurowana w zmiennej (w tym przypadku jest 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

O tak, przed wszystkimi tymi operacjami musisz wygenerować sekrety (w szczególności klucze Wireguard) w folderze ./secrets, katalog powinien wyglądać tak.

Automatyzacja Ansible w Pythonie

Możesz zauważyć, że zamiast formatu YAML, polecenia Ansible są zakodowane w skryptach Pythona. Dla porównania, jak włączyć demona ptaka w zwykły sposób:

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

i jak to samo przez Pythona:

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

Pisanie poleceń Ansible za pomocą kodu Pythona pozwala na ponowne wykorzystanie kodu i ogólnie wszystkie możliwości języka ogólnego przeznaczenia są otwarte. Na przykład instalacja ptaka na R64 i VPS:

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

patrz kod funkcji zainstaluj_ptaka().

Ta funkcja nazywa się pybook wdrożone tutaj. Nie ma jeszcze dokumentacji na pybooku, wtedy poprawię tę wadę.

Co on myśli pod prąd z tej okazji.

Monitorowanie. Prometeusz

Razem: telegram działa, linkedin i pornhub też, ogólnie rzecz biorąc, wrażenia użytkownika są w porządku. Ale wszystko może się zepsuć, także chińskie kawałki żelaza.

Aktualizacje jądra też mogą być interesujące: na przykład chciałem zaktualizować jądro 5.4 => 5.6, cóż, jest Wireguard po wyjęciu z pudełka, nie trzeba łatać… Ledwie powiedziane, już zrobione: mozolnie przeniesione łatki z 5.4 do 5.6, jądro się uruchomiło, tunel do VPS pingował, ale bird nie może się połączyć z błędem „Błąd BGP”… „Cofnięto z przerażeniem” (c) do 5.4; przejście do wersji 5.6 zostało przełożone w TODO.

Dlatego oprócz instalacji routera i VPS dodałem monitoring (na x86 Ubuntu 18.04), który jest instalowany na oddzielnym hoście z następującymi komponentami:

  • prometheus, alertmanager, blackbox_exporter - wszystko w dockerze
  • alerty są wysyłane na kanał telegramu za pomocą bota metalmatze/alertmanager-bot - również w dockerze
  • tor dla bota, aby bot mógł alarmować sytuacje, gdy Internet jest dostępny, ale telegram nadal nie działa, a sam bot nie może się połączyć
  • stosowany alerty: NodeVPNTroubles (brak pingowania do VPS), BirdVPNTroubles (brak sesji Bird), AntifilterDownloadTroubles (nie udało się załadować zablokowanych adresów IP), SiteTroubles (niefortunny telegram niedostępny)
  • alerty systemowe, takie jak HostGrowingDiskReadLatency (tania karta SD przestaje być czytana)

Przykład konfiguracji monitorowania:

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

Automatyczne wykrywanie dla prometheusa jest ustawione na folder /etc/prometheus/auto_http, przykład dodania hosta do monitorowania (hosty nie są domyślnie monitorowane):

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

DO ZROBIENIA: 2 dostawców, 2 BPI, przełączanie awaryjne anycast

Oprócz wszystkiego planowałem połączyć się z dwoma dostawcami, aby Internet nadal działał, nawet jeśli jeden dostawca miał problemy z siecią, lub zapomniał zapłacić za Internet itp. I inne czynniki ludzkie.

Opisano najbardziej zaawansowany interfejs użytkownika w temacie multi-wan tutaj dla systemu Mwan3 pod Openwrt. To rozwiązanie ma bogatą funkcjonalność, ale konfiguracja i ogólnie obsługa multi-wan jest dość kłopotliwa. Tylko jeden przykład: jeśli wejdziesz na niektóre strony z dwóch adresów IP jednocześnie, może im się to nie spodobać, przestaną działać => „Internet nie działa”.

Biorąc pod uwagę to doświadczenie, zdecydowałem, że multihoming nie jest jeszcze priorytetem, tylko przełączanie awaryjne. Chociaż wydaje się, że w najnowszych wersjach Linuksa wszystko powinno działać za pomocą jednej komendy typu:

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

Tak więc, aby nie było pojedynczego punktu awarii, bierzemy 2 BPI, każdy łączymy się z jednym dostawcą, łączymy je ze sobą i komunikujemy się ze sobą przez dynamiczny routing przez bird / OSPF.

Ponadto na każdym ogłaszamy ten sam adres IP, jeśli usługa jest dostępna (Internet, DNS). Oznacza to, że sami nie ustalimy domyślnej trasy, ale przez ptaka. Rozwiązanie szpiegowało tutaj .

Ta funkcjonalność nie została jeszcze wdrożona, podstępny koronawirus namieszał (nie wszystko pochodziło z aliexpress; inny sklep internetowy Layta obiecał dostarczyć za tydzień, a minął ponad miesiąc; drugi dostawca nie zdążył rozciągnąć kabel przed kwarantanną, udało się tylko zrobić dziurę w ścianie do wywiercenia kabla).

Jak zamówić R64

Sama płytka w oficjalnym sklepie SinoVoip.
Lepiej też zamówić od razu:

  • jedzenie + poinformuj standard wtyczek UE lub USA
  • radiator: grzejniki/wentylatory; ponieważ zarówno procesor jest podgrzewany, jak i układ przełącznika
  • antena Wi-Fi, Przykładowo

Jest pewien niuans - cena dostawy od pewnego czasu stała się nieadekwatnie wysoka w oficjalnym sklepie. Menedżer Judy Huang zapewniła mnie, że nie ma pomyłki i można wybrać ePacket za 5 USD, ale widziałem, że w Rosji jest tylko EMS za >33 USD. Nieprzyjemne, ale nie krytyczne. Ponadto, jeśli wybierzesz inny kraj do dostawy (przejechałem przez wszystkie kontynenty), dostawa będzie kosztować ~5 $. Rusofobów?.. Ale potem dowiedziałem się, że dla Francji cena dostawy również wynosi ~30 USD i uspokoiłem się.

W rezultacie Judy zaproponowała, że ​​złoży zamówienie, ale nie zapłaci (napomknąć: włóż mniej na kartę, aby płatność nie przeszła automatycznie); napisz do niej, a obniży cenę wysyłki do normalnej. Powodzenie.

Zagadnienia

Nie wszystko jeszcze działa idealnie.

produktywność

Ansible=Polecenia Pythona są wykonywane powoli, nawet bezczynne, przez 20-30 sekund; o rząd wielkości dłuższy niż na laptopie x86. Co więcej, na początku są wykonywane dość szybko, ~ 3 sekundy, potem gwałtownie zwalniają. Być może jest to spowodowane nagrzewaniem się procesora (throttling). Kod Go jest również długi:

# запрос метрик для прометея из 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 działa, ale zatrzymuje się na Armbian po około dniu, pisze:

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
...

Pomaga tylko restart. Musimy iść dalej zrozumieć.

Ethernet

Ethernet działa, ale po ~dobie pakiety (DHCP) z R64 przestają przychodzić.
Ponowne uruchomienie interfejsu pomaga:

ifdown br0; sleep 30; ifup br0

Sterownik jest nowy, jądro nie zostało jeszcze zaakceptowane, mam nadzieję, że chiński Landen Chao skończyć.

Źródło: www.habr.com

Dodaj komentarz