Banana Pi R64 router - Debian, Wireguard, RKN

De Banana Pi 64 is in single-board komputer fergelykber mei de Raspberry Pi, mar mei ferskate Ethernet-ports, wêrtroch it mooglik is om it te feroarjen yn in router basearre op in algemiene doel Linux-distribúsje.

Banana Pi R64 router - Debian, Wireguard, RKN

Ja, der is al Openwrt, mar it hat syn eigen problemen, syn GUI en CLI; Der is Mikrotik, mar it hat wer in eigen GUI / CLI, en Wireguard wurket net út 'e doaze ... Yn it algemien, ik wol in router mei fleksibele ynstellings, wylst bliuwe binnen it ramt fan standert Linux, dêr't jo wurkje mei elke dei.

Yn it artikel ûnder de nammen BPI, R64, single-board, sil ik itselde betsjutte - it Banana Pi R64 single-board sels.

Kies in ôfbylding. Download fia eMMC

De alderearste feardigens dy't jo moatte krije as jo wurkje mei SBC yn it algemien, en mei de R64 yn it bysûnder, dit betsjut leare hoe te laden in bestjoeringssysteem yn it en kinne omgean mei it, omdat de R64 hat gjin haven foar in monitor (HDMI, bygelyks). Doe't alles foel ôf - Wifi, Ethernet, Bluetooth, USB, ensfh stopte wurkjen. D'r is in UART, troch de ynterface wêrfan jo altyd kinne sjen wat der ferkeard gie, en ek in pear kommando's útfiere fan 'e konsole, as it nedich is.

Algoritme foar ferbining mei R64 fia USB-UART:

  • wy rinne nei de winkel foar radio-ûnderdielen foar in USB-UART-kabel (PL2303, Serial-to-USB)
  • ferbine ien USB-ein oan 'e kompjûter, en de oare, UART, oan' e R64, mei trije fan 'e fjouwer draden, lykas yn' e foto hjirûnder
  • rinne yn 'e kompjûter konsole sudo minicom

Hjirnei sil yn de measte gefallen de single-board konsole ferskine = súkses.
Jo kinne mear details sjen hjir.

Banana Pi R64 router - Debian, Wireguard, RKN

Dêrnei is de maklikste manier om it bestjoeringssysteem fan in SD-kaart te laden: download troch link ôfbylding en folje it:

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

Wy ynfoegje de kaart yn it R64 SD-slot, skeakelje it oan, en observearje de ferbûne konsole dy't earst uboot laden, dan standert Linux laden.

In alternatyf bootopsje brûkt in 64Gb-kaart dy't al yn 'e R8 boud is, eMMC neamd. Neffens de ynstruksjes yn 'e wiki kopiearje wy de ôfbylding nei it apparaat
/ dev / mmcblk0 to BPI, nij opstarte, fuortsmite de SD card, oansette BPI wer ... en it wurket net. Hoe om te gean hinne en wer Boot select net lestich falle.

It feit is dat jo op syn minst foar BPI in spesjale flagge moatte ynstelle om te booten fan in ynterne flash drive:

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]

Folgjende, jo moatte skriuwe preloader yn in spesjale boot partition

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

Fabrikant R64 (Sina) pleatste dit binêr hjir. Wat it docht is ûnbekend (der binne gjin boarne koades), mar it sil ek net wurkje sûnder.

Yn 't algemien begjinne de ôfbyldings nei dit te laden fan eMMC. As jo ​​​​it útfine wolle en ôfbyldings fanôf it begjin meitsje, dan moatte jo foar beide gefallen (SD / eMMC) ferskate mear bestannen skriuwe (preloader foar SD-kaart, ATF, u-boot) gewoan om de kernel te laden. Dit ûnderwerp is noch ûntwikkelet, mar foar ús is it wichtichste dat it wurket en goed.

No download ik fia eMMC, om earlik te wêzen, ik brûk it net, in SD-kaart is genôch, mar ik haw in protte tiid bestege om it te wurkjen, dus lit it yn it artikel wêze.

Selektearje in bestjoeringssysteem. Armbian

De earste applikaasjetaak is om in VPN te starten, fansels Wireguard. It waard fuortendaliks ûntdutsen dat oan 'e kearnkant it net gearstald wie en der wiene gjin kopteksten. Ik haw de kernel opnij boud en, lykas myn gewoante is mei x86, de kernelmodule gearstald mei DKMS. De snelheid fan it bouwen fan sels lytse nutsbedriuwen op arm64 ferraste my lykwols onaangenaam. En dan wie in oare kernelmodule nedich, ensfh. Yn 't algemien docht bliken dat alles relatearre oan' e kernel it bêste is gearstald op in waarme x86-laptop, dan oerbrocht nei de R64 troch ienfâldich kopiearjen, opnij opstarten en hifke.

In oar ding is it diel fan 'e brûkersromte. Yn myn gefal fan it kiezen fan Debian, alles foar de arm64-arsjitektuer is al op packages.debian.org en d'r is net nedich om neat op te bouwen.

Om gjin oare fyts te produsearjen, haw ik ported armbian op BPI R64.
Of leaver, dit: it diel fan 'e brûkersromte is Armbian, en de kearn is nommen út it repository Frank-IN. De lêste ôfbylding kin ynladen wurde hjir.

Alle aktiviteit op de ûntwikkeling fan de software diel fan R64 wurdt útfierd op foarum. Yn 't algemien stribbet de fabrikant sels om de router foar Openwrt te popularisearjen, mar troch de aktiviteit fan' e ûntwikkelder Frank út Dútslân komme alle funksjes fluch yn 'e kearn foar Debian. Ferrassend, Frank is aktyf yn elke foarum thread.

Wurkromte organisaasje: wires

Apart wol ik jo fertelle hoe't, tidens ûntwikkeling / testen, in SBC (net allinich in BPI) op in tafel pleatse om net in Ethernet-kabel nei it te rinnen fan in ynternetboarne oer de heule keamer / kantoar. It feit is dat jo oan 'e iene kant in stik hardware moatte leverje mei ynternet, mar oan' e oare kant kin alles yn dat stik hardware brekke, en earst Wifi.

Earst besleat ik in goedkeap USB-Wifi "fluit" te keapjen, plug it yn 'e ienige haven op' e BPI en ferjit oer de draden. Om dit te dwaan, kocht ik in goedkeape TP-LINK TL-WN725N USB 2.0, mar al gau waard dúdlik dat it net fuort soe: om it fluitjen te wurkjen, hawwe jo in kernel-bestjoerder nedich, dy't der fansels net wie (letter haw ik de nedige RTL8XXXU-bestjoerder gearstald, mar it is noch altyd ûnpraktysk). En de Ethernet-kabel bedoarn it uterlik fan 'e keamer in skoft.

As gefolch, ik slagge te ûntdwaan fan 'e kabel mei help fan Tenda MW3 (Wifi mesh systeem): Ik pleatste gewoan ien kubus ûnder de tafel en ferbûn de BPI oan de lêste syn LAN haven mei in meter-lange Ethernet kabel. Sukses.

Wireguard, RKN, Bird

Ien fan 'e dingen wêr't ik Banana PI foar brûke wol is fergees tagong te hawwen ta siden blokkearre troch RKN, benammen, sadat Telegram- en Slack-oproppen kinne wurkje. Artikels oer Habré binne al foarsteld oer dit ûnderwerp: kearen, два, trije.

Ik haw krekt dizze oplossing ynset mei Ansible: link.

De VPS wurdt oannommen dat Ubuntu 18.04 draait. Ik kontrolearre de funksjonaliteit op twa hosters yn Europa: Amazon en Digital Ocean.

Dat, wy hawwe de boppesteande Armbian ynstalleare op R64, it is tagonklik fia ssh ûnder de namme hm-bananapi-1 en hat ynternet tagong. Wy ynsette konsekwint Ansible, automatisearring skripts en lansearje de ynstallaasje sels op 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

Folgjende moatte jo ús VPN op deselde manier ynsette nei de VPS:

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

Hjir is it argumint altyd aktueel-vpn, en de eigentlike VPS-namme is konfigureare yn in fariabele (yn dit gefal is it 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

Oh ja, foar al dizze operaasjes moatte jo geheimen generearje (benammen Wireguard-kaaien) yn 'e map ./secrets, de map moat der útsjen so.

Ansible Automatisearring yn Python

Jo kinne merke dat ynstee fan yn YAML-formaat te wêzen, binne de Ansible-kommando's kodearre yn Python-skripts. Foar fergeliking, hoe kinne jo de fûgeldaemon ynskeakelje op 'e gewoane manier:

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

en hoe te dwaan itselde fia Python:

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

It skriuwen fan Ansible kommando's yn Python lit jo de koade opnij brûke, en iepenet yn 't algemien alle mooglikheden fan' e algemiene doeltaal. Bygelyks, ynstallaasje fan fûgel op R64 en VPS:

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

sjoch de funksje koade install_bird().

Dizze funksje neamd pybook útfierd hjir. D'r is noch gjin dokumintaasje oer pybook, mar ik sil dit probleem letter oplosse.

Wat tinkt er opstream oer dit.

Monitoring. Prometheus

Totaal: telegram wurket, linkedin en pornhub ek, yn 't algemien is de brûkersûnderfining ok. Mar alles kin brekke, ynklusyf Sineeske hardware.

Kernel-updates kinne ek nijsgjirrich wêze: ik woe bygelyks kernel 5.4 => 5.6 bywurkje, no, Wireguard is der út 'e doaze, net nedich om te patchjen ... Net earder sein as dien: ik haw de patches mei soarch oerbrocht fan 5.4 nei 5.6, de kearn begûn up, de tunnel nei de VPS pinged, mar fûgel kin net ferbine mei de flater "BGP Error" ... "Ik rôle werom yn horror" (c) nei 5.4; De ferhuzing nei 5.6 waard yn TODO útsteld.

Dêrom haw ik, neist it ynstallearjen fan de router en VPS, tafersjoch tafoege (op x86 Ubuntu 18.04), dy't is ynstalleare op in aparte host mei de folgjende komponinten:

  • prometheus, alertmanager, blackbox_exporter - allegear yn docker
  • Alerts wurde stjoerd nei it telegramkanaal mei de metalmatze/alertmanager-bot bot - ek yn Docker
  • tor foar de bot, sadat de bot situaasjes kin warskôgje as d'r ynternet is, mar Telegram wurket noch altyd net, en de bot sels kin net ferbine
  • tapast warskôgings: NodeVPNTroubles (gjin ping nei VPS), BirdVPNTroubles (gjin Bird-sesje), AntifilterDownloadTroubles (flater by it laden fan blokkearre IP-adressen), SiteTroubles (ûnbedoeld telegram is net beskikber)
  • systeem warskôgings, bygelyks, HostGrowingDiskReadLatency (goedkeape SD-kaart wurdt net lêsber)

Foarbyld fan tafersjoch ynstallaasje:

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

Auto Discovery foar Prometheus is konfigurearre yn 'e map /etc/prometheus/auto_http, in foarbyld fan it tafoegjen fan in host foar tafersjoch (hosts wurde standert net kontrolearre):

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

Neist alles wie ik fan plan om te ferbinen mei twa providers sadat it ynternet soe bliuwe wurkjen, sels as ien provider hie problemen mei it netwurk, of se fergeat te beteljen foar it ynternet, ensfh, en oare minsklike faktoaren.

De meast avansearre brûkersûnderfining oer it ûnderwerp fan multi-wan wurdt beskreaun hjir foar it Mwan3-systeem ûnder Openwrt. Dizze oplossing hat rike funksjonaliteit, mar it ynstellen en operearjen fan it yn 't algemien foar multi-wan is frij lestich. Krekt ien foarbyld: as jo op guon siden komme fan twa IP-adressen tagelyk, sille se it miskien net leuk fine, se stopje mei wurkjen => "It ynternet wurket net."

Mei dizze ûnderfining yn 'e rekken, besleat ik dat multihoming noch gjin prioriteit is, allinich failover. Hoewol, it liket derop dat yn 'e lêste ferzjes fan Linux alles moat wurkje mei ien kommando lykas:

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

Dat, om in inkeld punt fan mislearring te foarkommen, nimme wy 2 BPI's, ferbine elk mei ien provider, ferbine se mei elkoar en meitsje de ferbining mei elkoar dynamyske routing fia fûgel / OSPF.

Dêrnei advertearje wy itselde IP-adres op elk as de tsjinst beskikber is (ynternet, DNS). Dat is, wy sille de standertrûte net sels ynstelle, mar troch fûgel. Ik bispiede de oplossing hjir .

Dizze funksjonaliteit is noch net ymplementearre, it ferrifeljende coronavirus spile hjir in trúk (net alles kaam fan Aliexpress; in oare online winkel, Layta, beloofde oer in wike te leverjen, mar mear as in moanne is ferrûn; de twadde provider hie gjin tiid om de kabel te ferlingjen foar quarantaine, allinich slagge om in gat yn te boarjen yn 'e muorre foar de kabel).

Hoe te bestellen R64

It boerd sels is yn 'e offisjele winkel SinoVoip.
It is ek better om fuortendaliks te bestellen:

  • iten + ynformearje EU as US plug standert
  • heatsink: radiatoren / fans; om't sawol de CPU as de switch-chip opwaarme
  • wifi antenne, bygelyks

Der is in nuânse - de levering priis is wurden ûnfoldwaande heech yn 'e offisjele winkel foar in skoft. Manager Judy Huang oertsjûge my dat der gjin flater, en do koe kieze ePacket foar $ 5, mar ik seach dat foar Ruslân d'r allinnich EMS foar> $ 33. Onaangenaam, mar net kritysk. Boppedat, as jo in oar lân kieze foar levering (ik gie troch alle kontininten), sil levering ~ $ 5 kostje. Russophobes? .. Mar doe fûn ik dat foar Frankryk de leveringspriis ek ~30 $ is, en ik bedarre.

As gefolch hat Judy oanbean om in bestelling te pleatsen, mar net te beteljen (hint: set minder op de kaart sadat de automatyske betelling net trochgiet); skriuw har en se sil de leveringspriis werombringe nei normaal. Sukses.

saken

Noch net alles wurket perfekt.

Produktiviteit

Ansible=Python-kommando's wurde stadich útfierd, sels idle, foar 20-30 sekonden; in folchoarder fan grutte langer as op in x86 laptop. Boppedat wurde se earst frij fluch útfierd, ~3 sekonden, dan fertrage se hurd. Dit kin wêze trochdat de CPU ferwaarming (throttling). De Go-koade duorret ek lang om te wurkjen:

# запрос метрик для прометея из 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 wurket, mar op Armbian stopt it nei sawat in dei, skriuwt:

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

Allinnich in trochstart helpt. Wy moatte fierder útsykje.

Ethernet

Ethernet wurket, mar nei ~ 64 oeren pakketten (DHCP) út RXNUMX stopje oankommen.
De ynterface opnij starte helpt:

ifdown br0; sleep 30; ifup br0

De bestjoerder is nij, it is noch net akseptearre yn 'e kernel, ik hoopje dat it Sineeske Landen Chao is makket it ôf.

Boarne: www.habr.com

Add a comment