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, Openwrt var, amma onun özünəməxsus xüsusiyyətləri, öz GUI və CLI-si var; Mikrotik var, amma yenə də öz GUI/CLI-si var və Wireguard Qutudan çıxmır... Əsasən, hər gün işlədiyim standart Linux çərçivəsində qalaraq, çevik parametrlərə malik bir router istəyirəm.

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 praktik tapşırıq, təbii ki, VPN-i işə salmaqdır WireguardDərhal nüvənin düzgün kompilyasiya edilmədiyini və başlıqların olmadığını aşkar etdim. Nüvəni yenidən qurdum və x86 ilə vərdiş etdiyim kimi, DKMS istifadə edərək nüvə modulu qurdum. Lakin, ARM64-də, hətta kiçik yardımçı proqramlar üçün belə, qurulma sürəti xoşagəlməz dərəcədə təəccüblü idi. Sonra başqa bir nüvə moduluna ehtiyac yarandı və sair. Əsasən, məlum olur ki, nüvə ilə əlaqəli hər hansı bir şeyi köhnəlmiş x86 noutbukunda kompilyasiya etmək, sonra sadəcə ARM64-ə kopyalayıb yapışdırmaq, yenidən başlatmaq və sınaqdan keçirmək ən yaxşısıdır.

İstifadə sahəsi hissəsi başqa bir məsələdir. Mənim vəziyyətimdə seçim Debian, arm64 arxitekturası üçün hər şey artıq paketlərdədir.debian.org faylını yükləyin və heç nəyi yenidən kompilyasiya etməyə 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çı özü OpenWrt üçün routeri populyarlaşdırmağa çalışır, lakin Almaniyadan olan geliştirici Frankın fəaliyyəti sayəsində bütün xüsusiyyətlər tez bir zamanda nüvəyə daxil olur Debian-a. Təəccüblüdür ki, Frank bütün forum mövzularında 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, Quş

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-in altında işlədiyi güman edilir Ubuntu 18.04 aprel. Mən Avropadakı iki hostinq provayderində: Amazon və Digital Ocean-da funksionallığı sınaqdan keçirdim.

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 sirlər (xüsusən də açarlar) yaratmalısınız Wireguard) qovluğa ./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, mən kernel 5.4 => 5.6-nı yeniləmək istəyirdim, yaxşı, orada Wireguard Qutudan çıxarılmış, yamaq etməyə ehtiyac yoxdur... Deyilənə görə, dərhal edildi: Yamaqları 5.4-dən 5.6-ya diqqətlə köçürdüm, nüvəni işə saldım, tuneli VPS pinglərinə göndərdim, amma Bird "BGP Error" xətası ilə əlaqə qura bilmir... "Dəhşət içində 5.4-ə geri qayıtdım" (c); 5.6-ya keçid TODO-ya qoyuldu.

Buna görə də, router və VPS quraşdırmaqla yanaşı, monitorinq də əlavə etdim (x86-da Ubuntu 18.04), aşağıdakı komponentlərlə ayrı bir hostda quraşdırılmışdır:

  • 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

DDoS mühafizəsi, VPS VDS serverləri olan saytlar üçün etibarlı hostinq alın 🔥 DDoS qorunması, VPS VDS serverləri ilə etibarlı veb sayt hostinqi alın | ProHoster