Banana Pi R64 marÅ”rutētājs ā€“ Debian, Wireguard, RKN

Banana Pi 64 ir viena borta dators, kas lÄ«dzÄ«gs Raspberry Pi, taču ar vairākiem Ethernet portiem, kas ļauj to pārvērst par marÅ”rutētāju, kura pamatā ir vispārēja Linux izplatÄ«Å”ana.

Banana Pi R64 marÅ”rutētājs ā€“ Debian, Wireguard, RKN

Jā, Openwrt jau ir, bet tam ir savas problēmas, tā GUI un CLI; Ir Mikrotik, bet tam atkal ir savs GUI/CLI, un Wireguard nestrādā no kastes... Vispār gribu rūteri ar elastīgiem iestatījumiem, paliekot standarta Linux ietvaros, ar kuru jūs strādājat ar katru dienu.

Rakstā ar nosaukumiem BPI, R64, vienplate, es domāju to paŔu - paŔu Banana Pi R64 vienplati.

Attēla izvēle. Lejupielādēt, izmantojot eMMC

Pati pirmā prasme, kas jāapgÅ«st, strādājot SBC kopumā, un jo Ä«paÅ”i ar R64, tas nozÄ«mē iemācÄ«ties tajā ielādēt operētājsistēmu un spēju ar to mijiedarboties, jo R64 nav pieslēgvietas monitoram (piemēram, HDMI). Kad viss nokrita - pārstāja darboties Wifi, Ethernet, Bluetooth, USB utt.. Ir UART, caur kuru interfeisu vienmēr var redzēt, kas nogāja greizi, kā arÄ« palaist pāris komandas no konsoles, ja nepiecieÅ”ams.

Algoritms savienojuma izveidei ar R64, izmantojot USB-UART:

  • mēs skrienam uz radio detaļu veikalu pēc USB-UART kabeli (PL2303, Serial-to-USB)
  • pievienojiet vienu USB galu datoram, bet otru, UART, R64, ar trim vadiem no četriem, kā parādÄ«ts attēlā zemāk
  • palaist datora konsolē sudo minicom

Pēc tam vairumā gadījumu parādīsies vienas plates konsole = veiksme.
JÅ«s varat redzēt sÄ«kāku informāciju Å”eit.

Banana Pi R64 marÅ”rutētājs ā€“ Debian, Wireguard, RKN

Pēc tam vienkārŔākais veids ir ielādēt operētājsistēmu no SD kartes: lejupielādējiet lÄ«dz saite attēlu un aizpildiet to:

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

Mēs ievietojam karti R64 SD slotā, ieslēdzam to un novērojam pievienotās konsoles ielādi vispirms uboot, pēc tam standarta Linux ielādi.

AlternatÄ«va sāknÄ“Å”anas iespēja ir izmantot 64Gb karti, kas jau ir iebÅ«vēta R8, ko sauc par eMMC. Saskaņā ar wiki norādÄ«jumiem mēs kopējam attēlu ierÄ«cē
/dev/mmcblk0 uz BPI, restartējiet, izņemiet SD karti, atkal ieslēdziet BPI... un tas nedarbojas. Kā iet uz priekÅ”u un atpakaļ Boot select netraucē.

Fakts ir tāds, ka vismaz BPI ir jāiestata Ä«paÅ”s karodziņŔ, lai varētu palaist no iekŔējā zibatmiņas diska:

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]

Tālāk jums jāieraksta priekÅ”ielādētājs Ä«paŔā sāknÄ“Å”anas nodalÄ«jumā

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

Ražotājs R64 (Ķīna) ievietoja Ŕo bināro failu Ŕeit. Tas, ko tas dara, nav zināms (nav avota kodu), taču tas nedarbosies arī bez tā.

Kopumā pēc tam attēli sāk ielādēt no eMMC. Ja vēlaties to izdomāt un izveidot attēlus no nulles, tad abos gadÄ«jumos (SD/eMMC) ir jāuzraksta vēl vairāki faili (SD kartes priekÅ”ielādētājs, ATF, u-boot), lai tikai tiktu pie kodola ielādÄ“Å”anas. Å Ä« tēma joprojām ir attÄ«stās, bet mums galvenais, lai strādā un labi.

Tagad lejupielādēju caur eMMC, godīgi sakot, neizmantoju, pietiek ar SD karti, bet pavadīju diezgan daudz laika, lai tā darbotos, tāpēc lai tas ir rakstā.

Operētājsistēmas izvēle. Armbija

Pirmais lietojumprogrammas uzdevums ir palaist VPN, dabiski Wireguard. Uzreiz atklājās, ka kodola pusē tas nav samontēts un nav galvenes. Es pārbÅ«vēju kodolu un, kā tas ir mans ieradums ar x86, saliku kodola moduli, izmantojot DKMS. Tomēr pat nelielu inženierkomunikāciju izveides ātrums uz arm64 mani nepatÄ«kami pārsteidza. Un tad vajadzēja vēl vienu kodola moduli utt. Kopumā izrādās, ka visu, kas saistÄ«ts ar kodolu, vislabāk ir salikt uz silta x86 klēpjdatora, pēc tam vienkārÅ”i kopējot pārsÅ«tÄ«t uz R64, pārstartēt un pārbaudÄ«t.

Vēl viena lieta ir userspace daļa. Manā gadījumā, izvēloties Debian, viss arm64 arhitektūrai jau atrodas vietnē packages.debian.org, un nekas nav jāpārbūvē.

Lai neražotu vēl vienu velosipēdu, I pārnests Armbija uz BPI R64.
Pareizāk sakot, Ŕī: lietotāja telpas daļa ir Armbian, un kodols tiek ņemts no repozitorija atklāts-A. Jaunāko attēlu var lejupielādēt Å”eit.

Visas darbÄ«bas, kas saistÄ«tas ar R64 programmatÅ«ras daļas izstrādi, tiek veiktas forums. VispārÄ«gi runājot, pats ražotājs cenÅ”as popularizēt Openwrt marÅ”rutētāju, taču, pateicoties izstrādātāja Frank no Vācijas darbÄ«bai, visas funkcijas ātri nonāk Debian kodolā. PārsteidzoÅ”i, Frenks ir aktÄ«vs katrā foruma pavedienā.

Darba telpas organizācija: vadi

AtseviŔķi es vēlētos jums pastāstÄ«t, kā izstrādes/testÄ“Å”anas laikā novietot SBC (ne tikai BPI) uz galda, lai visā telpā/birojā uz to netiktu palaists Ethernet kabelis no interneta avota. Fakts ir tāds, ka, no vienas puses, jums ir jānodroÅ”ina aparatÅ«ra ar internetu, bet, no otras puses, viss Å”ajā aparatÅ«rā var sabojāties, un, pirmkārt, Wi-Fi.

Pirmkārt, es nolēmu nopirkt lētu USB-Wifi ā€œsvilpiā€, iespraust to vienÄ«gajā BPI portā un aizmirst par vadiem. Lai to izdarÄ«tu, es iegādājos lētu TP-LINK TL-WN725N USB 2.0, taču ļoti drÄ«z kļuva skaidrs, ka tas nepacelsies: lai svilpe darbotos, ir nepiecieÅ”ams kodola draiveris, kura, protams, tur nebija. (vēlāk es samontēju nepiecieÅ”amo RTL8XXXU draiveri, bet tas joprojām ir nepraktisks ). Un Ethernet kabelis uz brÄ«di sabojāja telpas izskatu.

Rezultātā man izdevās atbrÄ«voties no kabeļa ar Tenda MW3 (Wifi mesh system) palÄ«dzÄ«bu: es vienkārÅ”i noliku vienu kubu zem galda un ar metru garu Ethernet kabeli savienoju BPI ar pēdējā LAN portu. Panākumi.

Stiepļu aizsargs, RKN, putns

Viena no lietām, kurai es vēlos izmantot Banana PI, ir nodroÅ”ināt bezmaksas piekļuvi vietnēm, kuras bloķējis RKN, lai varētu darboties Telegram un Slack zvani. Par Å”o tēmu jau ir ierosināti raksti par Habrē: laiks, Š“Š²Š°, trÄ«s.

Es izvietoju tieŔi Ŕo risinājumu, izmantojot Ansible: saite.

Tiek pieņemts, ka VPS darbojas Ubuntu 18.04. Es pārbaudīju funkcionalitāti divos mitinātājos Eiropā: Amazon un Digital Ocean.

Tātad, mēs instalējām iepriekÅ” minēto Armbian uz R64, tas ir pieejams caur ssh ar nosaukumu hm-bananapi-1 un ir interneta pieslēgums. Mēs konsekventi izvietojam Ansible automatizācijas skriptus un palaižam paÅ”u instalāciju uz 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

Tālāk jums ir jāizvieto mūsu VPN VPS tādā paŔā veidā:

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

Å eit arguments vienmēr ir paÅ”reizējais-vpn, un faktiskais VPS nosaukums ir konfigurēts mainÄ«gajā (Å”ajā gadÄ«jumā tas ir 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

Ak jā, pirms visām Ŕīm darbÄ«bām mapē ir jāģenerē noslēpumi (it Ä«paÅ”i Wireguard atslēgas). ./secrets, direktorijam vajadzētu izskatÄ«ties Ŕādi tā.

Iespējamā automatizācija Python

Jūs varat pamanīt, ka tā vietā, lai tās būtu YAML formātā, Ansible komandas tiek kodētas Python skriptos. Salīdzinājumam, kā parastajā veidā iespējot putnu dēmonu:

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

un kā to izdarīt, izmantojot Python:

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

Ansible komandu rakstÄ«Å”ana Python ļauj atkārtoti izmantot kodu un kopumā paver visas universālās valodas iespējas. Piemēram, putna instalÄ“Å”ana uz R64 un VPS:

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

skatiet funkcijas kodu install_bird().

Å Ä« funkcija sauc pybook Ä«stenota Å”eit. Pagaidām nav dokumentācijas par pybook, taču es Å”o problēmu novērsÄ«Å”u vēlāk.

Ko viņŔ domā pret straumi Å”ajā gadÄ«jumā.

Uzraudzība. Prometejs

Kopā: telegramma darbojas, linkedin un pornhub arī, kopumā lietotāja pieredze ir ok. Bet viss var salūzt, ieskaitot ķīnieŔu aparatūru.

Kodola atjauninājumi var bÅ«t arÄ« interesanti: piemēram, es gribēju atjaunināt kodolu 5.4 => 5.6, labi, Wireguard jau ir izņemts no kastes, nav nepiecieÅ”ams labot... Neko ātrāk pateikts: es cÄ«tÄ«gi pārnesu ielāpus no 5.4 uz 5.6, kodols tika palaists, tunelis uz VPS tika pingēts, bet putns nevar izveidot savienojumu ar kļūdu "BGP Error" ... "I rolled back in horror" (c) uz 5.4; Pāreja uz 5.6 tika atlikta TODO.

Tāpēc papildus marÅ”rutētāja un VPS instalÄ“Å”anai es pievienoju uzraudzÄ«bu (uz x86 Ubuntu 18.04), kas ir instalēts atseviŔķā resursdatorā ar Ŕādiem komponentiem:

  • prometheus, alertmanager, blackbox_exporter ā€” viss docker
  • BrÄ«dinājumi tiek nosÅ«tÄ«ti uz telegrammas kanālu, izmantojot robotu metalmatze/alertmanager-bot ā€” arÄ« programmā Docker
  • tor robotam, lai robots varētu brÄ«dināt par situācijām, kad ir internets, bet Telegram joprojām nedarbojas un pats robots nevar izveidot savienojumu
  • piemērots brÄ«dinājumus: NodeVPNTproblēmas (nav ping uz VPS), BirdVPNTproblēmas (nav Bird sesijas), Antifiltra lejupielādes problēmas (kļūda, ielādējot bloķētas IP adreses), SiteTroubles (neveiksmÄ«gā telegramma nav pieejama)
  • sistēmas brÄ«dinājumi, piemēram, HostGrowingDiskReadLatency (lēta SD karte kļūst nelasāma)

UzraudzÄ«bas uzstādÄ«Å”anas piemērs:

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

Prometheus automātiskā atklāŔana ir konfigurēta mapē /etc/prometheus/auto_http, kas ir piemērs resursdatora pievienoÅ”anai uzraudzÄ«bai (saimnieki netiek pārraudzÄ«ti pēc noklusējuma):

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 pakalpojumu sniedzēji, 2 BPI, jebkuras apraides kļūmjpārlēce

Papildus visam plānoju pieslēgties pie diviem provaideriem, lai internets turpinātu strādāt, pat ja vienam provaiderim būtu problēmas ar tīklu, vai aizmirsu samaksāt par internetu utt un citi cilvēciskie faktori.

Ir aprakstÄ«ta visprogresÄ«vākā lietotāju pieredze par multi-wan tēmu Å”eit Mwan3 sistēmai saskaņā ar Openwrt. Å im risinājumam ir bagātÄ«ga funkcionalitāte, taču tā iestatÄ«Å”ana un darbÄ«ba kopumā vairākiem wan ir diezgan apgrÅ«tinoÅ”a. Tikai viens piemērs: ja jÅ«s ierodaties uz dažām vietnēm no divām IP adresēm vienlaikus, viņiem tas var nepatikt, viņi pārtrauks darboties => "internets nedarbojas."

Ņemot vērā Å”o pieredzi, nolēmu, ka multihoming pagaidām nav prioritāte, tikai failover. Lai gan Ŕķiet, ka jaunākajās Linux versijās visam vajadzētu darboties ar vienu komandu, piemēram:

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

Tātad, lai izvairÄ«tos no viena kļūmes punkta, mēs ņemam 2 BPI, savienojam katru ar vienu pakalpojumu sniedzēju, savienojam tos savā starpā un izveidojam savienojumu savā starpā dinamisku marÅ”rutÄ“Å”anu, izmantojot putnu/OSPF.

Tālāk mēs reklamējam vienu un to paÅ”u IP adresi katrā, ja pakalpojums ir pieejams (internets, DNS). Tas ir, mēs paÅ”i nenostādÄ«sim noklusējuma marÅ”rutu, bet gan caur putnu. Es izspiegoju risinājumu Å”eit .

Å Ä« funkcionalitāte vēl nav ieviesta, mānÄ«gais koronavÄ«russ Å”eit piespēlēja (ne viss ieradās no Aliexpress; cits interneta veikals Layta solÄ«ja piegādāt pēc nedēļas, bet pagājis vairāk nekā mēnesis; otrajam pakalpojumu sniedzējam nebija laika lai pagarinātu kabeli pirms karantÄ«nas, izdevās tikai dabÅ«t sienā caurumu kabeli).

Kā pasūtīt R64

Pati dēlis atrodas oficiālajā veikalā SinoVoip.
Labāk ir arī nekavējoties pasūtīt:

  • pārtika + informēt ES vai ASV spraudņa standartu
  • siltuma izlietne: radiatori/ventilatori; jo uzsilst gan CPU, gan slēdža mikroshēma
  • wifi antena, piemēram

Ir nianse - oficiālajā veikalā piegādes cena jau kādu laiku kļuvusi neadekvāti augsta. Menedžere Džūdija Huanga mani pārliecināja, ka kļūdu nav, un jūs varat izvēlēties ePacket par 5 USD, bet es redzēju, ka Krievijai ir tikai EMS par > 33 USD. Nepatīkami, bet ne kritiski. Turklāt, ja izvēlēsieties piegādei jebkuru citu valsti (izbraucu cauri visiem kontinentiem), piegāde maksās ~5$. Rusofobi?.. Bet tad konstatēju, ka Francijai piegādes cena arī ~30$, un nomierinājos.

Rezultātā Džūdija piedāvāja veikt pasūtījumu, bet nemaksāt (mājiens: ielieciet karti mazāk, lai automātiskais maksājums netiktu cauri); uzraksti viņai un viņa samazinās piegādes cenu līdz normālai. Panākumi.

Jautājumi

Ne viss vēl darbojas ideāli.

ŠŸŃ€Š¾ŠøŠ·Š²Š¾Š“ŠøтŠµŠ»ŃŒŠ½Š¾ŃŃ‚ŃŒ

Ansible=Python komandas tiek izpildÄ«tas lēni, pat dÄ«kstāves, 20-30 sekundes; par lielumu garāks nekā x86 klēpjdatorā. Turklāt sākumā tie tiek izpildÄ«ti diezgan ātri, ~3 sekundes, pēc tam strauji bremzē. Tas var bÅ«t saistÄ«ts ar CPU uzkarÅ”anu (droselÄ“Å”anu). ArÄ« Go kods darbojas ilgi:

# Š·Š°ŠæрŠ¾Ń Š¼ŠµŃ‚Ń€ŠøŠŗ Š“Š»Ń ŠæрŠ¾Š¼ŠµŃ‚ŠµŃ ŠøŠ· 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 darbojas, bet Armbian tas apstājas apmēram pēc dienas, raksta:

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

PalÄ«dz tikai restartÄ“Å”ana. Mums jāiet tālāk atrisināt.

Ethernet

Ethernet strādā, bet pēc ~64 stundām pārstāj ienākt paketes (DHCP) no RXNUMX.
Interfeisa restartēŔana palīdz:

ifdown br0; sleep 30; ifup br0

Draiveris jauns, vēl nav pieņemts kodolā, ceru, ka tas ir ķīnietis Landen Chao pabeidz to.

Avots: www.habr.com

Pievieno komentāru