Banana Pi R64 Router - Debian, Wireguard, RKN

Banana Pi 64, Raspberry Pi-yə bənzəyən, lakin bir neçə Ethernet portuna malik bir lövhəli kompüterdir ki, bu da onu ümumi təyinatlı Linux paylanması əsasında marşrutlaşdırıcıya çevirməyə imkan verir.

Banana Pi R64 Router - Debian, Wireguard, RKN

Bəli, artıq Openwrt var, lakin onun öz problemləri, GUI və CLI var; Mikrotik var, amma yenə öz GUI/CLI var və Wireguard qutudan çıxmır... Ümumiyyətlə, işlədiyiniz standart Linux çərçivəsində qalaraq, çevik tənzimləməli router istəyirəm. hər gün ilə.

BPI, R64, tək lövhə adları altındakı məqalədə eyni şeyi nəzərdə tutacağam - Banana Pi R64 tək lövhənin özü.

Təsvirin seçilməsi. eMMC vasitəsilə yükləyin

İşləyərkən əldə etməli olduğunuz ilk bacarıq SBC ümumiyyətlə və xüsusilə R64 ilə bu, əməliyyat sistemini ona necə yükləməyi öyrənmək və onunla qarşılıqlı əlaqə qura bilmək deməkdir, çünki R64-də monitor üçün port yoxdur (məsələn, HDMI). Hər şey sönəndə - Wifi, Ethernet, Bluetooth, USB və s. işləməyi dayandırdı.UART var, onun interfeysi vasitəsilə hər zaman nəyin səhv getdiyini görə bilərsiniz və lazım olduqda konsoldan bir neçə əmr işlədə bilərsiniz.

USB-UART vasitəsilə R64-ə qoşulma alqoritmi:

  • USB-UART kabeli (PL2303, Serial-to-USB) üçün radio hissələri mağazasına qaçırıq
  • aşağıdakı şəkildəki kimi bir USB ucunu kompüterə, digərini isə UART-ı dörddən üç naqillə R64-ə qoşun
  • kompüter konsolunda işə salın sudo minicom

Bundan sonra, əksər hallarda tək lövhəli konsol görünəcək = müvəffəqiyyət.
Daha ətraflı baxa bilərsiniz burada.

Banana Pi R64 Router - Debian, Wireguard, RKN

Sonra, ən asan yol əməliyyat sistemini SD kartdan yükləməkdir: yükləmək əlaqə şəkil və doldurun:

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

Kartı R64 SD yuvasına yerləşdiririk, onu yandırırıq və bağlı konsolun ilk yüklənməsini, sonra isə standart Linux yüklənməsini müşahidə edirik.

Alternativ yükləmə seçimi, eMMC adlanan R64-də artıq quraşdırılmış 8Gb kartdan istifadə etməkdir. Vikidəki təlimatlara uyğun olaraq şəkli cihaza kopyalayırıq
/dev/mmcblk0-ı BPI-a köçürün, yenidən başladın, SD kartı çıxarın, BPI-ni yenidən yandırın... və o, işləmir. Geri və irəli necə getmək olar Boot select narahat olma.

Fakt budur ki, ən azı BPI üçün daxili bir flash sürücüdən yükləmək üçün xüsusi bir bayraq təyin etməlisiniz:

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]

Bundan sonra, xüsusi yükləmə bölməsinə preloader yazmalısınız

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

İstehsalçı R64 (Çin) bu ikiliyi dərc etdi burada. Nə etdiyi bilinmir (mənbə kodları yoxdur), lakin onsuz da işləməyəcək.

Ümumiyyətlə, bundan sonra şəkillər eMMC-dən yüklənməyə başlayır. Əgər siz bunu başa düşmək və sıfırdan şəkillər yaratmaq istəyirsinizsə, onda hər iki halda (SD/eMMC) nüvəni yükləməyə başlamaq üçün daha bir neçə fayl (SD kart üçün önyükləyici, ATF, u-boot) yazmalısınız. Bu mövzu hələ də qalır inkişaf edir, amma bizim üçün əsas odur ki, işləyir və yaxşıdır.

İndi eMMC vasitəsilə yükləyirəm, düzünü desəm, istifadə etmirəm, SD kart kifayətdir, amma onu işə salmaq üçün çox vaxt sərf etdim, ona görə də məqalədə olsun.

Əməliyyat sisteminin seçilməsi. erməni

İlk tətbiq tapşırığı təbii olaraq Wireguard olan VPN-i işə salmaqdır. Dərhal məlum oldu ki, nüvə tərəfində yığılmayıb və heç bir başlıq yoxdur. Mən nüvəni yenidən qurdum və x86 ilə adət etdiyim kimi, DKMS-dən istifadə edərək nüvə modulunu yığdım. Bununla belə, arm64-də hətta kiçik kommunal xidmətlərin qurulması sürəti məni xoşagəlməz şəkildə təəccübləndirdi. Və sonra başqa bir nüvə modulu tələb olundu və s. Ümumiyyətlə, belə çıxır ki, nüvə ilə əlaqəli hər şey ən yaxşı şəkildə isti x86 noutbukunda yığılır, sonra sadə surətdə kopyalanaraq, yenidən işə salınaraq və sınaqdan keçirilərək R64-ə köçürülür.

Başqa bir şey istifadəçi sahəsi hissəsidir. Debian-ı seçdiyim halda, arm64 arxitekturası üçün hər şey artıq packages.debian.org saytındadır və heç bir şeyi yenidən qurmağa ehtiyac yoxdur.

Başqa bir velosiped istehsal etməmək üçün İ daşınıb Armiya BPI R64-də.
Daha doğrusu, bu: istifadəçi sahəsi hissəsi Armbiandır və ləpə depodan götürülür. Səmimi-Ə. Ən son şəkil endirilə bilər burada.

R64-ün proqram təminatı hissəsinin inkişafı üzrə bütün fəaliyyətlər üzərində aparılır forum. Ümumiyyətlə, istehsalçının özü Openwrt üçün marşrutlaşdırıcını populyarlaşdırmağa çalışır, lakin Almaniyadan olan tərtibatçı Frankın fəaliyyəti sayəsində bütün xüsusiyyətlər tez bir zamanda Debian üçün nüvədə sona çatır. Təəccüblüdür ki, Frank hər forum mövzusunda aktivdir.

İş sahəsinin təşkili: məftillər

Ayrı-ayrılıqda sizə məlumat vermək istərdim ki, inkişaf/sınaq zamanı SBC-ni (yalnız BPI deyil) bütün otaq/ofis boyunca İnternet mənbəyindən ona Ethernet kabeli çəkməmək üçün masanın üzərinə necə yerləşdirin. Məsələ burasındadır ki, bir tərəfdən internetlə təchizat təmin etmək lazımdır, digər tərəfdən isə həmin aparatda hər şey xarab ola bilər və ilk növbədə Wifi.

Əvvəlcə ucuz bir USB-Wifi "düdük" almaq qərarına gəldim, onu BPI-dəki yeganə porta qoşdum və naqilləri unutdum. Bunu etmək üçün ucuz bir TP-LINK TL-WN725N USB 2.0 aldım, amma çox keçmədən onun qalxmayacağı məlum oldu: fitin işləməsi üçün əlbəttə ki, orada olmayan bir nüvə sürücüsü lazımdır. (daha sonra mən lazımi RTL8XXXU sürücüsünü yığdım, lakin bu hələ də praktiki deyil). Və Ethernet kabeli bir müddət otağın görünüşünü korladı.

Nəticədə, Tenda MW3 (Wifi mesh sistemi) köməyi ilə kabeldən qurtula bildim: Mən sadəcə bir kubu masanın altına qoydum və BPI-ni metr uzunluğunda Ethernet kabeli ilə sonuncunun LAN portuna qoşdum. Uğur.

Wireguard, RKN, Bird

Banana PI-dən istifadə etmək istədiyim şeylərdən biri də Telegram və Slack zənglərinin işləyə bilməsi üçün RKN tərəfindən bloklanmış saytlara pulsuz giriş əldə etməkdir. Habré haqqında məqalələr artıq bu mövzuda təklif edilmişdir: vaxt, два, üç.

Mən Ansible istifadə edərək tam olaraq bu həlli tətbiq etdim: əlaqə.

VPS-nin Ubuntu 18.04 ilə işlədiyi güman edilir. Mən Avropadakı iki hosterdə funksionallığı yoxladım: Amazon və Digital Ocean.

Beləliklə, yuxarıdakı Armbian-ı R64-ə quraşdırdıq, adı altında ssh vasitəsilə əldə edilə bilər hm-bananapi-1 və internetə çıxışı var. Biz ardıcıl olaraq Ansible, avtomatlaşdırma skriptlərini yerləşdiririk və quraşdırmanın özünü R64-də işə salırıq:

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

Sonra VPN-mizi VPS-ə eyni şəkildə yerləşdirməlisiniz:

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

Burada arqument həmişə cari-vpn-dir və faktiki VPS adı dəyişəndə ​​konfiqurasiya edilir (bu halda paris-vpn-aws-t2-micro-1-dir):

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

Bəli, bütün bu əməliyyatlardan əvvəl qovluğa sirlər (xüsusilə Wireguard açarları) yaratmalısınız. ./secrets, kataloq belə görünməlidir belə.

Python-da Ansible Avtomatlaşdırma

YAML formatında olmaq əvəzinə Ansible əmrlərinin Python skriptlərində kodlaşdırıldığını görə bilərsiniz. Müqayisə üçün, quş demonunu adi şəkildə necə aktivləşdirmək olar:

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

və eyni şeyi Python vasitəsilə necə etmək olar:

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

Python-da Ansible əmrlərinin yazılması kodu təkrar istifadə etməyə imkan verir və ümumilikdə ümumi təyinatlı dilin bütün imkanlarını açır. Məsələn, R64 və VPS-də quş quraşdırmaq:

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

funksiya koduna baxın install_bird().

Bu xüsusiyyət adlanır pybook həyata keçirilən burada. Pybook-da hələ heç bir sənəd yoxdur, lakin mən bu problemi daha sonra həll edəcəyəm.

O nə düşünür upstream bu barədə.

Monitorinq. Prometey

Ümumi: telegram işləyir, linkedin və pornhub da, ümumiyyətlə istifadəçi təcrübəsi yaxşıdır. Ancaq Çin avadanlıqları da daxil olmaqla hər şey qıra bilər.

Kernel yeniləmələri də maraqlı ola bilər: məsələn, kernel 5.4 => 5.6-nı yeniləmək istədim, yaxşı, Wireguard qutudan kənardadır, yamaq lazım deyil... Tezliklə dedim: Yamaları 5.4-dən çox əziyyətlə köçürdüm. 5.6-a, nüvə işə salındı, VPS-ə tunel pingləndi, lakin quş "BGP Xətası" xətası ilə əlaqə qura bilmədi ... "Dəhşət içində geri döndüm" (c) 5.4-ə qədər; 5.6-a keçid TODO-da təxirə salındı.

Buna görə, marşrutlaşdırıcını və VPS-i quraşdırmaqdan əlavə, aşağıdakı komponentləri olan ayrı bir hostda quraşdırılmış monitorinqi (x86 Ubuntu 18.04-də) əlavə etdim:

  • prometheus, alertmanager, blackbox_exporter - hamısı docker-də
  • Xəbərdarlıqlar telegram kanalına metalmatze/alertmanager-bot botundan istifadə etməklə göndərilir - həmçinin Docker-də
  • bot üçün tor, belə ki, bot İnternet olduqda vəziyyətləri xəbərdar edə bilər, lakin telegram hələ də işləmir və botun özü qoşula bilmir
  • tətbiq edilir xəbərdarlıqlar: NodeVPNtroubles (VPS-ə ping yoxdur), BirdVPNtroubles (Quş sessiyası yoxdur), AntifilterDownloadTroubles (bloklanmış IP ünvanlarını yükləmə xətası), SiteTroubles (pis teleqram mövcud deyil)
  • sistem xəbərdarlıqları, məsələn, HostGrowingDiskReadLatency (ucuz SD kart oxunmaz olur)

Monitorinq quraşdırma nümunəsi:

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

Prometheus üçün Avtomatik Kəşf /etc/prometheus/auto_http qovluğunda konfiqurasiya edilib, monitorinqə host əlavə etmək nümunəsi (hostlar defolt olaraq monitorinq edilmir):

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 provayder, 2 BPI, hər hansı bir ötürülmə əvəzi

Hər şeyə əlavə olaraq iki provayderə qoşulmağı planlaşdırırdım ki, bir provayderin şəbəkə ilə bağlı problemi olsa da, internet pulunu ödəməyi unutsalar da və s. və digər insan faktorları olsa belə, internet işləməyə davam etsin.

Multi-wan mövzusunda ən qabaqcıl istifadəçi təcrübəsi təsvir edilmişdir burada Openwrt altında Mwan3 sistemi üçün. Bu həll zəngin funksionallığa malikdir, lakin onu ümumi olaraq multi-wan üçün qurmaq və idarə etmək olduqca çətin olur. Sadəcə bir misal: bəzi saytlara eyni anda iki IP ünvanından daxil olsanız, bu, onların xoşuna gəlməyə bilər, işləməyi dayandıracaqlar => “İnternet işləmir.”

Bu təcrübəni nəzərə alaraq qərara gəldim ki, multihoming hələ prioritet deyil, yalnız uğursuzluqdur. Baxmayaraq ki, Linux-un ən son versiyalarında hər şey bir əmrlə işləməlidir:

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

Beləliklə, bir uğursuzluq nöqtəsinin qarşısını almaq üçün biz 2 BPI götürürük, hər birini bir provayderə bağlayırıq, onları bir-birinə bağlayırıq və quş/OSPF vasitəsilə bir-biri ilə dinamik marşrutlaşdırma ilə əlaqə qururuq.

Bundan sonra, xidmət mövcud olduqda (İnternet, DNS) hər birində eyni IP ünvanını reklam edirik. Yəni standart marşrutu özümüz yox, quş vasitəsilə təyin edəcəyik. Mən həll yoluna baxdım burada .

Bu funksionallıq hələ həyata keçirilməyib, məkrli koronavirus burada hiylə oynadı (Hər şey Aliexpress-dən gəlmədi; başqa bir onlayn mağaza, Layta bir həftəyə çatdırmağı vəd etdi, amma bir aydan çox keçdi; ikinci provayderin vaxtı yox idi. karantindən əvvəl kabeli uzatmaq üçün, yalnız kabel üçün divara qazmada bir deşik əldə etməyi bacardı).

R64 necə sifariş etmək olar

Lövhənin özü rəsmi mağazadadır SinoVoip.
Dərhal sifariş vermək daha yaxşıdır:

  • qidalanma + AB və ya ABŞ fiş standartını məlumatlandırın
  • soyuducu: radiatorlar / fanatlar; çünki həm CPU, həm də keçid çipi qızır
  • wifi antenası, məsələn

Bir nüans var - çatdırılma qiyməti bir müddətdir rəsmi mağazada qeyri-adekvat yüksək olmuşdur. Menecer Judy Huang məni inandırdı ki, heç bir səhv yoxdur və siz ePacket-i 5 dollara seçə bilərsiniz, lakin mən gördüm ki, Rusiya üçün >33 dollara yalnız EMS var. Xoşagəlməz, lakin kritik deyil. Üstəlik, çatdırılma üçün hər hansı başqa ölkə seçsəniz (bütün qitələri keçdim), çatdırılma ~ 5 dollara başa gələcək. Rusofoblar?.. Amma sonra gördüm ki, Fransa üçün çatdırılma qiyməti də ~30$-dır və sakitləşdim.

Nəticədə Judy sifariş verməyi təklif etdi, amma ödəmədi (işarə: avtomatik ödənişin keçməməsi üçün karta az qoyun); ona yazın o da çatdırılma qiymətini normala endirəcək. Uğur.

Məsələləri

Hələ hər şey mükəmməl işləmir.

Məhsuldarlıq

Ansible=Python əmrləri yavaş-yavaş, hətta boş olanlar da 20-30 saniyə ərzində yerinə yetirilir; x86 noutbukundan daha uzun miqyaslı sifariş. Üstəlik, əvvəlcə onlar olduqca tez, ~3 saniyə icra edilir, sonra kəskin şəkildə yavaşlayırlar. Bu, CPU-nun istiləşməsi ilə əlaqədar ola bilər. Go kodunun işləməsi də çox vaxt aparır:

# запрос метрик для прометея из 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 işləyir, lakin Armbian-da təxminən bir gündən sonra dayanır, yazır:

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

Yalnız yenidən başladın kömək edir. Biz irəli getməliyik sırala.

Ethernet

Ethernet işləyir, lakin ~64 saatdan sonra RXNUMX paketlərinin (DHCP) gəlməsi dayanır.
İnterfeysi yenidən başlatmaq kömək edir:

ifdown br0; sleep 30; ifup br0

Sürücü təzədir, hələ kernelə qəbul olunmayıb, ümid edirəm ki, çin Landen Chaodur bitirir.

Mənbə: www.habr.com

Добавить комментарий