Banana Pi R64 чиглүүлэгч - Debian, Wireguard, RKN

Banana Pi 64 нь Raspberry Pi-тэй төстэй нэг самбарт компьютер боловч хэд хэдэн Ethernet порттой бөгөөд үүнийг ерөнхий зориулалтын Linux түгээлт дээр суурилсан чиглүүлэгч болгон хувиргах боломжтой болгодог.

Banana Pi R64 чиглүүлэгч - Debian, Wireguard, RKN

Тийм ээ, аль хэдийн Openwrt байдаг, гэхдээ энэ нь өөрийн гэсэн асуудлуудтай, GUI болон CLI; Mikrotik байгаа, гэхдээ дахин өөрийн GUI/CLI-тай, Wireguard нь хайрцагнаас гарч ажиллахгүй байна ... Ерөнхийдөө би таны ажилладаг стандарт Линуксийн хүрээнд үлдэж, уян хатан тохиргоотой чиглүүлэгчийг хүсч байна. өдөр бүр хамт.

BPI, R64, нэг самбар гэсэн нэрийн дор бичсэн нийтлэлд би ижил зүйлийг хэлэх болно - Banana Pi R64 нэг самбар өөрөө.

Зураг сонгох. eMMC-ээр татаж авах

Ажиллаж байхдаа олж авах ёстой хамгийн эхний ур чадвар SBC ерөнхийд нь, ялангуяа R64-ийн хувьд энэ нь үйлдлийн системийг хэрхэн ачаалж сурах, түүнтэй харилцах боломжтой гэсэн үг юм, учир нь R64 нь дэлгэцийн порт байхгүй (жишээ нь HDMI). Бүх зүйл унасан үед - Wifi, Ethernet, Bluetooth, USB гэх мэт ажиллахаа больсон. UART байдаг бөгөөд интерфэйсээр дамжуулан та юу буруу болсныг үргэлж харж, шаардлагатай бол консолоос хэд хэдэн командыг ажиллуулж болно.

USB-UART-ээр R64-тэй холбогдох алгоритм:

  • Бид USB-UART кабель (PL2303, Serial-to-USB) авахаар радио сэлбэгийн дэлгүүрт очдог.
  • Доорх зурган дээрх шиг нэг USB үзүүрийг компьютерт, нөгөө нь UART-ийг R64-д дөрөвөөс гурван утсаар холбоно.
  • компьютерийн консол дээр ажиллуулах sudo minicom

Үүний дараа ихэнх тохиолдолд нэг самбарт консол гарч ирэх болно = амжилт.
Та дэлгэрэнгүй мэдээллийг харах боломжтой энд.

Banana Pi R64 чиглүүлэгч - Debian, Wireguard, RKN

Дараа нь хамгийн хялбар арга бол үйлдлийн системийг SD картаас ачаалах явдал юм: татаж авах холбоос дүрс болон бөглөнө үү:

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

Бид картыг R64 SD үүрэнд хийж, асааж, холбогдсон консол ачаалагдаж, эхлээд ачаалж, дараа нь стандарт Линукс ачаалагдаж байгааг ажиглана.

Өөр ачаалах сонголт бол eMMC гэж нэрлэгддэг R64-д суулгасан 8Gb картыг ашиглах явдал юм. Вики дэх зааврын дагуу бид зургийг төхөөрөмжид хуулж авдаг
/dev/mmcblk0-г BPI руу шилжүүлж, дахин ачаалж, SD картыг салгаад, BPI-г дахин асаана ... энэ нь ажиллахгүй байна. Яаж нааш цааш явах вэ Boot select битгий санаа зов.

Баримт нь ядаж BPI-ийн хувьд дотоод флаш дискнээс ачаалахын тулд тусгай туг тавих хэрэгтэй.

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]

Дараа нь та тусгай ачаалах хуваалт руу preloader бичих хэрэгтэй

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

Үйлдвэрлэгч R64 (Хятад) энэ хоёртын хувилбарыг нийтэлсэн энд. Энэ нь юу хийдэг нь тодорхойгүй (эх код байхгүй), гэхдээ үүнгүйгээр ажиллахгүй.

Ерөнхийдөө үүний дараа зургууд eMMC-ээс ачаалж эхэлдэг. Хэрэв та үүнийг ойлгож, эхнээс нь зураг үүсгэхийг хүсч байвал хоёр тохиолдолд (SD/eMMC) цөмийг ачаалахын тулд хэд хэдэн файл (SD картны урьдчилан ачаалагч, ATF, u-boot) бичих хэрэгтэй. Энэ сэдэв хэвээр байна хөгжиж байна, гэхдээ бидний хувьд гол зүйл бол энэ нь ажилладаг бөгөөд зүгээр юм.

Одоо би eMMC-ээр татаж авдаг, үнэнийг хэлэхэд би үүнийг ашигладаггүй, SD карт хангалттай, гэхдээ үүнийг ажиллуулахын тулд би маш их цаг зарцуулсан тул нийтлэлд оруулаарай.

Үйлдлийн системийг сонгох. Армби

Аппликэйшний эхний ажил бол Wireguard-г эхлүүлэх явдал юм. Цөм талдаа угсраагүй, толгой байхгүй байгааг тэр даруй олж мэдсэн. Би цөмийг дахин бүтээж, x86-г ашигладаг зуршлынхаа дагуу DKMS ашиглан цөмийн модулийг угсарсан. Гэсэн хэдий ч arm64 дээр жижиг хэрэгслүүдийг барих хурд нь намайг тааламжгүй гайхшруулсан. Дараа нь өөр цөмийн модуль шаардлагатай байсан гэх мэт. Ерөнхийдөө цөмтэй холбоотой бүх зүйлийг дулаан x86 зөөврийн компьютер дээр хамгийн сайн угсарч, дараа нь энгийн хуулж, дахин ачаалж, туршиж үзээд R64 руу шилжүүлдэг нь харагдаж байна.

Өөр нэг зүйл бол хэрэглэгчийн орон зайн хэсэг юм. Миний хувьд Debian-г сонгосон тохиолдолд arm64 архитектурт зориулсан бүх зүйл packages.debian.org дээр байгаа бөгөөд юу ч дахин бүтээх шаардлагагүй.

Өөр унадаг дугуй үйлдвэрлэхгүйн тулд И зөөвөрлөсөн Армби BPI R64 дээр.
Өөрөөр хэлбэл, энэ нь: хэрэглэгчийн орон зай нь Armbian бөгөөд цөмийг репозитороос авсан болно. Фрэнк-А. Хамгийн сүүлийн үеийн зургийг татаж авах боломжтой энд.

R64 програм хангамжийн хэсгийг боловсруулах бүх үйл ажиллагаа явагдаж байна форум. Ерөнхийдөө үйлдвэрлэгч өөрөө Openwrt-д зориулсан чиглүүлэгчийг сурталчлахыг хичээдэг боловч Германы хөгжүүлэгч Франкийн үйл ажиллагааны ачаар бүх функцууд Debian-ийн цөмд хурдан ордог. Гайхалтай нь Фрэнк форум болгонд идэвхтэй байдаг.

Ажлын байрны зохион байгуулалт: утас

Би тус тусад нь, хөгжүүлэлт/туршилтын явцад SBC-г (зөвхөн BPI биш) хэрхэн ширээн дээр байрлуулж, интернетийн эх сурвалжаас Ethernet кабелийг өрөө/оффис даяар дамжуулахгүй байхыг танд хэлэхийг хүсч байна. Үнэн хэрэгтээ та нэг талаас интернетээр тоног төхөөрөмжөөр хангах хэрэгтэй, гэхдээ нөгөө талаас тэр техник хангамжийн бүх зүйл, юуны түрүүнд Wifi эвдэрч магадгүй юм.

Эхлээд би хямдхан USB-Wifi "шүгэл" худалдаж авахаар шийдсэн бөгөөд үүнийг BPI дээрх цорын ганц порт руу залгаад утсыг мартав. Үүнийг хийхийн тулд би хямд үнэтэй TP-LINK TL-WN725N USB 2.0 худалдаж авсан боловч удалгүй энэ нь салахгүй нь тодорхой болсон: шүгэл ажиллахын тулд танд цөмийн драйвер хэрэгтэй байсан нь мэдээжийн хэрэг тэнд байгаагүй. (дараа нь би шаардлагатай RTL8XXXU драйверийг угсарсан, гэхдээ энэ нь боломжгүй хэвээр байна). Мөн Ethernet кабель хэсэг хугацаанд өрөөний үзэмжийг сүйтгэсэн.

Үүний үр дүнд би Tenda MW3 (Wifi торон систем) -ийн тусламжтайгаар кабелиас салж чадсан: Би зүгээр л нэг кубыг ширээн доор байрлуулж, BPI-ийг метр урт Ethernet кабелиар сүүлийн LAN порт руу холбосон. Амжилт.

Утас хамгаалагч, RKN, Шувуу

Banana PI-г ашиглахыг хүсч байгаа зүйлсийн нэг бол RKN-ээс хаасан сайтууд руу үнэгүй нэвтрэх, ялангуяа Telegram болон Slack дуудлага хийх боломжтой байх явдал юм. Энэ сэдвээр Хабрегийн талаархи нийтлэлүүдийг аль хэдийн санал болгосон: цаг хугацаа, два, гурав.

Би Ansible ашиглан яг энэ шийдлийг ашигласан: ссылка.

VPS нь Ubuntu 18.04 үйлдлийн системтэй гэж таамаглаж байна. Би Европ дахь Amazon болон Digital Ocean гэсэн хоёр хостын ажиллагааг шалгасан.

Тиймээс, бид дээрх Armbian-ийг R64 дээр суулгасан бөгөөд энэ нь нэрээр ssh-ээр нэвтрэх боломжтой hm-bananapi-1 мөн интернэт холболттой. Бид Ansible, автоматжуулалтын скриптүүдийг байнга байрлуулж, 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

Дараа нь та манай VPN-г VPS-д дараах байдлаар байрлуулах хэрэгтэй.

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

Энд аргумент нь үргэлж одоогийн-vpn бөгөөд бодит VPS нэрийг хувьсагчаар тохируулсан байдаг (энэ тохиолдолд энэ нь 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

Өө тийм, эдгээр бүх үйлдлүүдийг хийхийн өмнө та хавтсанд нууц (ялангуяа Wireguard түлхүүр) үүсгэх хэрэгтэй. ./secrets, лавлах нь иймэрхүү харагдах ёстой тэгээд.

Python дахь Ansible Automation

YAML форматын оронд Ansible командууд нь Python скриптэд кодлогдсон болохыг та анзаарсан байх. Харьцуулбал шувууны демоныг ердийн аргаар хэрхэн идэвхжүүлэх вэ:

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

мөн Python-ээр хэрхэн ижил зүйлийг хийх вэ:

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

Python дээр Ansible командуудыг бичих нь кодыг дахин ашиглах боломжийг олгодог бөгөөд ерөнхийдөө ерөнхий зориулалтын хэлний бүх боломжийг нээж өгдөг. Жишээлбэл, R64 болон VPS дээр шувуу суулгах:

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

функцийн кодыг үзнэ үү install_bird().

Энэ функцийг дуудсан pybook хэрэгжүүлсэн энд. Одоогоор pybook дээр ямар ч баримт бичиг байхгүй, гэхдээ би энэ асуудлыг дараа засах болно.

Тэр юу гэж бодож байна дээд энэ талаар.

Хяналт. Прометей

Нийт: telegram ажилладаг, linkedin болон pornhub, ерөнхийдөө хэрэглэгчийн туршлага зүгээр. Гэхдээ бүх зүйл эвдэрч болно, тэр дундаа Хятадын техник хангамж.

Цөмийн шинэчлэлтүүд бас сонирхолтой байж болно: жишээ нь, би цөмийн 5.4 => 5.6-г шинэчлэхийг хүссэн, сайн, Wireguard хайрцагнаас гарсан байна, нөхөөс хийх шаардлагагүй ... Хэсэг хугацааны дараа: Би 5.4-ээс засваруудыг маш их хичээнгүйлэн шилжүүлсэн. 5.6-д цөм ажиллаж, VPS-ийн хонгил дуугарсан боловч шувуу "BGP алдаа" гэсэн алдаатай холбогдож чадахгүй байна ... "Би аймаар буцаж эргэлээ" (в) 5.4 хүртэл; TODO-д 5.6 руу шилжихийг хойшлуулсан.

Тиймээс, чиглүүлэгч болон VPS суулгахаас гадна би дараах бүрэлдэхүүн хэсгүүдтэй тусдаа хост дээр суулгасан мониторингийг (x86 Ubuntu 18.04 дээр) нэмсэн.

  • prometheus, alertmanager, blackbox_exporter - бүгд докер дээр
  • Сэрэмжлүүлэгийг telegram суваг руу metalmatze/alertmanager-bot бот ашиглан илгээдэг - мөн Docker дээр
  • tor-д зориулсан, ингэснээр bot нь интернет байгаа үед нөхцөл байдлыг сэрэмжлүүлэх боломжтой боловч Telegram ажиллахгүй байгаа бөгөөд бот өөрөө холбогдож чадахгүй байна.
  • хэрэглэсэн сэрэмжлүүлэг: NodeVPNtroubles (VPS-д ping хийхгүй), BirdVPNroubles (Шувууны сесс байхгүй), AntifilterDownloadTroubles (хаагдсан IP хаягуудыг ачаалахад алдаа), SiteTroubles (хөгжилтэй телеграм ашиглах боломжгүй)
  • системийн сэрэмжлүүлэг, жишээлбэл, HostGrowingDiskReadLatency (хямдхан SD карт унших боломжгүй болно)

Мониторинг суурилуулах жишээ:

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

Prometheus-д зориулсан Auto Discovery нь /etc/prometheus/auto_http хавтсанд тохируулагдсан бөгөөд энэ нь хяналтад хост нэмэх жишээ юм (хостуудыг анхдагчаар хянадаггүй):

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

ХИЙХ ХИЙХ: 2 үйлчилгээ үзүүлэгч, 2 BPI, дурын дамжуулалтын шилжүүлэлт

Бүх зүйлээс гадна нэг үйлчилгээ үзүүлэгчийн сүлжээнд асуудал гарсан, эсвэл интернетийн төлбөр төлөхөө мартсан ч гэсэн интернет үргэлжлүүлэн ажиллахын тулд би хоёр үйлчилгээ үзүүлэгчтэй холбогдохоор төлөвлөж байсан.

Multi-wan сэдвээр хамгийн дэвшилтэт хэрэглэгчийн туршлагыг тайлбарласан болно энд Openwrt доорх Mwan3 системийн хувьд. Энэхүү шийдэл нь маш олон функцтэй боловч үүнийг ерөнхийд нь олон ваннд тохируулах, ажиллуулах нь нэлээд төвөгтэй байдаг. Ганцхан жишээ: Хэрэв та хоёр IP хаягаар зарим сайт руу орвол энэ нь таалагдахгүй байж магадгүй, тэд ажиллахаа болино => "Интернэт ажиллахгүй байна."

Энэ туршлагыг харгалзан би multihoming нь нэн тэргүүний асуудал биш, зөвхөн бүтэлгүйтэл гэж шийдсэн. Гэсэн хэдий ч Linux-ийн хамгийн сүүлийн хувилбаруудад бүх зүйл нэг тушаалаар ажиллах ёстой юм шиг санагдаж байна:

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

Тиймээс, нэг цэгийн бүтэлгүйтлээс зайлсхийхийн тулд бид 2 BPI авч, тус бүрийг нэг үйлчилгээ үзүүлэгчтэй холбож, тэдгээрийг хооронд нь холбож, шувуу/OSPF-ээр дамжуулан динамик чиглүүлэлт хийдэг.

Дараа нь, хэрэв үйлчилгээ (Интернет, DNS) байгаа бол бид тус бүр дээр ижил IP хаягийг сурталчилдаг. Өөрөөр хэлбэл, бид анхдагч замыг өөрсдөө тогтоохгүй, харин шувуугаар дамжин өнгөрөх болно. Би шийдлийг тагнасан энд .

Энэ функц хараахан хэрэгжээгүй, нууцлаг коронавирус энд заль мэх тоглосон (бүгд Aliexpress-ээс ирээгүй; өөр нэг онлайн дэлгүүр Лайта долоо хоногийн дараа хүргэнэ гэж амласан боловч нэг сар гаруй хугацаа өнгөрчээ; хоёр дахь үйлчилгээ үзүүлэгчд цаг зав гарсангүй. хорио цээрийн өмнө кабелийг сунгахын тулд зөвхөн кабелийн хананд өрөмдлөгийн нүх гаргаж чадсан).

R64 хэрхэн захиалах вэ

Самбар нь өөрөө албан ёсны дэлгүүрт байдаг SinoVoip.
Мөн нэн даруй захиалах нь дээр:

  • хоол хүнс + ЕХ эсвэл АНУ-ын залгуурын стандартыг мэдээлэх
  • дулаан шингээгч: радиатор / сэнс; Учир нь CPU болон шилжүүлэгчийн чип хоёулаа халж байна
  • wifi антен, Жишээ нь

Нэг нюанс бий - хүргэлтийн үнэ хэсэг хугацаанд албан ёсны дэлгүүрт хангалтгүй өндөр болсон. Менежер Жуди Хуан намайг ямар ч алдаа байхгүй гэж итгүүлсэн бөгөөд та ePacket-ийг 5 доллараар сонгож болно, гэхдээ Орост зөвхөн 33 доллараас дээш үнэтэй EMS байдаг гэдгийг би харсан. Тааламжгүй, гэхдээ шүүмжлэлтэй биш. Түүгээр ч барахгүй, хэрэв та хүргэлт хийх өөр аль нэг улсыг сонговол (би бүх тивээр явсан) хүргэлтийн үнэ ~5 доллар болно. Орософууд уу?.. Харин дараа нь Францын хувьд хүргэлтийн үнэ нь бас ~30 доллар болохыг олж мэдээд тайвширлаа.

Үүний үр дүнд Жуди захиалга өгөхийг санал болгосон боловч төлөхгүй (сануулга: автомат төлбөр дамжихгүйн тулд картанд бага тавь); Түүнд бичээрэй, тэр хүргэлтийн үнийг хэвийн хэмжээнд хүртэл бууруулах болно. Амжилт.

асуудлууд

Одоохондоо бүх зүйл төгс ажиллаж чадахгүй байна.

Бүтээмж

Ansible=Python командуудыг 20-30 секундын турш удаан, сул зогсолттой байсан ч гэсэн гүйцэтгэдэг; x86 зөөврийн компьютерээс урт хэмжээний дараалал. Түүгээр ч барахгүй эхлээд тэд маш хурдан, ~ 3 секундын турш гүйцэтгэгдэж, дараа нь огцом удааширдаг. Энэ нь CPU халж байгаатай холбоотой байж болох юм. Go код нь ажиллахад удаан хугацаа шаардагдана:

# запрос метрик для прометея из 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 ажилладаг, гэхдээ Armbian дээр нэг өдрийн дараа зогсдог гэж бичжээ.

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

Зөвхөн дахин эхлүүлэх нь тусалдаг. Бид цаашаа явах хэрэгтэй ялгах.

Ethernet

Ethernet ажилладаг, гэхдээ ~64 цагийн дараа RXNUMX-ийн пакетууд (DHCP) ирэхээ болино.
Интерфэйсийг дахин эхлүүлэх нь дараахад тусална.

ifdown br0; sleep 30; ifup br0

Жолооч нь шинэ, энэ нь цөмд хараахан зөвшөөрөгдөөгүй байна, би Хятадын Ланден Чао байх гэж найдаж байна дуусгадаг.

Эх сурвалж: www.habr.com

сэтгэгдэл нэмэх