Ruteri Banana Pi R64 - Debian, Wireguard, RKN

Banana Pi 64 është një kompjuter me një bord të ngjashëm me Raspberry Pi, por me porte të shumta Ethernet, duke e bërë atë një ruter shpërndarjeje Linux për qëllime të përgjithshme.

Ruteri Banana Pi R64 - Debian, Wireguard, RKN

Po, Openwrt tashmë ekziston, por ka GUI dhe CLI-në e vet; ka Mikrotik, por përsëri ka GUI / CLI-në e vet, dhe Wireguard nuk funksionon jashtë kutisë ... Në përgjithësi, dua një ruter me cilësime fleksibël, duke mbetur në kuadrin e Linux-it standard, me të cilin punoni. çdo ditë.

Në artikullin me emrat BPI, R64, me një dërrasë të vetme, do të nënkuptoj të njëjtën gjë - vetë bordi i vetëm Banana Pi R64.

Zgjedhja e imazhit. Shkarkoni përmes eMMC

Aftësia e parë që duhet të fitoni kur punoni me të SBC në përgjithësi, dhe me R64 në veçanti, do të thotë të mësoni se si të ngarkoni një OS në të dhe të jeni në gjendje të ndërveproni me të, sepse R64 nuk ka një portë monitori (HDMI, për shembull). Kur gjithçka u prish - Wifi pushoi së punuari, rrjeti Ethernet, Bluetooth, USB, etj., ekziston një UART, përmes ndërfaqes së të cilit gjithmonë mund të shihni se çfarë shkoi keq, dhe gjithashtu të ekzekutoni disa komanda nga tastiera, nëse është e nevojshme.

Algoritmi i lidhjes me R64 përmes USB-UART:

  • kalo në dyqanin e pjesëve të radios për një kabllo USB-UART (PL2303, Serial-në-USB)
  • ne lidhim një fund USB me kompjuterin, dhe tjetrin, UART, me R64, me tre nga katër tela, si në foton më poshtë
  • në ekzekutimin e tastierës së kompjuterit sudo minicom

Pas kësaj, në shumicën e rasteve, do të shfaqet tastiera me një tabelë = sukses.
Ju mund të shihni më shumë këtu.

Ruteri Banana Pi R64 - Debian, Wireguard, RKN

Tjetra, mënyra më e lehtë është të ngarkoni sistemin operativ nga karta SD: shkarkoni nga lidhje imazhin dhe ngarkoni atë:

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

e fusim kartën në slotin R64 SD, e ndezim, vëzhgojmë ngarkimin e uboot-it fillimisht në tastierën e lidhur, pastaj nisjen standarde të Linux-it.

Një opsion alternativ i nisjes është përdorimi i një karte 64 Gb të ngulitur tashmë në R8, e quajtur eMMC. Sipas udhëzimeve në wiki, ne e rishkruajmë imazhin në pajisje
/dev/mmcblk0 në BPI, rindizni, hiqni kartën SD, aktivizoni përsëri BPI... dhe nuk funksionon. Si për të arritur atje Boot select mos u mbajt.

Fakti është se të paktën për BPI duhet të vendosni një flamur të veçantë në mënyrë që të mund të nisni nga një flash drive i brendshëm:

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]

Tjetra, ju duhet të shkruani preloader në një ndarje të veçantë të nisjes

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

Prodhuesi i R64 (Kinë) e postoi këtë binar këtu. Ajo që ai bën është e panjohur (nuk ka kode burimore), por pa të nuk do të funksionojë as.

Në përgjithësi, pas kësaj, imazhet fillojnë të ngarkohen nga eMMC. Nëse dëshironi ta kuptoni dhe të krijoni imazhe nga e para, atëherë për të dyja rastet (SD / eMMC) duhet të shkruani disa skedarë të tjerë (preloader për kartën SD, ATF, u-boot), vetëm për të arritur në kernel çizme. Kjo temë është ende po zhvillohet, por për ne gjëja kryesore është që funksionon dhe në rregull.

Tani, për të qenë i sinqertë, nuk përdor shkarkimin eMMC, kartat SD janë të mjaftueshme, por kam shpenzuar mjaft kohë për ta bërë atë të funksionojë, kështu që le të jetë në artikull.

Zgjedhja e sistemit operativ. armbian

Detyra e parë e aplikimit është nisja e një VPN, sigurisht Wireguard. Menjëherë doli se nuk ishte mbledhur nga ana e kernelit dhe nuk kishte koka. E rindërtova kernelin dhe, nga zakoni me x86, ndërtova modulin e kernelit duke përdorur DKMS. Sidoqoftë, shpejtësia e montimit në arm64 edhe të shërbimeve të vogla më befasoi në mënyrë të pakëndshme. Dhe pastaj kërkohej një modul tjetër kernel, e kështu me radhë. Në përgjithësi, rezulton se gjithçka që lidhet me kernelin është më mirë të montohet në një laptop x86 me tub të ngrohtë, më pas të transferohet në R64 me kopjim të thjeshtë, të rindizet dhe të testohet.

Një tjetër gjë është pjesa e hapësirës së përdoruesit. Në rastin tim të zgjedhjes së Debian-it, gjithçka për arkitekturën arm64 është tashmë në packages.debian.org dhe asgjë nuk duhet të rindërtohet.

Për të mos prodhuar një biçikletë tjetër, unë portuar armbian në BPI R64.
Ose më mirë: pjesa e hapësirës së përdoruesve është Armbian, dhe thelbi është marrë nga depoja I sinqertë-A. Imazhi i fundit mund të shkarkohet këtu.

I gjithë aktiviteti për zhvillimin e pjesës së softuerit të R64 është kryer në forum. Në përgjithësi, vetë prodhuesi kërkon të popullarizojë ruterin Openwrt, por falë aktivitetit të zhvilluesit Frank nga Gjermania, të gjitha veçoritë përfundojnë shpejt në kernelin Debian. Çuditërisht, Frank është aktiv në çdo temë të forumit.

Organizimi i hapësirës së punës: telat

Më vete, unë dua t'ju tregoj se si ta vendosni SBC (jo vetëm BPI) në tryezë gjatë zhvillimit / testimit, në mënyrë që të mos çoni një kabllo Ethernet në të nga burimi i Internetit në të gjithë dhomën / zyrën. Fakti është se, nga njëra anë, ju duhet të siguroni internetin për copën e hekurit, dhe nga ana tjetër, gjithçka mund të prishet në këtë copë hekuri, dhe veçanërisht Wifi.

Fillimisht vendosa të blej një "bilbil" të lirë USB-Wifi, ta lidh atë në portën e vetme në BPI dhe të harroj telat. Për ta bërë këtë, bleva një USB 725 të lirë TP-LINK TL-WN2.0N, por shumë shpejt u bë e qartë se nuk do të hiqej: që bilbili të funksiononte, nevojitej një drejtues kernel, i cili, natyrisht, nuk ishte aty. (më vonë përpilova drejtuesin e nevojshëm RTL8XXXU, por është ende jopraktike). Dhe kablloja e ethernetit prishi pamjen e dhomës për pak kohë.

Si rezultat, arrita të heq qafe kabllon me ndihmën e Tenda MW3 (sistemi rrjetë Wifi): Thjesht vendosa një kub nën tavolinë dhe lidha BPI me portën LAN të kësaj të fundit me një kabllo Ethernet matës. Sukses.

Wireguard, RKN, Zog

Një nga gjërat për të cilat përdor Banana PI është të kem akses falas në faqet e bllokuara nga RKN, në veçanti, në mënyrë që Telegrami dhe thirrjet në Slack të funksionojnë. Artikujt mbi këtë temë janë propozuar tashmë në Habré: kohë, два, tre.

Unë zbatova vendosjen e një zgjidhjeje të tillë duke përdorur Ansible: lidhje.

VPS supozohet të ekzekutojë Ubuntu 18.04. Kontrollova performancën në dy hoste në Evropë: Amazon dhe Digital Ocean.

Pra, ne instaluam Armbianin e mësipërm në R64, ai është i disponueshëm përmes ssh nën emrin hm-bananapi-1 dhe ka akses në internet. Ne vendosim skriptet e automatizimit në mënyrë sekuenciale dhe e ekzekutojmë vetë instalimin në 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

Tjetra, ju duhet të vendosni VPN-në tonë në VPS në të njëjtën mënyrë:

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

Këtu, argumenti është gjithmonë aktual-vpn, dhe vetë emri VPS është konfiguruar në një variabël (në këtë rast, është 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 po, përpara gjithë këtyre operacioneve, duhet të gjeneroni sekrete (në veçanti, çelësat Wireguard) në një dosje ./secrets, drejtoria duhet të duket si kështu.

Automatizimi ansible në Python

Ju mund të vini re se në vend të formatit YAML, komandat Ansible janë të koduara në skriptet Python. Për krahasim, si të aktivizoni demonin e shpendëve në mënyrën e zakonshme:

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

dhe si e njëjta gjë përmes Python:

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

Shkrimi i komandave Ansible me kodin Python ju lejon të ripërdorni kodin dhe në përgjithësi, të gjitha mundësitë e një gjuhe me qëllim të përgjithshëm janë të hapura. Për shembull, instalimi i zogut në R64 dhe VPS:

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

shih kodin e funksionit install_bird ().

Kjo veçori quhet pybook zbatuar këtu. Nuk ka ende asnjë dokumentacion për pybook, atëherë do ta korrigjoj këtë defekt.

Çfarë mendon ai në rrjedhën e sipërme në lidhje me këtë

Monitorimi. Prometeu

Gjithsej: funksionon telegrami, linkedin dhe pornhub gjithashtu, në përgjithësi, përvoja e përdoruesit është në rregull. Por gjithçka mund të thyhet, dhe copat kineze të hekurit gjithashtu.

Përditësimet e kernelit mund të jenë gjithashtu interesante: për shembull, doja të përditësoja kernelin 5.4 => 5.6, mirë, ka Wireguard jashtë kutisë, nuk ka nevojë të rregullohet ... Sapo të bëhet: arna të transferuara me kujdes nga 5.4 në 5.6, kerneli filloi, tuneli në VPS u ping, por zogu nuk mund të lidhet me gabimin "BGP Error"… "U kthye në tmerr" (c) në 5.4; kalimi në 5.6 u shty në TODO.

Prandaj, përveç instalimit të ruterit dhe VPS-së, shtova monitorimin (në x86 Ubuntu 18.04), i cili është i instaluar në një host të veçantë me komponentët e mëposhtëm:

  • prometheus, alertmanager, blackbox_exporter - të gjitha në docker
  • sinjalizimet dërgohen në kanalin e telegramit duke përdorur botin metalmatze/alertmanager-bot - gjithashtu në docker
  • tor për bot, në mënyrë që roboti të mund të lajmërojë situatat kur interneti është i disponueshëm, por telegrami ende nuk funksionon dhe vetë roboti nuk mund të lidhet
  • aplikuar alarmet: NodeVPNTroubles (pa ping në VPS), BirdVPNTprobleme (pa seancë Bird), Probleme AntifilterDownload (dështoi në ngarkimin e adresave IP të bllokuara), SiteTroubles (telegrami për fat të keq i padisponueshëm)
  • sinjalizimet e sistemit si HostGrowingDiskReadLatency (karta SD e lirë ndalon së lexuari)

Shembull i konfigurimit të monitorimit:

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

Zbulimi automatik për prometheus është vendosur në dosjen /etc/prometheus/auto_http, një shembull i shtimit të një hosti në monitorim (hostët nuk monitorohen si parazgjedhje):

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 ofrues, 2 BPI, çdo dështim i transmetimit

Përveç gjithçkaje, kam planifikuar të lidhem me dy ofrues në mënyrë që interneti të vazhdojë të funksionojë, edhe nëse një ofrues kishte probleme me rrjetin, ose harronte të paguante internetin, etj., dhe faktorë të tjerë njerëzorë.

Përshkruhet përvoja më e avancuar e përdoruesit në temën e multi-wan këtu për sistemin Mwan3 nën Openwrt. Kjo zgjidhje ka funksionalitet të pasur, por vendosja dhe funksionimi në përgjithësi për multi-wan është mjaft i mundimshëm. Vetëm një shembull: nëse vini në disa sajte nga dy adresa IP njëherësh, atëherë mund të mos ju pëlqejë, ata do të ndalojnë së punuari => "Interneti nuk po funksionon."

Duke pasur parasysh këtë përvojë, vendosa që multihoming nuk është ende një prioritet, vetëm dështim. Edhe pse duket se në versionet më të fundit të linux gjithçka duhet të funksionojë me një komandë si:

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

Pra, për të shmangur një pikë të vetme dështimi, marrim 2 BPI, secila lidhet me një ofrues, i lidhim së bashku dhe bëjmë komunikim me njëri-tjetrin të drejtuar në mënyrë dinamike përmes shpendëve / OSPF.

Më tej, në secilën shpallim të njëjtën adresë IP nëse shërbimi është i disponueshëm (Internet, DNS). Kjo do të thotë, ne nuk do ta vendosim vetë rrugën e paracaktuar, por përmes zogut. Zgjidhja spiunuar këtu .

Ky funksionalitet nuk është zbatuar ende, koronavirusi tinëzar u ngatërrua (jo gjithçka erdhi nga aliexpress; një dyqan tjetër në internet, Layta, premtoi të dorëzojë brenda një jave dhe ka kaluar më shumë se një muaj; ofruesi i dytë nuk arriti të zgjasë kabllo para karantinës, arriti të bënte vetëm një vrimë në mur për të shpuar kabllon).

Si të porosisni R64

Bordi vetë në dyqanin zyrtar SinoVoip.
Është gjithashtu më mirë të porosisni menjëherë:

  • ushqim + informoni standardin e prizës së BE-së ose SHBA-së
  • lavaman: radiatorë/tifoz; sepse edhe CPU-ja nxehet, edhe çipi i ndërprerësit
  • antenë wifi, për shembull

Ekziston një nuancë - çmimi i dorëzimit prej disa kohësh është bërë joadekuat i lartë në dyqanin zyrtar. Menaxheri Judy Huang më siguroi se nuk kishte asnjë gabim dhe mund të zgjidhni ePacket për 5 dollarë, por pashë që për Rusinë ka vetëm EMS për >33 dollarë. E pakëndshme, por jo kritike. Për më tepër, nëse zgjidhni ndonjë vend tjetër për dërgesë (kam kaluar nëpër të gjitha kontinentet), dërgesa do të kushtojë ~5$. Rusofobët?.. Por më pas zbulova se edhe për Francën çmimi i dërgesës është ~30$ dhe u qetësova.

Si rezultat, Judy ofroi të bënte një porosi, por jo të paguante (aluzion: vendosni më pak në kartë në mënyrë që pagesa të mos kryhet automatikisht); shkruani asaj dhe ajo do të ulë çmimin e transportit në normale. Sukses.

Çështjet

Jo gjithçka funksionon ende në mënyrë perfekte.

prodhimtari

Ansible=Komandat e Python-it ekzekutohen ngadalë, madje edhe ato boshe, për 20-30 sekonda; një rend i madhësisë më i gjatë se në një laptop x86. Për më tepër, në fillim ato kryhen mjaft shpejt, ~ 3 sekonda, pastaj ngadalësohen ndjeshëm. Ndoshta kjo është për shkak të ngrohjes së CPU (mbytjes). Kodi Go është gjithashtu i gjatë:

# запрос метрик для прометея из 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 funksionon, por ndalon në Armbian pas rreth një dite, shkruan:

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

Vetëm rinisja ndihmon. Duhet të shkojmë më tej zgjidh.

Ethernet

Ethernet funksionon, por pas ~ një dite paketat (DHCP) nga R64 nuk vijnë më.
Rinisja e ndërfaqes ndihmon:

ifdown br0; sleep 30; ifup br0

Shoferi eshte i ri, kerneli nuk eshte pranuar akoma, shpresoj se kinezi Landen Chao përfundoni.

Burimi: www.habr.com

Shto një koment