Banana Pi R64 Router - Debian, Wireguard, RKN

Banana Pi 64 je jednopločno računalo slično Raspberry Piju, ali s više Ethernet priključaka, što ga čini Linux distribucijskim ruterom opće namjene.

Banana Pi R64 Router - Debian, Wireguard, RKN

Da, Openwrt već postoji, ali ima vlastiti GUI i CLI; postoji Mikrotik, ali opet ima svoj GUI / CLI, a Wireguard ne radi izvan kutije ... Općenito, želim usmjerivač s fleksibilnim postavkama, a da ostane u okviru standardnog Linuxa s kojim radite svaki dan.

U članku pod nazivima BPI, R64, single-board, mislit ću na istu stvar - samu Banana Pi R64 single-board.

Izbor slike. Preuzmi putem eMMC-a

Prva vještina koju treba steći u radu SBC općenito, a posebno s R64, to znači naučiti kako učitati OS u njega i moći komunicirati s njim, jer R64 nema priključak za monitor (HDMI, na primjer). Kad je sve palo - Wifi prestao raditi, Ethernet mreža, Bluetooth, USB itd. postoji UART preko čijeg sučelja uvijek možete vidjeti što je pošlo po zlu, a i pokrenuti par naredbi s konzole, ako je potrebno.

Algoritam povezivanja na R64 putem USB-UART-a:

  • otrčite do trgovine radiodijelova po USB-UART kabel (PL2303, Serial-to-USB)
  • jedan USB kraj spojimo na računalo, a drugi, UART, na R64, s tri od četiri žice, kao na slici ispod
  • u računalnoj konzoli pokrenuti sudo minicom

Nakon toga će se u većini slučajeva pojaviti konzola s jednom pločom = uspjeh.
Možete vidjeti više здесь.

Banana Pi R64 Router - Debian, Wireguard, RKN

Dalje, najlakši način je učitati operativni sustav sa SD kartice: preuzmite putem link sliku i prenesite je:

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

umetnemo karticu u R64 SD-utor, uključimo je, promatramo prvo učitavanje uboota na povezanoj konzoli, zatim standardno dizanje Linuxa.

Alternativna opcija pokretanja je korištenje kartice od 64 Gb već ugrađene u R8, nazvane eMMC. Prema uputama na wikiju, prepisujemo sliku na uređaj
/dev/mmcblk0 na BPI, ponovno pokreni, izvadi SD karticu, ponovno omogući BPI... i ne radi. Kako doći tamo Boot select ne zadržavaj se.

Činjenica je da barem za BPI morate postaviti posebnu oznaku kako biste se mogli dignuti s internog flash pogona:

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]

Zatim morate napisati predloader na posebnu boot particiju

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

Proizvođač R64 (Kina) objavio je ovu binarnu datoteku здесь. Što radi je nepoznato (nema izvornih kodova), ali bez njega ni to neće raditi.

Općenito, nakon toga se slike počinju učitavati iz eMMC-a. Ako želite to shvatiti i stvoriti slike od nule, tada za oba slučaja (SD / eMMC) trebate napisati još nekoliko datoteka (preloader za SD karticu, ATF, u-boot), samo da dođete do kernela čizma. Ova tema je i dalje razvija se, ali nama je glavno da radi i da je u redu.

Sada, da budem iskren, ne koristim eMMC download, SD kartice su dovoljne, ali potrošio sam dosta vremena da to radi, pa neka to bude u članku.

Izbor operativnog sustava. Armbijanac

Prvi zadatak aplikacije je pokretanje VPN-a, naravno Wireguarda. Odmah se pokazalo da nije sastavljen sa strane kernela i da nije bilo zaglavlja. Ponovno sam izgradio kernel i, iz navike s x86, izgradio modul kernela koristeći DKMS. Međutim, brzina montaže na arm64 čak i malih uslužnih programa neugodno me iznenadila. A onda je bio potreban još jedan kernel modul, i tako dalje. Općenito, ispada da je sve što se odnosi na kernel bolje sastaviti na x86 prijenosnom računalu s toplom cijevi, zatim prebaciti na R64 jednostavnim kopiranjem, ponovno pokrenuti i testirati.

Druga stvar je dio korisničkog prostora. U mom slučaju odabira Debiana, sve za arm64 arhitekturu je već na packages.debian.org i nema potrebe za ponovnom izgradnjom bilo čega.

Kako ne bih proizveo još jedan bicikl, I portiran Armbijski na BPI R64.
Ili bolje rečeno: dio korisničkog prostora je Armbian, a jezgra je preuzeta iz repozitorija Frank-A. Najnovija slika se može preuzeti здесь.

Sve aktivnosti na razvoju programskog dijela R64 provode se na forum. Općenito govoreći, sam proizvođač nastoji popularizirati Openwrt router, ali zahvaljujući aktivnosti developera Franka iz Njemačke, sve značajke brzo završavaju u Debian kernelu. Začudo, Frank je aktivan u svakoj temi foruma.

Organizacija radnog prostora: žice

Zasebno vam želim reći kako postaviti SBC (ne samo BPI) na stol tijekom razvoja / testiranja kako ne biste do njega vodili Ethernet kabel s internetskog izvora kroz cijelu sobu / ured. Činjenica je da, s jedne strane, komadu željeza trebate osigurati internet, a s druge strane, u tom komadu željeza sve se može pokvariti, a pogotovo Wifi.

Prvo sam odlučio kupiti jeftinu USB-Wifi "zviždaljku", uključiti je u jedini port na BPI i zaboraviti na žice. Da bih to učinio, kupio sam jeftin TP-LINK TL-WN725N USB 2.0, ali vrlo brzo je postalo jasno da neće uspjeti: da bi zviždaljka radila, bio je potreban upravljački program kernela, koji, naravno, nije bio tu (kasnije sam kompajlirao potreban RTL8XXXU drajver, ali je i dalje nepraktičan). I ethernet kabel je nakratko kvario pogled na sobu.

Kao rezultat toga, uspio sam se riješiti kabela uz pomoć Tenda MW3 (Wifi mesh sustav): jednostavno sam stavio jednu kocku ispod stola i metarskim Ethernet kabelom spojio BPI na LAN priključak potonjeg. Uspjeh.

Wireguard, RKN, Bird

Jedna od stvari za koje koristim Banana PI je slobodan pristup stranicama koje je blokirao RKN, posebno, tako da Telegram i pozivi Slacku rade. Članci o ovoj temi već su predloženi na Habréu: vrijeme, два, tri.

Implementirao sam implementaciju upravo takvog rješenja koristeći Ansible: link.

VPS bi trebao pokretati Ubuntu 18.04. Provjerio sam performanse na dva hostera u Europi: Amazon i Digital Ocean.

Dakle, instalirali smo gornji Armbian na R64, dostupan je preko ssh pod imenom hm-bananapi-1 i ima pristup internetu. Uvodimo sekvencijalno ansible, automatizacijske skripte i pokrećemo samu instalaciju 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

Zatim trebate implementirati naš VPN na VPS na isti način:

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

Ovdje je argument uvijek current-vpn, a sam VPS naziv je konfiguriran u varijabli (u ovom slučaju to je 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 da, prije svih ovih operacija morate generirati tajne (osobito Wireguard ključeve) u mapi ./secrets, imenik bi trebao izgledati ovako tako.

Ansible automatizacija u Pythonu

Možda ćete primijetiti da su umjesto u YAML formatu, Ansible naredbe kodirane u Python skriptama. Za usporedbu, kako omogućiti bird daemon na uobičajeni način:

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

i kako isto preko Pythona:

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

Pisanje Ansible naredbi s Python kodom omogućuje vam ponovnu upotrebu koda, a općenito su sve mogućnosti jezika opće namjene otvorene. Na primjer, instaliranje ptice na R64 i VPS:

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

vidi kod funkcije install_bird().

Ova značajka se zove pybook implementiran здесь. Još nema dokumentacije o pybooku, tada ću ispraviti ovaj nedostatak.

Što on misli uzvodno ovom prilikom.

Praćenje. Prometej

Ukupno: telegram radi, linkedin i pornhub također, općenito, korisničko iskustvo je ok. Ali sve se može slomiti, pa tako i kinesko željezo.

Ažuriranja kernela također mogu biti zanimljiva: na primjer, želio sam ažurirati kernel 5.4 => 5.6, dobro, tu je Wireguard izvan kutije, nema potrebe za krpanjem ... Rečeno nego učinjeno: mukotrpno prebačene zakrpe s 5.4 na 5.6, kernel je pokrenut, tunel do VPS-a je pingan, ali ptica se ne može povezati s pogreškom "BGP Error"… "Vraćeno natrag u užasu" (c) na 5.4; prelazak na 5.6 je odgođen u TODO.

Stoga sam uz instalaciju rutera i VPS-a dodao monitoring (na x86 Ubuntu 18.04), koji je instaliran na zasebnom hostu sa sljedećim komponentama:

  • prometheus, alertmanager, blackbox_exporter - sve u dockeru
  • upozorenja se šalju na telegram kanal pomoću metalmatze/alertmanager-bot bota - također u dockeru
  • tor za bot, tako da bot može upozoriti situacije kada je internet dostupan, ali telegram i dalje ne radi, a sam bot se ne može spojiti
  • primijenjen upozorenja: NodeVPNTroubles (nema pinga za VPS), BirdVPNTroubles (nema Bird sesije), AntifilterDownloadTroubles (nije uspjelo učitavanje blokiranih IP adresa), SiteTroubles (nesretni telegram nije dostupan)
  • sistemska upozorenja poput HostGrowingDiskReadLatency (jeftina SD kartica prestaje se čitati)

Primjer postavljanja nadzora:

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

Automatsko otkrivanje za prometheus postavljeno je na mapu /etc/prometheus/auto_http, primjer dodavanja hosta praćenju (hostovi se ne nadziru prema zadanim postavkama):

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

ZADAĆA: 2 pružatelja usluga, 2 BPI-a, bilo koji prijenos greške

Uz sve planirao sam se spojiti na dva provajdera kako bi internet nastavio raditi, makar jedan provajder imao problema s mrežom, ili su zaboravili platiti internet i sl., te ostali ljudski faktori.

Opisano je najnaprednije korisničko iskustvo na temu multi-wan здесь za Mwan3 sustav pod Openwrt. Ovo rješenje ima bogatu funkcionalnost, ali postavljanje i rad općenito za multi-wan prilično je problematičan. Samo jedan primjer: ako dođete na neke stranice s dvije IP adrese odjednom, onda im se to možda neće svidjeti, prestat će raditi => "Internet ne radi."

S obzirom na ovo iskustvo, odlučio sam da multihoming još nije prioritet, već samo failover. Iako se čini da bi u najnovijim verzijama linuxa sve trebalo raditi s jednom naredbom poput:

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

Dakle, kako bismo izbjegli jednu točku kvara, uzimamo 2 BPI-ja, svaki povezujemo s jednim pružateljem usluga, povezujemo ih zajedno i uspostavljamo međusobnu komunikaciju koja se dinamički usmjerava kroz bird / OSPF.

Nadalje, na svakoj objavljujemo istu IP adresu ako je usluga dostupna (Internet, DNS). Odnosno, nećemo sami postaviti zadanu rutu, već putem ptice. Špijunirano rješenje здесь .

Ova funkcionalnost još nije implementirana, zabrljao je podmukli koronavirus (nije sve stiglo s aliexpressa; druga online trgovina, Layta, obećala je isporuku za tjedan dana, a prošlo je više od mjesec dana; drugi pružatelj nije uspio rastegnuti kabel prije karantene, samo sam uspio napraviti rupu u zidu da izbušim kabel).

Kako naručiti R64

Sama ploča u službenoj trgovini SinoVoip.
Također je bolje naručiti odmah:

  • ishrana + informirajte EU ili US standard utikača
  • hladnjak: radijatori/ventilatori; jer se i CPU grije, i switch chip
  • wifi antena, na primjer

Postoji nijansa - cijena dostave od nekog vremena postala je neadekvatno visoka u službenoj trgovini. Menadžer Judy Huang me uvjeravao da nema greške, i možete odabrati ePacket za 5$, ali sam vidio da za Rusiju postoji samo EMS za >33$. Neugodno, ali ne kritično. Štoviše, ako odaberete bilo koju drugu zemlju za dostavu (prošao sam sve kontinente), dostava će koštati ~5$. Rusofobi?.. Ali onda sam saznao da je i za Francusku cijena dostave ~30$ i smirio se.

Kao rezultat toga, Judy je ponudila naručiti, ali ne i platiti (savjet: stavite manje na karticu da plaćanje ne ide automatski); napiši joj i ona će smanjiti cijenu dostave na normalnu. Uspjeh.

Pitanja

Još uvijek ne radi sve savršeno.

Performanse

Ansible=Python naredbe se izvršavaju sporo, čak i one u stanju mirovanja, 20-30 sekundi; red veličine duži nego na x86 laptopu. Štoviše, u početku se izvode prilično brzo, ~ 3 sekunde, a zatim se naglo usporavaju. Možda je to zbog zagrijavanja CPU-a (trottling). Go kod također dugo radi:

# запрос метрик для прометея из 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 radi, ali prestaje na Armbianu nakon otprilike jednog dana, piš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
...

Samo ponovno pokretanje pomaže. Moramo ići dalje srediti.

Ethernet

Ethernet radi, ali nakon ~ jednog dana paketi (DHCP) s R64 prestaju dolaziti.
Ponovno pokretanje sučelja pomaže:

ifdown br0; sleep 30; ifup br0

Driver je nov, kernel još nije prihvaćen, nadam se kineski Landen Chao Završi.

Izvor: www.habr.com

Dodajte komentar