Banana Pi R64 bideratzailea - Debian, Wireguard, RKN

Banana Pi 64 Raspberry Pi-ren antzeko plaka bakarreko ordenagailua da, baina Ethernet hainbat ataka dituena, eta horri esker, helburu orokorreko Linux banaketan oinarritutako bideratzaile bihurtzea posible da.

Banana Pi R64 bideratzailea - Debian, Wireguard, RKN

Bai, dagoeneko badago Openwrt, baina baditu bere arazoak, bere GUI eta CLI; Mikrotik dago, baina berriro ere bere GUI/CLI du, eta Wireguard-ek ez du kaxatik kanpo funtzionatzen... Orokorrean, ezarpen malguak dituen router bat nahi dut, zuk lan egiten duzun Linux estandarraren esparruan mantenduz. egunero.

BPI, R64, taula bakarra izenen pean dagoen artikuluan, gauza bera esan nahi dut: Banana Pi R64 plaka bakarra bera.

Irudi bat aukeratzea. Deskargatu eMMC bidez

Lanean lortu behar duzun lehen trebetasuna SBC orokorrean, eta R64rekin bereziki, sistema eragile bat bertan kargatzen ikastea eta harekin elkarreragin ahal izatea esan nahi du, R64-k ez baitu monitore baterako atakarik (HDMI, adibidez). Dena erori zenean - Wifi, Ethernet, Bluetooth, USB, etab. funtzionatzeari utzi zion. UART bat dago, zeinaren interfazearen bidez beti ikusi ahal izango duzu zer gertatu den gaizki, eta, halaber, kontsolatik komando pare bat exekutatu, behar izanez gero.

USB-UART bidez R64-ra konektatzeko algoritmoa:

  • irratiko piezen dendara joaten gara USB-UART kable bat lortzeko (PL2303, Serial-to-USB)
  • konektatu USB mutur bat ordenagailura, eta bestea, UART, R64ra, lautik hiru harirekin, beheko irudian bezala
  • exekutatu ordenagailuaren kontsolan sudo minicom

Horren ostean, kasu gehienetan taula bakarreko kontsola agertuko da = arrakasta.
Xehetasun gehiago ikus ditzakezu Hemen.

Banana Pi R64 bideratzailea - Debian, Wireguard, RKN

Ondoren, modurik errazena sistema eragilea SD txartel batetik kargatzea da: deskargatu by link irudia eta bete:

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

Txartela R64 SD zirrikituan sartzen dugu, pizten dugu eta konektatutako kontsola lehenik uboot-a kargatzen dela ikusten dugu, ondoren Linux-en karga estandarra.

Abioko aukera alternatibo bat R64-n dagoeneko integratutako 8 Gb-ko txartela erabiltzea da, eMMC izenekoa. Wikiko argibideen arabera, irudia gailuan kopiatzen dugu
/dev/mmcblk0 BPIra, berrabiarazi, SD txartela kendu, BPI berriro piztu... eta ez du funtzionatzen. Nola joan eta aurrera Boot select ez kezkatu.

Kontua da BPIrentzat gutxienez bandera berezi bat ezarri behar duzula barneko flash drive batetik abiarazi ahal izateko:

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]

Ondoren, aurrekargatzailea abiarazteko partizio berezi batean idatzi behar duzu

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

R64 fabrikatzaileak (Txina) bitar hau argitaratu du Hemen. Zer egiten duen ezezaguna da (ez dago iturburu-koderik), baina hori gabe ere ez du funtzionatuko.

Oro har, honen ondoren, irudiak eMMC-tik kargatzen hasten dira. Irudikatu eta hutsetik irudiak sortu nahi badituzu, bi kasuetarako (SD/eMMC) hainbat fitxategi gehiago idatzi behar dituzu (SD txartelaren aurrekargatzailea, ATF, u-boot) nukleoa kargatzera iristeko. Gai hau oraindik dago garatzen da, baina guretzat gauza nagusia da funtzionatzen duela eta ondo.

Orain eMMC bidez deskargatzen dut, egia esan, ez dut erabiltzen, SD txartela nahikoa da, baina denbora dezente eman nuen funtzionatzen, beraz, artikuluan egon dadila.

Sistema eragile bat hautatzea. Armbian

Aplikazioaren lehen zeregina VPN bat abiarazteko da, Wireguard, jakina. Berehala jakin zen nukleoaren aldean ez zegoela muntatuta eta goibururik ez zegoela. Nukleoa berreraiki nuen eta, x86rekin dudan ohitura bezala, nukleoaren modulua muntatu nuen DKMS erabiliz. Hala ere, arm64-n utilitate txikiak ere eraikitzeko abiadurak desatsegina harritu ninduen. Eta gero beste nukleo-modulu bat behar zen, etab. Oro har, kernelarekin erlazionatutako guztia x86 ordenagailu eramangarri epel batean muntatzen dela ematen du, ondoren R64ra transferitzen dela kopia soil bidez, berrabiarazi eta probatu.

Beste gauza bat erabiltzaile-espazioaren zatia da. Debian aukeratzearen kasuan, arm64 arkitekturarako guztia packages.debian.org-en dago jada eta ez dago ezer berreraiki beharrik.

Beste bizikleta bat ez egiteko, nik porturatu armbian BPI R64-n.
Edo hobeto esanda, hau: erabiltzaile-espazioaren zatia Armbian da, eta nukleoa biltegitik hartzen da Frank-A. Azken irudia deskargatu daiteke Hemen.

R64-ren software-zatiaren garapenari buruzko jarduera guztiak egiten dira forum. Orokorrean, fabrikatzailea bera Openwrt-erako bideratzailea ezagutarazten ahalegintzen da, baina Alemaniako Frank garatzailearen jarduerari esker, funtzio guztiak azkar amaitzen dira Debian-en nukleoan. Harrigarria bada ere, Frank aktiboa da foroko hari guztietan.

Lan-eremuaren antolaketa: hariak

Bereizita, esan nahiko nuke nola, garapenean/probak egiten ari diren bitartean, SBC bat (ez BPI bat bakarrik) mahai batean jarri, gela/bulego osoan Ethernet kable bat ez exekutatzeko. Kontua da, alde batetik, hardware bat Internetekin eman behar duzula, baina, bestetik, hardware horretan dagoen guztia matxuratu daiteke, eta lehenik Wifi-a.

Lehenik eta behin, USB-Wifi "txistu" merkea erostea erabaki nuen, BPIko ataka bakarrera konektatu eta hariak ahaztu. Horretarako, TP-LINK TL-WN725N USB 2.0 merke bat erosi nuen, baina oso laster argi geratu zen ez zela aireratuko: txistua funtziona dezan, kernel-gidari bat behar duzu, eta, noski, ez zegoen. (Geroago beharrezko RTL8XXXU kontrolatzailea muntatu nuen, baina oraindik ez da praktikoa). Eta Ethernet kableak gelaren itxura hondatu zuen pixka batean.

Ondorioz, Tenda MW3-ren (Wifi mesh system) laguntzarekin kablea kentzea lortu nuen: kubo bat mahai azpian jarri eta BPI azken honen LAN ataka konektatu nuen metro luzeko Ethernet kable batekin. Arrakasta.

Wireguard, RKN, Bird

Banana PI erabili nahi dudan gauzetako bat RKN-k blokeatutako guneetarako sarbide librea izatea da, bereziki, Telegram eta Slack deiak funtzionatu ahal izateko. Dagoeneko HabrΓ©ri buruzko artikuluak proposatu dira gai honi buruz: denbora, Π΄Π²Π°, hiru.

Irtenbide hau zehazki zabaldu nuen Ansible erabiliz: link.

VPS Ubuntu 18.04 exekutatzen ari dela suposatzen da. Europako bi ostalariren funtzionaltasuna egiaztatu nuen: Amazon eta Digital Ocean.

Beraz, goiko Armbian instalatu dugu R64-n, ssh bidez eskuragarri dago izenaren azpian hm-bananapi-1 eta interneterako sarbidea du. Ansible, automatizazio scriptak etengabe zabaltzen ditugu eta instalazioa bera abiarazten dugu R64-n:

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

Ondoren, gure VPNa VPSra zabaldu behar duzu modu berean:

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

Hemen argumentua current-vpn da beti, eta benetako VPS izena aldagai batean konfiguratuta dago (kasu honetan paris-vpn-aws-t2-micro-1 da):

$ grep current_vpn group_vars/all 
current_vpn: paris-vpn-aws-t2-micro-1
#current_vpn: frankfurt-vpn-d0-starter-1

Bai, eragiketa hauen guztien aurretik sekretuak sortu behar dituzu (batez ere Wireguard gakoak) karpetan ./secrets, direktorioa itxura izan beharko luke beraz,.

Ansible Automation Python-en

Konturatuko zara YAML formatuan egon beharrean, Ansible komandoak Python scriptetan kodetzen direla. Konparazio baterako, nola gaitu txori deabrua ohiko moduan:

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

eta nola egin gauza bera Python bidez:

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

Ansible komandoak Python-en idazteak kodea berrerabiltzeko aukera ematen du, eta, oro har, erabilera orokorreko hizkuntzaren aukera guztiak irekitzen ditu. Adibidez, bird instalatzea R64 eta VPS-n:

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

ikusi funtzioaren kodea instalatu_txoria().

Ezaugarri honek deitzen da pybook ezarrita Hemen. Oraindik ez dago pybook-en dokumentaziorik, baina arazo hau geroago konponduko dut.

Zer uste du ibaian gora oraingo honetan.

Jarraipena. Prometeo

Guztira: telegramek funtzionatzen dute, linkedin eta pornhub-ek ere, orokorrean erabiltzailearen esperientzia ondo dago. Baina dena hautsi daiteke, txinatar hardwarea barne.

Kernelaren eguneraketak ere interesgarriak izan daitezke: adibidez, nukleoa 5.4 => 5.6 eguneratu nahi nuen, tira, Wireguard hor dago kutxatik kanpo, ez dago adabakirik egin behar... Egin baino lehen esan baino lehen: 5.4tik adabakiak neketsu transferitu nituen. 5.6ra, nukleoa abiarazi zen, VPSrako tunelak ping-a egin zuen, baina bird-ek ezin du "BGP Error" akatsarekin konektatu... "Izututa itzuli nintzen" (c) 5.4ra; 5.6ra pasatzea TODOn atzeratu zen.

Hori dela eta, bideratzailea eta VPS instalatzeaz gain, monitorizazioa gehitu nuen (x86 Ubuntu 18.04-n), zeina osagai hauek dituen ostalari bereizi batean instalatuta:

  • prometheus, alertmanager, blackbox_exporter - dena docker-en
  • Alertak telegram kanalera bidaltzen dira metalmatze/alertmanager-bot bot erabiliz - Docker-en ere
  • tor botarentzat, bot-ak Internet dagoenean egoerak abisatu dezan, baina telegramek oraindik ez du funtzionatzen eta bot-a bera ezin da konektatu
  • aplikatu alertak: NodeVPNTroubles (VPSrako pingik gabe), BirdVPNTroubles (Ez da Bird saiorik), AntifilterDownloadTroubles (errorea blokeatutako IP helbideak kargatzean), SiteTroubles (ez dago telegrama ez dago erabilgarri)
  • sistemaren alertak, adibidez, HostGrowingDiskReadLatency (SD txartel merkea irakurezin bihurtzen da)

Instalazioaren monitorizazioaren adibidea:

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

Prometheus-en aurkikuntza automatikoa /etc/prometheus/auto_http karpetan konfiguratuta dago, monitorizazioari ostalari bat gehitzeko adibide bat (ostalariak ez dira lehenespenez kontrolatzen):

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

Guztiaz gain, bi hornitzailerekin konektatzeko asmoa nuen, Internetek funtzionatzen jarrai zezan, nahiz eta hornitzaile batek sarearekin arazoak izan, edo Internet eta abar ordaintzea ahaztu zitzaien eta beste giza faktore batzuk.

Multi-wan gaiari buruzko erabiltzailearen esperientzia aurreratuena deskribatzen da Hemen Openwrt pean Mwan3 sistemarako. Irtenbide honek funtzionalitate aberatsa du, baina orokorrean multi-wan-erako konfiguratzea eta funtzionatzea nahiko zaila da. Adibide bakarra: gune batzuetara bi IP helbidetatik aldi berean etortzen bazara, baliteke ez zaiela gustatuko, funtzionatzeari utziko diote => "Internetek ez du funtzionatzen".

Esperientzia hori kontuan hartuta, multihoming-a oraindik ez dela lehentasuna erabaki nuen, hutsegitea soilik. Hala ere, badirudi Linux-en azken bertsioetan dena komando batekin funtzionatu beharko lukeela:

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

Beraz, hutsegite puntu bakar bat saihesteko, 2 BPI hartzen ditugu, bakoitza hornitzaile batera konektatzen dugu, elkarri konektatu eta elkarren arteko konexioa bideratze dinamikoa egiten dugu bird/OSPF bidez.

Ondoren, IP helbide bera iragartzen dugu bakoitzean zerbitzua erabilgarri badago (Internet, DNS). Hau da, ez dugu bide lehenetsia guk geuk ezarriko, txorien bidez baizik. Irtenbidea zelatatu nuen Hemen .

Funtzionalitate hau oraindik ez da inplementatu, koronavirus maltzurrak trikimailu bat jokatu zuen hemen (dena ez zen Aliexpressetik iritsi; beste online denda batek, Laytak, aste batean entregatuko zuela agindu zuen, baina hilabete baino gehiago igaro da; bigarren hornitzaileak ez zuen denborarik izan. kablea berrogeialdiaren aurretik luzatzeko, kablearen horman zulo bat sartzea bakarrik lortu zuen).

Nola eskatu R64

Taula bera denda ofizialean dago SinoVoip.
Hobe da berehala eskatzea:

  • food + jakinarazi EBko edo AEBetako entxufearen estandarra
  • bero-hustugailua: erradiadoreak/haizagailuak; CPU eta switch txipa berotzen ari direlako
  • wifirako antena, adibidez

Γ‘abardura bat dago: denbora pixka bat entregatzeko prezioa nahiko altua izan da denda ofizialean. Judy Huang kudeatzaileak akatsik ez zegoela konbentzitu ninduen, eta ePacket aukera dezakezu 5 $-ren truke, baina ikusi nuen Errusiako EMS baino > $33-tan dagoela. Desatsegina, baina ez kritikoa. Gainera, entregatzeko beste herrialderen bat aukeratzen baduzu (kontinente guztietatik pasatu nintzen), bidalketak ~ $ 5 balioko du. Errusofoboak?.. Baina orduan aurkitu nuen Frantziarako bidalketa prezioa ere ~30$ dela, eta lasaitu nintzen.

Ondorioz, Judyk eskaera bat egitea eskaini zuen, baina ez ordaintzea (hinting: txartelari gutxiago jarri ordainketa automatikoa igaro ez dadin); idatzi hari eta bidalketa prezioa normaltasunera murriztuko du. Arrakasta.

Aleak

Oraindik ez da dena primeran funtzionatzen.

produktibitatea

Ansible=Python-en komandoak astiro exekutatzen dira, inaktiboenak ere, 20-30 segundoz; x86 ordenagailu eramangarri batean baino magnitude ordena handiagoa. Gainera, hasieran nahiko azkar exekutatzen dira, ~ 3 segundo, gero moteldu egiten dira nabarmen. Hau PUZa berotzearen ondorioz (throttling) izan daiteke. Go kodeak ere denbora asko behar du funtzionatzeko:

# запрос ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊ для промСтСя ΠΈΠ· 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-ak funtzionatzen du, baina Armbian-en egun baten ondoren gelditzen da, idazten du:

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

Berrabiarazteak bakarrik laguntzen du. Aurrera egin behar dugu irudikatu.

Ethernet

Ethernet-ek funtzionatzen du, baina ~ 64 ordu igaro ondoren RXNUMX-ko paketeak (DHCP) ez dira iristen.
Interfazea berrabiarazteak laguntzen du:

ifdown br0; sleep 30; ifup br0

Gidaria berria da, oraindik ez da nukleoan onartu, espero dut Landen Chao txinatarra izatea bukatzen du.

Iturria: www.habr.com

Gehitu iruzkin berria