Banana Pi R64 -reititin – Debian, Wireguard, RKN

Banana Pi 64 on yksilevyinen tietokone, joka on samanlainen kuin Raspberry Pi, mutta siinä on useita Ethernet-portteja, mikä mahdollistaa sen muuttamisen yleiskäyttöiseen Linux-jakeluun perustuvaksi reitittimeksi.

Banana Pi R64 -reititin – Debian, Wireguard, RKN

Kyllä, Openwrt on jo olemassa, mutta sillä on omat ongelmansa, sen GUI ja CLI; Mikrotik on olemassa, mutta siinä on taas oma GUI/CLI, ja Wireguard ei toimi heti paketista... Yleensä haluan reitittimen joustavilla asetuksilla, mutta pysyen normaalin Linuxin puitteissa, jota käytät jokaisen päivän kanssa.

Artikkelissa nimillä BPI, R64, yksilevy, tarkoitan samaa - itse Banana Pi R64 -yksilevyistä.

Kuvan valinta. Lataa eMMC:n kautta

Ensimmäinen taito, jonka kanssa sinun on hankittava työskennellessäsi SBC yleensä ja erityisesti R64:n kanssa tämä tarkoittaa sitä, että opettelee lataamaan käyttöjärjestelmä siihen ja olemaan vuorovaikutuksessa sen kanssa, koska R64:ssä ei ole porttia näytölle (esim. HDMI). Kun kaikki romahti - lakkasi toimimasta Wifi, Ethernet, Bluetooth, USB jne.. Siellä on UART, jonka käyttöliittymän kautta näet aina mikä meni pieleen ja tarvittaessa myös pari komentoa ajaa konsolista.

Algoritmi liittämiseen R64:ään USB-UARTin kautta:

  • lähdemme radioosien myymälään hakemaan USB-UART-kaapelia (PL2303, sarja-USB)
  • liitä toinen USB-pää tietokoneeseen ja toinen, UART, R64:ään, kolmella johdolla neljästä, kuten alla olevassa kuvassa
  • ajaa tietokonekonsolissa sudo minicom

Tämän jälkeen useimmissa tapauksissa yksilevykonsoli tulee näkyviin = menestys.
Voit nähdä lisätietoja täällä.

Banana Pi R64 -reititin – Debian, Wireguard, RKN

Seuraavaksi helpoin tapa on ladata käyttöjärjestelmä SD-kortilta: lataa linkki kuva ja täytä se:

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

Asetamme kortin R64 SD -paikkaan, käynnistämme sen ja tarkkailemme, että kytketty konsoli latautuu ensin ubootin ja sitten tavallisen Linux-latauksen.

Vaihtoehtoinen käynnistysvaihtoehto on käyttää R64:ään jo sisäänrakennettua 8 Gt:n korttia, nimeltään eMMC. Wikin ohjeiden mukaan kopioimme kuvan laitteelle
/dev/mmcblk0 BPI:hen, käynnistä uudelleen, poista SD-kortti, käynnistä BPI uudelleen... ja se ei toimi. Kuinka mennä edestakaisin Boot select älä vaivaudu.

Tosiasia on, että ainakin BPI:lle sinun on asetettava erityinen lippu, jotta voit käynnistää sisäiseltä flash-asemalta:

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]

Seuraavaksi sinun on kirjoitettava esilataaja erityiseen käynnistysosioon

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

Valmistaja R64 (Kiina) julkaisi tämän binaarin täällä. Mitä se tekee, on tuntematon (ei ole lähdekoodeja), mutta se ei myöskään toimi ilman sitä.

Yleensä tämän jälkeen kuvat alkavat latautua eMMC:stä. Jos haluat selvittää sen ja luoda kuvia tyhjästä, niin molemmissa tapauksissa (SD/eMMC) sinun on kirjoitettava useita tiedostoja (SD-kortin esilataus, ATF, u-boot) vain ytimen lataamiseen. Tämä aihe on edelleen on kehittymässä, mutta meille tärkeintä on, että se toimii ja ok.

Nyt lataan eMMC:n kautta, rehellisesti sanottuna en käytä sitä, SD-kortti riittää, mutta vietin melko paljon aikaa sen toimimiseen, joten olkoon se artikkelissa.

Käyttöjärjestelmän valinta. Armbialainen

Ensimmäinen sovellustehtävä on käynnistää VPN, luonnollisesti Wireguard. Heti havaittiin, että ytimen puolella sitä ei ollut koottu eikä otsikoita ollut. Rakensin ytimen uudelleen ja kuten tapani x86:lla, kokosin ydinmoduulin DKMS:n avulla. Kuitenkin pientenkin apuohjelmien rakentamisen nopeus arm64:lle yllätti minut epämiellyttävästi. Ja sitten vaadittiin toinen ydinmoduuli jne. Yleisesti ottaen käy ilmi, että kaikki ytimeen liittyvä kootaan parhaiten lämpimään x86-kannettavaan, siirretään sitten R64:ään yksinkertaisesti kopioimalla, käynnistetään uudelleen ja testataan.

Toinen asia on userspace-osa. Jos valitsen Debianin, kaikki arm64-arkkitehtuurille on jo paketti.debian.org -sivustolla, eikä mitään tarvitse rakentaa uudelleen.

Jotta en valmistaisi toista polkupyörää, I siirretty Armbialainen BPI R64:ssä.
Tai pikemminkin tämä: userspace-osa on Armbian, ja ydin on otettu arkistosta Vilpitön-A. Uusimman kuvan voi ladata täällä.

Kaikki R64:n ohjelmistoosan kehittämiseen liittyvät toimet suoritetaan foorumi. Yleisesti ottaen valmistaja itse pyrkii popularisoimaan reititintä Openwrtille, mutta saksalaisen Frankin toiminnan ansiosta kaikki ominaisuudet päätyvät nopeasti Debianin ytimeen. Yllättäen Frank on aktiivinen jokaisessa foorumin säikeessä.

Työtilan organisaatio: johdot

Haluaisin erikseen kertoa, kuinka SBC (ei vain BPI) sijoitetaan pöydälle kehitys-/testauksen aikana, jotta siihen ei kulje Ethernet-kaapelia Internet-lähteestä koko huoneessa/toimistossa. Tosiasia on, että toisaalta sinun on annettava laitteistolle Internet, mutta toisaalta kaikki kyseisessä laitteistossa voi hajota, ja ennen kaikkea Wifi.

Ensin päätin ostaa halvan USB-Wifi-pillin, kytkeä sen BPI:n ainoaan porttiin ja unohtaa johdot. Tätä varten ostin edullisen TP-LINK TL-WN725N USB 2.0:n, mutta pian kävi selväksi, että se ei nouse: jotta pilli toimisi, tarvitset ytimen ohjaimen, jota ei tietenkään ollut siellä. (myöhemmin kokosin tarvittavan RTL8XXXU-ohjaimen, mutta se on edelleen epäkäytännöllinen ). Ja Ethernet-kaapeli pilasi huoneen ilmettä hetkeksi.

Tuloksena pääsin kaapelista eroon Tenda MW3:n (Wifi mesh system) avulla: laitoin yksinkertaisesti yhden kuution pöydän alle ja liitin BPI:n sen LAN-porttiin metrin pituisella Ethernet-kaapelilla. Menestys.

Wireguard, RKN, Bird

Yksi asioista, joihin haluan käyttää Banana PI:tä, on saada vapaa pääsy erityisesti RKN:n estämille sivustoille, jotta Telegram- ja Slack-puhelut voivat toimia. Habresta on jo ehdotettu artikkeleita tästä aiheesta: aika, два, kolme.

Otin käyttöön juuri tämän ratkaisun Ansiblen avulla: linkki.

VPS:ssä oletetaan toimivan Ubuntu 18.04. Tarkistin toimivuuden kahdella isännöitsijällä Euroopassa: Amazonissa ja Digital Oceanissa.

Joten asensimme yllä olevan Armbianin R64: lle, se on käytettävissä ssh: n kautta nimellä hm-bananapi-1 ja siinä on internetyhteys. Otamme johdonmukaisesti käyttöön Ansible-automaatiokomentosarjat ja käynnistämme itse asennuksen R64:ssä:

# зависимости для 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

Seuraavaksi sinun on otettava VPN käyttöön VPS:ään samalla tavalla:

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

Tässä argumentti on aina current-vpn, ja todellinen VPS-nimi on määritetty muuttujassa (tässä tapauksessa se on 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

Voi kyllä, ennen kaikkia näitä toimintoja sinun on luotava salaisuudet (erityisesti Wireguard-avaimet) kansioon ./secrets, hakemiston pitäisi näyttää tältä niin.

Mahdollinen automaatio Pythonissa

Saatat huomata, että sen sijaan, että ne olisivat YAML-muodossa, Ansible-komennot on koodattu Python-skripteillä. Vertailun vuoksi, kuinka lintudemoni otetaan käyttöön tavallisella tavalla:

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

ja kuinka tehdä sama Pythonilla:

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

Ansible-komentojen kirjoittaminen Pythonissa mahdollistaa koodin uudelleenkäytön ja avaa yleisesti kaikki yleiskäyttöisen kielen mahdollisuudet. Esimerkiksi lintujen asentaminen R64:ään ja VPS:ään:

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

katso toimintokoodi install_bird().

Tämä ominaisuus nimeltä pybook toteutettu täällä. Pybookista ei ole vielä dokumentaatiota, mutta korjaan tämän ongelman myöhemmin.

Mitä hän ajattelee yläjuoksulla tästä.

Valvonta. Prometheus

Yhteensä: sähke toimii, linkedin ja pornhub myös, pääsääntöisesti käyttökokemus on ok. Mutta kaikki voi rikkoutua, myös kiinalainen laitteisto.

Ytimen päivitykset voivat myös olla mielenkiintoisia: esimerkiksi halusin päivittää ytimen 5.4 => 5.6, no, Wireguard on heti valmiina, ei tarvitse paikata... Heti sanottu kuin tehty: Siirsin huolella korjaukset versiosta 5.4 5.6:een, ydin käynnistyi, tunneli VPS:ään pingattiin, mutta lintu ei voi muodostaa yhteyttä virheilmoituksella "BGP Error" ... "Käydin kauhuissani" (c) kohtaan 5.4; Siirto 5.6:een lykättiin TODOssa.

Siksi reitittimen ja VPS:n asennuksen lisäksi lisäsin valvonnan (x86 Ubuntu 18.04), joka asennetaan erilliseen isäntään seuraavilla komponenteilla:

  • prometheus, alertmanager, blackbox_exporter - kaikki dockerissa
  • Hälytykset lähetetään sähkekanavalle metalmatze/alertmanager-bot-botilla - myös Dockerissa
  • tor bottia varten, jotta botti voi varoittaa tilanteista, kun Internet on olemassa, mutta Telegram ei silti toimi, eikä botti itse voi muodostaa yhteyttä
  • sovelletaan hälytyksiä: NodeVPNTroubles (ei pingiä VPS:ään), BirdVPNTroubles (ei Bird-istuntoa), AntifilterDownloadTroubles (virhe ladattaessa estettyjä IP-osoitteita), SiteTroubles (onninen sähke ei ole saatavilla)
  • järjestelmähälytykset, esimerkiksi HostGrowingDiskReadLatency (halpa SD-kortti muuttuu lukukelvottomaksi)

Esimerkki valvontaasennuksesta:

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

Auto Discovery for Prometheus on määritetty /etc/prometheus/auto_http-kansiossa, esimerkki isännän lisäämisestä valvontaan (isäntiä ei valvota oletuksena):

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 palveluntarjoajaa, 2 BPI, anycast vikasieto

Kaiken lisäksi suunnittelin yhdistäväni kahteen palveluntarjoajaan, jotta netti toimisi jatkossakin, vaikka yhdellä palveluntarjoajalla olisi ongelmia verkon kanssa tai unohtanut maksaa netin tms. ja muut inhimilliset tekijät.

Kuvataan edistynein käyttäjäkokemus multi-wan-aiheesta täällä Mwan3-järjestelmälle Openwrt. Tässä ratkaisussa on runsaasti toimintoja, mutta sen asentaminen ja käyttäminen yleensä monikäyttöisille laitteille on melko hankalaa. Vain yksi esimerkki: jos tulet joillekin sivustoille kahdesta IP-osoitteesta kerralla, he eivät ehkä pidä siitä, ne lakkaavat toimimasta => "Internet ei toimi."

Tämän kokemuksen perusteella päätin, että multihoming ei ole vielä prioriteetti, vain vikasieto. Vaikuttaa kuitenkin siltä, ​​että Linuxin uusimmissa versioissa kaiken pitäisi toimia yhdellä komennolla, kuten:

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

Joten välttääksemme yhden epäonnistumisen otamme 2 BPI:tä, yhdistämme kukin yhteen palveluntarjoajaan, yhdistämme ne toisiinsa ja muodostamme yhteyden toisiinsa dynaamisen reitityksen bird/OSPF:n kautta.

Seuraavaksi mainostamme samaa IP-osoitetta jokaisessa, jos palvelu on saatavilla (Internet, DNS). Eli emme aseta oletusreittiä itse, vaan linnun kautta. Luin ratkaisun täällä .

Tätä toimintoa ei ole vielä otettu käyttöön, salakavala koronavirus teki tempun tässä (kaikki ei saapunut Aliexpressistä; toinen verkkokauppa, Layta, lupasi toimittaa viikossa, mutta yli kuukausi on kulunut; toisella tarjoajalla ei ollut aikaa kaapelin jatkamiseksi ennen karanteenia, onnistui vain saamaan seinään reiän kaapelia varten).

Kuinka tilata R64

Itse taulu on virallisessa myymälässä SinoVoip.
On myös parempi tilata heti:

  • ruoka + Ilmoita EU- tai USA-pistokestandardi
  • jäähdytyslevy: patterit/tuulettimet; koska sekä CPU että kytkinsiru kuumenevat
  • wifi antenni, esimerkiksi

On vivahde - toimitushinta on noussut liian korkeaksi virallisessa myymälässä jo jonkin aikaa. Manager Judy Huang vakuutti minut, että virhettä ei ollut, ja voit valita ePacketin hintaan 5 dollaria, mutta näin, että Venäjällä on vain EMS yli 33 dollaria. Epämiellyttävä, mutta ei kriittinen. Lisäksi, jos valitset toimitukseen jonkin muun maan (kävelin kaikki maanosat), toimitus maksaa ~5 dollaria. Russofobit?.. Mutta sitten huomasin, että Ranskalle toimitushinta on myös ~30$, ja rauhoittelin.

Tämän seurauksena Judy tarjoutui tekemään tilauksen, mutta ei maksanut (vihje: laita kortille vähemmän, jotta automaattinen maksu ei mene läpi); Kirjoita hänelle, niin hän laskee toimitushinnan normaaliksi. Menestys.

Kysymykset

Kaikki ei vielä toimi täydellisesti.

Suorituskyky

Ansible=Python-komennot suoritetaan hitaasti, jopa käyttämättömät, 20-30 sekuntia; suuruusluokkaa pidempi kuin x86 kannettavassa. Lisäksi ne suoritetaan aluksi melko nopeasti, ~3 sekuntia, sitten ne hidastuvat jyrkästi. Tämä voi johtua suorittimen lämpenemisestä (kuristuksesta). Go-koodin toimiminen kestää myös kauan:

# запрос метрик для прометея из 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 toimii, mutta Armbianilla se pysähtyy noin päivän kuluttua, kirjoittaa:

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

Vain uudelleenkäynnistys auttaa. Meidän on edettävä selvittää.

Ethernet

Ethernet toimii, mutta ~64 tunnin kuluttua paketit (DHCP) RXNUMX:stä lakkaavat saapumasta.
Käyttöliittymän uudelleen käynnistäminen auttaa:

ifdown br0; sleep 30; ifup br0

Ohjain on uusi, sitä ei ole vielä hyväksytty ytimeen, toivottavasti se on kiinalainen Landen Chao viimeistelee sen.

Lähde: will.com

Lisää kommentti