Banana Pi R64-roeteerder - Debian, Wireguard, RKN

Die Banana Pi 64 is 'n enkelbord-rekenaar soortgelyk aan die Raspberry Pi, maar met verskeie Ethernet-poorte, wat dit moontlik maak om dit in 'n router te verander wat gebaseer is op 'n algemene Linux-verspreiding.

Banana Pi R64-roeteerder - Debian, Wireguard, RKN

Ja, daar is reeds Openwrt, maar dit het sy eie probleme, sy GUI en CLI; Daar is Mikrotik, maar dit het weer sy eie GUI/CLI, en Wireguard werk nie uit die boks nie... Oor die algemeen wil ek 'n router hê met buigsame instellings, terwyl ek binne die raamwerk van standaard Linux bly, wat jy werk met elke dag.

In die artikel onder die name BPI, R64, enkelbord, sal ek dieselfde bedoel - die Banana Pi R64 enkelbord self.

Die keuse van 'n beeld. Laai af via eMMC

Die heel eerste vaardigheid wat jy moet aanleer wanneer jy mee werk SBC in die algemeen, en met die R64 in die besonder, beteken dit om te leer hoe om 'n bedryfstelsel daarin te laai en om daarmee te kan kommunikeer, want die R64 het nie 'n poort vir 'n monitor nie (byvoorbeeld HDMI). Toe alles afgeval het - het Wifi, Ethernet, Bluetooth, USB, ens. opgehou werk.Daar is 'n UART, deur die koppelvlak waarvan jy altyd kan sien wat verkeerd geloop het, en ook 'n paar opdragte vanaf die konsole uitvoer, indien nodig.

Algoritme om aan R64 via USB-UART te koppel:

  • ons hardloop na die radioonderdelewinkel vir 'n USB-UART-kabel (PL2303, Serial-to-USB)
  • koppel een USB-punt aan die rekenaar, en die ander, UART, aan die R64, met drie drade uit vier, soos in die prentjie hieronder
  • hardloop in die rekenaarkonsole sudo minicom

Hierna sal in die meeste gevalle die enkelbordkonsole verskyn = sukses.
Jy kan meer sien hier.

Banana Pi R64-roeteerder - Debian, Wireguard, RKN

Vervolgens is die maklikste manier om die bedryfstelsel vanaf 'n SD-kaart te laai: laai af deur skakel prent en vul dit in:

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

Ons plaas die kaart in die R64 SD-gleuf, skakel dit aan en sien hoe die gekoppelde konsole eers uboot laai, dan standaard Linux laai.

'n Alternatiewe selflaai-opsie is om 'n 64Gb-kaart te gebruik wat reeds in die R8 ingebou is, genaamd eMMC. Volgens die instruksies in die wiki kopieer ons die prent na die toestel
/dev/mmcblk0 na BPI, herlaai, verwyder die SD-kaart, skakel BPI weer aan ... en dit werk nie. Hoe om heen en weer te gaan Boot select moenie pla nie.

Die feit is dat u ten minste vir BPI 'n spesiale vlag moet stel om vanaf 'n interne flash drive te kan begin:

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]

Vervolgens moet u voorlaaier in 'n spesiale selflaaipartisie skryf

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

Vervaardiger R64 (China) het hierdie binêre geplaas hier. Wat dit doen, is onbekend (daar is geen bronkodes nie), maar dit sal ook nie daarsonder werk nie.

Oor die algemeen begin die beelde hierna vanaf eMMC laai. As jy dit wil uitvind en beelde van nuuts af wil skep, moet jy vir beide gevalle (SD/eMMC) nog verskeie lêers skryf (voorlaaier vir SD-kaart, ATF, u-boot) net om die kern te laai. Hierdie onderwerp is nog steeds ontwikkel, maar vir ons is die belangrikste ding dat dit werk en goed is.

Nou laai ek af via eMMC, om eerlik te wees, ek gebruik dit nie, 'n SD-kaart is genoeg, maar ek het nogal baie tyd spandeer om dit te laat werk, so laat dit in die artikel wees.

Kies 'n bedryfstelsel. Armbian

Die eerste toepassingstaak is om 'n VPN, natuurlik Wireguard, te begin. Daar is dadelik ontdek dat dit aan die pitkant nie saamgestel is nie en dat daar geen kopstukke was nie. Ek het die kern herbou en, soos my gewoonte met x86 is, die kernmodule met DKMS saamgestel. Die spoed om selfs klein nutsdienste op arm64 te bou, het my egter onaangenaam verras. En dan was nog 'n kernmodule nodig, ens. Oor die algemeen blyk dit dat alles wat met die kern verband hou, die beste op 'n warm x86-skootrekenaar saamgestel word, en dan na die R64 oorgedra word deur eenvoudige kopiëring, herselflaai en getoets.

Nog 'n ding is die gebruikersruimte-deel. In my geval van die keuse van Debian, is alles vir die arm64-argitektuur reeds op packages.debian.org en dit is nie nodig om iets te herbou nie.

Om nie nog 'n fiets te vervaardig nie, het ek oorgedra armbian op BPI R64.
Of eerder, dit: die gebruikersruimte-deel is Armbian, en die kern word uit die bewaarplek geneem Frank-A. Die nuutste prent kan afgelaai word hier.

Alle aktiwiteit op die ontwikkeling van die sagteware deel van R64 word uitgevoer op die forum. Oor die algemeen streef die vervaardiger self daarna om die router vir Openwrt gewild te maak, maar danksy die aktiwiteit van die ontwikkelaar Frank uit Duitsland, beland al die kenmerke vinnig in die kern vir Debian. Verbasend genoeg is Frank aktief in elke forumdraad.

Werkspasie-organisasie: drade

Afsonderlik wil ek jou vertel hoe, tydens ontwikkeling/toetsing, 'n SBC (nie net 'n BPI) op 'n tafel plaas om nie 'n Ethernet-kabel daarheen vanaf 'n internetbron oor die hele kamer/kantoor te laat loop nie. Die feit is dat jy aan die een kant 'n stuk hardeware met internet moet voorsien, maar aan die ander kant kan alles in daardie stuk hardeware breek, en eerstens Wifi.

Eerstens het ek besluit om 'n goedkoop USB-Wifi "fluit" te koop, dit in die enigste poort op die BPI te koppel en van die drade te vergeet. Om dit te doen, het ek 'n goedkoop TP-LINK TL-WN725N USB 2.0 gekoop, maar baie gou het dit duidelik geword dat dit nie sou opstyg nie: om die fluitjie te laat werk, benodig jy 'n kernbestuurder, wat natuurlik nie daar was nie (Ek het later die nodige RTL8XXXU-bestuurder aanmekaar gesit, maar dit is steeds onprakties). En die Ethernet-kabel het die voorkoms van die kamer vir 'n rukkie bederf.

Gevolglik het ek dit reggekry om met behulp van Tenda MW3 (Wifi mesh-stelsel) van die kabel ontslae te raak: Ek het eenvoudig een kubus onder die tafel geplaas en die BPI met 'n meterlange Ethernet-kabel aan laasgenoemde se LAN-poort gekoppel. Sukses.

Wireguard, RKN, Bird

Een van die dinge waarvoor ek Banana PI wil gebruik, is om gratis toegang te hê tot webwerwe wat veral deur RKN geblokkeer is, sodat Telegram- en Slack-oproepe kan werk. Artikels oor Habré is reeds oor hierdie onderwerp voorgestel: tyd, два, 3.

Ek het presies hierdie oplossing ontplooi met Ansible: skakel.

Daar word aanvaar dat die VPS Ubuntu 18.04 gebruik. Ek het die funksionaliteit op twee gashere in Europa nagegaan: Amazon en Digital Ocean.

So, ons het bogenoemde Armbian op R64 geïnstalleer, dit is toeganklik via ssh onder die naam hm-bananapi-1 en het internettoegang. Ons ontplooi konsekwent Ansible, outomatiseringsskrifte en begin die installasie self teen 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

Vervolgens moet u ons VPN op dieselfde manier na die VPS ontplooi:

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

Hier is die argument altyd huidige-vpn, en die werklike VPS-naam is opgestel in 'n veranderlike (in hierdie geval is dit 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 ja, voor al hierdie bewerkings moet jy geheime (veral Wireguard-sleutels) in die gids genereer ./secrets, moet die gids lyk so.

Ansible Outomatisering in Python

U sal dalk sien dat in plaas daarvan om in YAML-formaat te wees, die Ansible-opdragte in Python-skrifte geënkodeer word. Ter vergelyking, hoe om die voëldemoon op die gewone manier te aktiveer:

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

en hoe om dieselfde te doen via Python:

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

Die skryf van Ansible-opdragte in Python laat jou toe om die kode te hergebruik, en maak in die algemeen al die moontlikhede van die algemene doeltaal oop. Byvoorbeeld, die installering van voël op R64 en VPS:

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

sien die funksie kode installeer_voël().

Hierdie kenmerk genoem pybook geïmplementeer hier. Daar is nog geen dokumentasie oor pybook nie, maar ek sal hierdie probleem later regstel.

Wat dink hy stroomop hieroor.

Monitering. Prometheus

Totaal: telegram werk, linkedin en pornhub ook, oor die algemeen is die gebruikerservaring ok. Maar alles kan breek, insluitend Chinese hardeware.

Kernelopdaterings kan ook interessant wees: ek wou byvoorbeeld kern 5.4 => 5.6 opdateer, wel, Wireguard is daar uit die boks, nie nodig om te pleister nie... Nie gou gesê as gedaan nie: ek het die pleisters noukeurig oorgedra vanaf 5.4 na 5.6, die kern het begin, die tonnel na die VPS het geping, maar voël kan nie met die fout "BGP Error" verbind word nie ... "Ek het met afgryse teruggerol" (c) na 5.4; Die skuif na 5.6 is in TODO uitgestel.

Daarom, benewens die installering van die router en VPS, het ek monitering bygevoeg (op x86 Ubuntu 18.04), wat op 'n aparte gasheer met die volgende komponente geïnstalleer is:

  • prometheus, alertmanager, blackbox_exporter - alles in docker
  • Waarskuwings word na die telegramkanaal gestuur met behulp van die metalmatze/alertmanager-bot bot - ook in Docker
  • tor vir die bot, sodat die bot situasies kan waarsku wanneer daar internet is, maar telegram werk steeds nie, en die bot self kan nie koppel nie
  • toegepas waarskuwings: NodeVPNTroubles (geen ping na VPS), BirdVPNTroubles (geen Bird-sessie), AntifilterDownloadTroubles (fout met die laai van geblokkeerde IP-adresse), SiteTroubles (ongelukte telegram is nie beskikbaar nie)
  • stelselwaarskuwings, byvoorbeeld HostGrowingDiskReadLatency (goedkoop SD-kaart word onleesbaar)

Monitering installasie voorbeeld:

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

Auto Discovery vir Prometheus is opgestel in die /etc/prometheus/auto_http-lêergids, 'n voorbeeld van die byvoeging van 'n gasheer tot monitering (gashere word nie by verstek gemonitor nie):

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 verskaffers, 2 BPI, anycast failover

Benewens alles, het ek beplan om aan twee verskaffers te koppel sodat die internet sal aanhou werk, al het een verskaffer probleme met die netwerk, of hulle vergeet om te betaal vir die internet, ens., en ander menslike faktore.

Die mees gevorderde gebruikerservaring oor die onderwerp van multi-wan word beskryf hier vir die Mwan3-stelsel onder Openwrt. Hierdie oplossing het ryk funksionaliteit, maar die opstel en bedryf daarvan in die algemeen vir multi-wan is nogal lastig. Net een voorbeeld: as jy na sommige werwe van twee IP-adresse op een slag kom, sal hulle dalk nie daarvan hou nie, hulle sal ophou werk => "die internet werk nie."

Met inagneming van hierdie ervaring, het ek besluit dat multihoming nog nie 'n prioriteit is nie, slegs failover. Alhoewel, dit blyk dat in die nuutste weergawes van Linux alles moet werk met een opdrag soos:

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

Dus, om 'n enkele punt van mislukking te vermy, neem ons 2 BPI's, koppel elkeen aan een verskaffer, koppel hulle aan mekaar en maak die verbinding met mekaar dinamiese roetering via voël/OSPF.

Vervolgens adverteer ons dieselfde IP-adres op elkeen as die diens beskikbaar is (internet, DNS). Dit wil sê, ons sal nie self die verstekroete stel nie, maar deur voël. Ek het die oplossing bespied hier .

Hierdie funksionaliteit is nog nie geïmplementeer nie, die verraderlike koronavirus het hier 'n truuk gespeel (nie alles het van Aliexpress af gekom nie; 'n ander aanlynwinkel, Layta, het belowe om oor 'n week af te lewer, maar meer as 'n maand is verby; die tweede verskaffer het nie tyd gehad nie om die kabel voor kwarantyn te verleng, het net daarin geslaag om 'n gat in die boor in die muur vir die kabel te kry).

Hoe om R64 te bestel

Die bord self is in die amptelike winkel SinoVoip.
Dit is ook beter om dadelik te bestel:

  • voeding + lig die EU- of Amerikaanse propstandaard in
  • hittebak: verkoelers/waaiers; want beide die SVE en die skakelaarskyfie word verhit
  • wifi antenna, byvoorbeeld

Daar is 'n nuanse - die afleweringsprys het 'n geruime tyd onvoldoende hoog geword in die amptelike winkel. Bestuurder Judy Huang het my oortuig dat daar geen fout was nie, en jy kon ePacket vir $5 kies, maar ek het gesien dat daar vir Rusland net EMS vir >$33 is. Onaangenaam, maar nie krities nie. Verder, as jy enige ander land kies vir aflewering (ek het deur al die vastelande gegaan), sal aflewering ~$5 kos. Russofobe?.. Maar toe vind ek dat vir Frankryk die afleweringsprys ook ~30$ is, en ek het kalmeer.

Gevolglik het Judy aangebied om 'n bestelling te plaas, maar nie te betaal nie (WENK: sit minder op die kaart sodat die outomatiese betaling nie deurgaan nie); skryf aan haar en sy sal die afleweringsprys na normaal verlaag. Sukses.

Kwessies

Alles werk nog nie perfek nie.

produktiwiteit

Ansible=Python-opdragte word stadig uitgevoer, selfs ledige, vir 20-30 sekondes; 'n orde van grootte langer as op 'n x86-skootrekenaar. Boonop word hulle eers redelik vinnig uitgevoer, ~3 sekondes, dan vertraag hulle skerp. Dit kan wees as gevolg van die SVE wat opwarm (versmoor). Die Go-kode neem ook lank om te werk:

# запрос метрик для прометея из 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 werk, maar op Armbian stop dit na ongeveer 'n dag, skryf:

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

Net 'n herbegin help. Ons moet aanbeweeg uitsorteer.

Ethernet

Ethernet werk, maar na ~64 uur hou pakkies (DHCP) vanaf RXNUMX op om te arriveer.
Om die koppelvlak te herbegin help:

ifdown br0; sleep 30; ifup br0

Die drywer is nuut, dit is nog nie in die kern aanvaar nie, ek hoop dit is Chinese Landen Chao maak dit klaar.

Bron: will.com

Voeg 'n opmerking