Banana Pi R64 router - Debian, Wireguard, RKN

Banana Pi 64 - bu Raspberry Pi-ga o'xshash, biroq bir nechta Ethernet portlariga ega bo'lgan bitta platali kompyuter, bu uni umumiy maqsadli Linux distributiviga asoslangan routerga aylantirish imkonini beradi.

Banana Pi R64 router - Debian, Wireguard, RKN

Ha, Openwrt allaqachon mavjud, lekin uning o'z muammolari, GUI va CLI bor; Mikrotik bor, lekin yana o'zining GUI/CLI-ga ega va Wireguard qutidan tashqarida ishlamaydi ... Umuman olganda, men siz ishlaydigan standart Linux doirasida qolgan holda moslashuvchan sozlamalarga ega router istayman. har kuni bilan.

BPI, R64, bitta taxtali nomlari ostidagi maqolada men xuddi shu narsani nazarda tutaman - Banana Pi R64 bitta taxtali.

Tasvirni tanlash. eMMC orqali yuklab oling

U bilan ishlashda siz ega bo'lishingiz kerak bo'lgan birinchi ko'nikma SBC umuman olganda va R64 bilan, bu operatsion tizimni unga qanday yuklashni va u bilan o'zaro aloqada bo'lishni o'rganishni anglatadi, chunki R64 monitor uchun portga ega emas (masalan, HDMI). Hamma narsa yiqilib ketganda - Wifi, Ethernet, Bluetooth, USB va boshqalar ishlashni to'xtatdi.UART mavjud, uning interfeysi orqali siz doimo nima noto'g'ri bo'lganini ko'rishingiz mumkin, shuningdek, agar kerak bo'lsa, konsoldan bir nechta buyruqlarni bajarishingiz mumkin.

USB-UART orqali R64 ga ulanish algoritmi:

  • Biz USB-UART kabeli uchun radio qismlari do'koniga boramiz (PL2303, Serial-to-USB)
  • Quyidagi rasmda bo'lgani kabi bir USB uchini kompyuterga, ikkinchisi UARTni R64 ga to'rttadan uchta sim bilan ulang.
  • kompyuter konsolida ishga tushiring sudo minicom

Shundan so'ng, ko'p hollarda bitta taxtali konsol paydo bo'ladi = muvaffaqiyat.
Batafsil ma'lumotlarni ko'rishingiz mumkin shu yerda.

Banana Pi R64 router - Debian, Wireguard, RKN

Keyinchalik, operatsion tizimni SD-kartadan yuklashning eng oson yo'li: yuklab olish aloqa rasm va uni to'ldiring:

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

Biz kartani R64 SD uyasiga joylashtiramiz, uni yoqamiz va ulangan konsolning avval yuklanishini, keyin esa standart Linux yuklanishini kuzatamiz.

Muqobil yuklash varianti eMMC deb nomlangan R64-ga allaqachon o'rnatilgan 8Gb kartadan foydalanishdir. Vikidagi ko'rsatmalarga ko'ra, biz tasvirni qurilmaga ko'chiramiz
/dev/mmcblk0 ni BPI ga, qayta ishga tushiring, SD-kartani olib tashlang, BPI ni qayta yoqing... va u ishlamayapti. Qanday qilib oldinga va orqaga qaytish kerak Boot select bezovta qilmang.

Haqiqat shundaki, hech bo'lmaganda BPI uchun ichki flesh-diskdan yuklash uchun maxsus bayroqni o'rnatishingiz kerak:

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]

Keyinchalik, maxsus yuklash bo'limiga preloader yozishingiz kerak

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

Ishlab chiqaruvchi R64 (Xitoy) bu ikkilikni joylashtirdi shu yerda. Uning nima qilishi noma'lum (manba kodlari yo'q), lekin usiz ham ishlamaydi.

Umuman olganda, bundan keyin tasvirlar eMMC-dan yuklana boshlaydi. Agar siz buni aniqlab, noldan tasvir yaratmoqchi bo'lsangiz, yadroni yuklashga o'tish uchun ikkala holatda ham (SD/eMMC) yana bir nechta fayllarni (SD karta uchun oldindan yuklovchi, ATF, u-boot) yozishingiz kerak bo'ladi. Bu mavzu hali ham rivojlanmoqda, lekin biz uchun asosiy narsa - bu ishlaydi va yaxshi.

Endi men eMMC orqali yuklab olaman, rostini aytsam, men uni ishlatmayman, SD-karta etarli, lekin uni ishga tushirish uchun juda ko'p vaqt sarfladim, shuning uchun maqolada bo'lsin.

Operatsion tizimni tanlash. armiya

Ilovaning birinchi vazifasi VPN-ni ishga tushirish, tabiiyki Wireguard. Darhol ma'lum bo'ldiki, yadro tomonida u yig'ilmagan va sarlavhalar yo'q. Men yadroni qayta tikladim va x86 bilan odatdagidek DKMS yordamida yadro modulini yig'dim. Biroq, arm64-da hatto kichik kommunal xizmatlarni qurish tezligi meni hayratda qoldirdi. Va keyin yana bir yadro moduli kerak edi va hokazo. Umuman olganda, yadro bilan bog'liq bo'lgan hamma narsa eng yaxshi issiq x86 noutbukida yig'iladi, keyin oddiy nusxa ko'chirish, qayta ishga tushirish va sinovdan o'tkazish orqali R64 ga o'tkaziladi.

Yana bir narsa - foydalanuvchilar maydoni qismi. Debian-ni tanlaganimda, arm64 arxitekturasi uchun hamma narsa allaqachon packages.debian.org saytida va hech narsani qayta tiklashning hojati yo'q.

Boshqa velosiped ishlab chiqarmaslik uchun I portlangan Armbiy BPI R64 bo'yicha.
To'g'rirog'i, bu: foydalanuvchilar maydoni qismi Armbian, yadro esa ombordan olingan. samimiy-A. Eng so'nggi rasmni yuklab olish mumkin shu yerda.

R64 dasturiy ta'minot qismini ishlab chiqish bo'yicha barcha ishlar amalga oshirilmoqda forum. Umuman olganda, ishlab chiqaruvchining o'zi Openwrt uchun marshrutizatorni ommalashtirishga intiladi, ammo germaniyalik ishlab chiqaruvchi Frankning faoliyati tufayli barcha xususiyatlar tezda Debian yadrosida tugaydi. Ajablanarlisi shundaki, Frank har bir forum mavzusida faol.

Ish joyini tashkil qilish: simlar

Alohida aytib o'tmoqchimanki, ishlab chiqish/sinov paytida SBC ni (faqat BPI emas) stolga qanday qilib butun xona/ofis bo'ylab Internet manbasidan Ethernet kabelini o'tkazmaslik kerak. Gap shundaki, bir tomondan, siz internet bilan jihozni ta'minlashingiz kerak bo'lsa, ikkinchi tomondan, bu uskunadagi hamma narsa va birinchi navbatda Wifi buzilishi mumkin.

Birinchidan, men arzon USB-Wifi "hushtak" sotib olishga qaror qildim, uni BPIdagi yagona portga ulang va simlarni unutdim. Buning uchun men arzon TP-LINK TL-WN725N USB 2.0 ni sotib oldim, lekin tez orada u o'chib ketmasligi ma'lum bo'ldi: hushtakning ishlashi uchun sizga yadro drayveri kerak, albatta, u erda yo'q edi. (keyinroq men kerakli RTL8XXXU drayverini yig'dim, ammo bu hali ham amaliy emas). Va Ethernet kabeli xonaning ko'rinishini bir muddat buzdi.

Natijada, men Tenda MW3 (Wifi mesh tizimi) yordamida kabeldan qutulishga muvaffaq bo'ldim: men shunchaki bitta kubni stol ostiga qo'ydim va BPI ni metr uzunlikdagi Ethernet kabeli bilan ikkinchisining LAN portiga uladim. Muvaffaqiyat.

Wireguard, RKN, Bird

Men Banana PI-dan foydalanmoqchi bo'lgan narsalardan biri - RKN tomonidan bloklangan saytlarga bepul kirish, xususan, Telegram va Slack qo'ng'iroqlari ishlashi uchun. HabrΓ© haqidagi maqolalar allaqachon ushbu mavzu bo'yicha taklif qilingan: vaqt, Π΄Π²Π°, uchta.

Ansible yordamida aynan shu yechimni qo'lladim: aloqa.

VPS Ubuntu 18.04 da ishlaydi deb taxmin qilinadi. Men Yevropadagi ikkita hosterda funksionallikni tekshirdim: Amazon va Digital Ocean.

Shunday qilib, biz yuqoridagi Armbian-ni R64-ga o'rnatdik, unga ssh orqali kirish mumkin hm-bananapi-1 va internetga kirish imkoniyati mavjud. Biz doimiy ravishda Ansible, avtomatlashtirish skriptlarini joylashtiramiz va o'rnatishni R64 da ishga tushiramiz:

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

Keyinchalik, VPN-ni VPS-ga xuddi shu tarzda joylashtirishingiz kerak:

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

Bu erda argument har doim joriy-vpn bo'ladi va haqiqiy VPS nomi o'zgaruvchida sozlangan (bu holda 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

Ha, bu barcha operatsiyalardan oldin siz papkada sirlarni (xususan, Wireguard kalitlarini) yaratishingiz kerak. ./secrets, katalog o'xshash bo'lishi kerak shunday.

Python da Ansible Automation

YAML formatida bo'lish o'rniga Ansible buyruqlari Python skriptlarida kodlanganligini sezishingiz mumkin. Taqqoslash uchun, odatdagidek qush demonini qanday yoqish mumkin:

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

va Python orqali qanday qilish kerak:

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

Pythonda Ansible buyruqlarini yozish kodni qayta ishlatish imkonini beradi va umuman olganda umumiy maqsadli tilning barcha imkoniyatlarini ochadi. Masalan, R64 va VPS-ga qushni o'rnatish:

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

funktsiya kodini ko'ring install_bird().

Bu xususiyat chaqirildi pybook amalga oshirildi shu yerda. Pybook-da hali hech qanday hujjat yo'q, lekin men bu muammoni keyinroq tuzataman.

U nima deb o'ylaydi yuqori oqim bu haqida.

Monitoring. Prometey

Jami: telegram, linkedin va pornhub ham ishlaydi, umuman foydalanuvchi tajribasi yaxshi. Ammo hamma narsa, jumladan, Xitoy apparati ham sinishi mumkin.

Yadro yangilanishlari ham qiziqarli bo'lishi mumkin: masalan, men yadro 5.4 => 5.6 ni yangilamoqchi bo'ldim, Wireguard qutidan tashqarida, yamoqqa hojat yo'q... Biroz vaqt o'tmay: yamoqlarni 5.4 dan o'tkazdim. 5.6 ga, yadro ishga tushdi, VPS ga tunnel pinglandi, lekin qush "BGP xatosi" xatosi bilan ulana olmadi ... "Men dahshatdan orqaga qaytdim" (c) 5.4; 5.6 ga o'tish TODO da qoldirildi.

Shuning uchun, yo'riqnoma va VPS-ni o'rnatishdan tashqari, men quyidagi komponentlar bilan alohida xostga o'rnatilgan (x86 Ubuntu 18.04 da) monitoringni qo'shdim:

  • prometheus, alertmanager, blackbox_exporter - barchasi docker-da
  • Ogohlantirishlar telegram kanaliga metallmatze/alertmanager-bot boti yordamida yuboriladi - shuningdek Docker-da
  • bot uchun tor, shunda bot Internet mavjud bo'lganda vaziyatlarni ogohlantirishi mumkin, ammo Telegram hali ham ishlamayapti va botning o'zi ulana olmaydi.
  • qo'llaniladi ogohlantirishlar: NodeVPNtroubles (VPS-ga ping yo'q), BirdVPNtroubles (Bird seansi yo'q), AntifilterDownloadTroubles (bloklangan IP manzillarni yuklashda xato), SiteTroubles (baxtsiz telegramma mavjud emas)
  • tizim ogohlantirishlari, masalan, HostGrowingDiskReadLatency (arzon SD kartani o'qib bo'lmaydi)

Monitoringni sozlash misoli:

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

Prometey uchun Auto Discovery /etc/prometheus/auto_http jildida sozlangan, monitorga xost qo'shish misoli (hostlar sukut bo'yicha kuzatilmaydi):

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 ta provayder, 2 BPI, har qanday uzatma

Har bir narsaga qo'shimcha ravishda, men ikkita provayderga ulanishni rejalashtirdim, shunda Internet bir provayder tarmoq bilan bog'liq muammolarga duch kelgan bo'lsa ham yoki ular Internet va hokazolarni va boshqa insoniy omillar uchun to'lashni unutgan bo'lsa ham.

Multi-wan mavzusidagi eng ilg'or foydalanuvchi tajribasi tasvirlangan shu yerda Openwrt ostidagi Mwan3 tizimi uchun. Ushbu yechim boy funksionallikka ega, lekin uni umuman multi-wan uchun sozlash va ishlatish juda qiyin. Birgina misol: agar siz birdaniga ikkita IP manzildan ba'zi saytlarga kirsangiz, ularga yoqmasligi mumkin, ular ishlashni to'xtatib qo'yishadi => "Internet ishlamayapti".

Ushbu tajribani inobatga olgan holda, men multihoming hozircha ustuvor emas, faqat o'z-o'zidan uzilish deb qaror qildim. Shunga qaramay, Linuxning so'nggi versiyalarida hamma narsa bitta buyruq bilan ishlashi kerak:

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

Shunday qilib, bitta nosozlik nuqtasini oldini olish uchun biz 2 ta BPIni olamiz, har birini bitta provayderga ulaymiz, ularni bir-biriga ulaymiz va qush/OSPF orqali bir-biri bilan dinamik marshrutlashni amalga oshiramiz.

Keyinchalik, agar xizmat mavjud bo'lsa (Internet, DNS) har birida bir xil IP manzilni e'lon qilamiz. Ya'ni, biz standart marshrutni o'zimiz emas, balki qush orqali belgilaymiz. Men yechimni aniqladim shu yerda .

Ushbu funktsiya hali amalga oshirilmagan, makkor koronavirus bu erda hiyla o'ynadi (Hammasi Aliexpress-dan kelgani yo'q; boshqa bir onlayn-do'kon Layta bir hafta ichida etkazib berishga va'da berdi, lekin bir oydan ko'proq vaqt o'tdi; ikkinchi provayderda vaqt yo'q edi. karantin oldidan kabelni uzaytirish uchun, faqat kabel uchun devorga burg'ulashda teshik olishga muvaffaq bo'ldi).

R64 qanday buyurtma berish kerak

Kengashning o'zi rasmiy do'konda SinoVoip.
Bundan tashqari, darhol buyurtma berish yaxshiroqdir:

  • ovqat + Evropa Ittifoqi yoki AQSh vilkasi standartini xabardor qiling
  • issiqlik batareyasi: radiatorlar / fanatlar; chunki protsessor ham, switch chipi ham qiziydi
  • Wi-Fi antennasi, masalan

Bir nuance bor - etkazib berish narxi bir muncha vaqt davomida rasmiy do'konda etarli darajada yuqori bo'lmagan. Menejer Judi Xuang meni hech qanday xatolik yo'qligiga ishontirdi va siz ePacket-ni 5 dollarga tanlashingiz mumkin, ammo men Rossiya uchun faqat 33 dollardan ortiq EMS borligini ko'rdim. Noxush, ammo tanqidiy emas. Bundan tashqari, agar siz etkazib berish uchun boshqa mamlakatni tanlasangiz (men barcha qit'alarni bosib o'tdim), etkazib berish ~ 5 dollar turadi. Rusofoblarmi?.. Ammo keyin men Fransiya uchun yetkazib berish narxi ham ~30$ ekanligini bilib, tinchlandim.

Natijada, Judi buyurtma berishni taklif qildi, lekin to'lamadi (ishora: avtomatik to'lov o'tmasligi uchun kartaga kamroq qo'ying); unga yozing va u etkazib berish narxini normal holatga tushiradi. Muvaffaqiyat.

masalalar

Hali hammasi mukammal ishlamayapti.

unumdorlik

Ansible=Python buyruqlari sekin, hatto bo'sh bo'lganlari ham 20-30 soniya davomida bajariladi; x86 noutbukiga qaraganda uzunroq kattalik tartibi. Bundan tashqari, dastlab ular juda tez, ~ 3 soniya davomida bajariladi, keyin ular keskin sekinlashadi. Buning sababi protsessorning isishi (bosish) bo'lishi mumkin. Go kodi ham uzoq vaqt ishlaydi:

# запрос ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊ для промСтСя ΠΈΠ· 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

Wi-Fi

Wi-Fi ishlaydi, ammo Armbian-da u bir kundan keyin to'xtaydi, deb yozadi:

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

Faqat qayta ishga tushirish yordam beradi. Biz davom etishimiz kerak turlarga ajratmoq.

Ethernet

Ethernet ishlaydi, lekin ~64 soatdan keyin RXNUMX paketlari (DHCP) kelishini to'xtatadi.
Interfeysni qayta ishga tushirish yordam beradi:

ifdown br0; sleep 30; ifup br0

Haydovchi yangi, u yadroga hali qabul qilinmagan, umid qilamanki, bu xitoylik Landen Chao tugatadi.

Manba: www.habr.com

a Izoh qo'shish