Pisang Pi R64 Router - Debian, Wireguard, RKN

Banana Pi 64 adalah komputer papan tunggal yang mirip dengan Raspberry Pi, tetapi dengan beberapa port Ethernet, menjadikannya router distribusi Linux untuk keperluan umum.

Pisang Pi R64 Router - Debian, Wireguard, RKN

Ya, Openwrt sudah ada, tetapi memiliki GUI dan CLI sendiri; ada Mikrotik, tetapi sekali lagi ia memiliki GUI / CLI sendiri, dan Wireguard tidak berfungsi di luar kotak ... Secara umum, saya ingin router dengan pengaturan yang fleksibel, namun tetap dalam kerangka Linux standar yang Anda gunakan setiap hari.

Dalam artikel dengan nama BPI, R64, papan tunggal, maksud saya sama - papan tunggal Banana Pi R64 itu sendiri.

Pemilihan gambar. Unduh melalui eMMC

Keterampilan pertama yang diperoleh saat bekerja dengan SBC secara umum, dan dengan R64 khususnya, itu berarti mempelajari cara memuat OS ke dalamnya dan dapat berinteraksi dengannya, karena R64 tidak memiliki port monitor (HDMI, misalnya). Ketika semuanya jatuh - Wifi berhenti berfungsi, jaringan Ethernet, Bluetooth, USB, dll. ada UART, melalui antarmuka yang Anda selalu dapat melihat apa yang salah, dan juga menjalankan beberapa perintah dari konsol, jika perlu.

Algoritme koneksi ke R64 melalui USB-UART:

  • lari ke toko komponen radio untuk kabel USB-UART (PL2303, Serial-to-USB)
  • kami menghubungkan satu ujung USB ke komputer, dan ujung lainnya, UART, ke R64, dengan tiga dari empat kabel, seperti pada gambar di bawah
  • di konsol komputer dijalankan sudo minicom

Setelah itu, dalam banyak kasus, konsol papan tunggal akan muncul = sukses.
Anda dapat melihat lebih banyak di sini.

Pisang Pi R64 Router - Debian, Wireguard, RKN

Selanjutnya, cara termudah adalah memuat sistem operasi dari kartu SD: unduh dengan link gambar dan unggah:

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

kami memasukkan kartu ke slot R64 SD, menyalakannya, amati pemuatan uboot terlebih dahulu di konsol yang terhubung, kemudian boot Linux standar.

Opsi boot alternatif menggunakan kartu 64Gb yang sudah tertanam di R8, disebut eMMC. Menurut petunjuk di wiki, kami menulis ulang gambar ke perangkat
/dev/mmcblk0 ke BPI, reboot, lepas kartu SD, aktifkan BPI lagi... dan tidak berhasil. Bagaimana menuju ke sana Boot select jangan bertahan.

Faktanya adalah setidaknya untuk BPI Anda perlu menyetel bendera khusus agar dapat melakukan booting dari flash drive internal:

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]

Selanjutnya, Anda perlu menulis preloader ke partisi boot khusus

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

Pabrikan R64 (Cina) memposting biner ini di sini. Apa yang dia lakukan tidak diketahui (tidak ada kode sumber), tetapi tanpa dia itu juga tidak akan berhasil.

Secara umum, setelah itu gambar mulai dimuat dari eMMC. Jika Anda ingin mengetahuinya dan membuat gambar dari awal, maka untuk kedua kasus (SD / eMMC) Anda perlu menulis beberapa file lagi (preloader untuk kartu SD, ATF, u-boot), hanya untuk masuk ke kernel boot. Topik ini masih sedang berkembang, tetapi bagi kami yang utama adalah berfungsi dan baik-baik saja.

Sekarang, sejujurnya, saya tidak menggunakan unduhan eMMC, kartu SD sudah cukup, tetapi saya menghabiskan cukup banyak waktu untuk membuatnya berfungsi, jadi biarlah di artikel.

Pilihan sistem operasi. Armbia

Tugas aplikasi pertama adalah meluncurkan VPN, tentu saja Wireguard. Ternyata itu tidak dirakit dari sisi kernel, dan tidak ada header. Saya membangun kembali kernel dan, karena kebiasaan dengan x86, membangun modul kernel menggunakan DKMS. Namun, kecepatan perakitan pada arm64 bahkan utilitas kecil mengejutkan saya. Dan kemudian diperlukan modul kernel lain, dan seterusnya. Secara umum ternyata segala sesuatu yang berhubungan dengan kernel lebih baik dirakit di laptop warm-tube x86, kemudian dipindahkan ke R64 dengan cara disalin sederhana, di-boot ulang dan diuji.

Hal lain adalah bagian userspace. Dalam kasus saya memilih Debian, semua untuk arsitektur arm64 sudah ada di packages.debian.org dan tidak perlu membangun kembali apapun.

Agar tidak memproduksi sepeda lagi, I porting armbian pada BPI R64.
Atau lebih tepatnya: bagian ruang pengguna adalah Armbian, dan intinya diambil dari repositori Jujur-A. Gambar terbaru dapat diunduh di sini.

Semua aktivitas pengembangan bagian perangkat lunak R64 dilakukan forum. Secara umum, pabrikan sendiri berupaya mempopulerkan router Openwrt, tetapi berkat aktivitas pengembang Frank dari Jerman, semua fitur dengan cepat berakhir di kernel Debian. Anehnya, Frank aktif di setiap utas forum.

Organisasi ruang kerja: kabel

Secara terpisah, saya ingin memberi tahu Anda cara menempatkan SBC (bukan hanya BPI) di atas meja selama pengembangan / pengujian agar tidak mengarahkan kabel Ethernet ke sana dari sumber Internet melalui seluruh ruangan / kantor. Faktanya adalah, di satu sisi, Anda perlu menyediakan Internet ke sepotong besi, dan di sisi lain, semuanya dapat merusak besi ini, dan terutama Wifi.

Awalnya saya memutuskan untuk membeli "peluit" USB-Wifi murah, sambungkan ke satu-satunya port di BPI dan lupakan kabelnya. Untuk melakukan ini, saya membeli TP-LINK TL-WN725N USB 2.0 yang murah, tetapi segera menjadi jelas bahwa itu tidak akan lepas landas: agar peluit berfungsi, diperlukan driver kernel, yang, tentu saja, tidak ada (kemudian saya mengkompilasi driver RTL8XXXU yang diperlukan, tetapi masih tidak praktis). Dan kabel ethernet merusak pemandangan ruangan untuk sementara.

Hasilnya, saya berhasil melepaskan kabel dengan bantuan Tenda MW3 (Wifi mesh system): Saya cukup meletakkan satu kubus di bawah meja dan menghubungkan BPI ke port LAN yang terakhir dengan kabel Ethernet meteran. Kesuksesan.

Wireguard, RKN, Burung

Salah satu tujuan saya menggunakan Banana PI adalah memiliki akses gratis ke situs yang diblokir oleh RKN, khususnya, agar Telegram dan panggilan ke Slack berfungsi. Artikel tentang topik ini telah diusulkan di HabrΓ©: waktu, Π΄Π²Π°, tiga.

Saya menerapkan penerapan solusi seperti itu menggunakan Ansible: link.

VPS seharusnya menjalankan Ubuntu 18.04. Saya memeriksa kinerja pada dua penghosting di Eropa: Amazon dan Digital Ocean.

Jadi, kami memasang Armbian di atas pada R64, tersedia melalui ssh dengan nama hm-bananapi-1 dan memiliki akses internet. Kami menerapkan skrip otomatisasi yang memungkinkan secara berurutan dan menjalankan penginstalan itu sendiri di 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

Selanjutnya, Anda perlu menerapkan VPN kami ke VPS dengan cara yang sama:

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

Di sini, argumennya selalu current-vpn, dan nama VPS itu sendiri dikonfigurasikan dalam sebuah variabel (dalam hal ini, 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

Oh ya, sebelum semua operasi ini, Anda perlu membuat rahasia (khususnya kunci Wireguard) di folder ./secrets, direktori akan terlihat seperti jadi.

Otomatisasi yang memungkinkan dengan Python

Anda mungkin memperhatikan bahwa alih-alih format YAML, perintah Ansible dikodekan dalam skrip Python. Sebagai perbandingan, cara mengaktifkan daemon burung dengan cara biasa:

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

dan caranya sama via Python:

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

Menulis perintah yang mungkin dengan kode Python memungkinkan Anda untuk menggunakan kembali kode tersebut, dan secara umum, semua kemungkinan bahasa tujuan umum terbuka. Misalnya menginstal burung di R64 dan VPS:

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

lihat kode fungsi instal_burung().

Fitur ini disebut pybook diimplementasikan di sini. Belum ada dokumentasi tentang pybook, maka saya akan memperbaiki cacat ini.

Apa yang dia pikirkan ke hulu tentang ini.

Pemantauan. Prometheus

Total: telegram berfungsi, linkedin dan pornhub juga, secara umum, pengalaman pengguna baik-baik saja. Tapi semuanya bisa pecah, dan potongan besi Cina juga.

Pembaruan kernel juga bisa menarik: misalnya, saya ingin memperbarui kernel 5.4 => 5.6, ada Wireguard di luar kotak, tidak perlu menambal ... Tidak lama kemudian dikatakan: dengan susah payah mentransfer tambalan dari 5.4 ke 5.6, kernel dimulai, terowongan ke VPS melakukan ping, tetapi burung tidak dapat terhubung dengan kesalahan "Kesalahan BGP"… "Diputar kembali dengan ngeri" (c) ke 5.4; pindah ke 5.6 ditunda di TODO.

Oleh karena itu, selain menginstal router dan VPS, saya menambahkan pemantauan (pada x86 Ubuntu 18.04), yang diinstal pada host terpisah dengan komponen berikut:

  • prometheus, alertmanager, blackbox_exporter - semuanya ada di buruh pelabuhan
  • peringatan dikirim ke saluran telegram menggunakan bot metalmatze/alertmanager-bot - juga di buruh pelabuhan
  • tor untuk bot, agar bot dapat memperingatkan situasi ketika Internet tersedia, tetapi telegram tetap tidak berfungsi, dan bot itu sendiri tidak dapat terhubung
  • terapan lansiran: NodeVPNTroubles (tidak ada ping ke VPS), BirdVPNTroubles (tidak ada sesi Bird), AntifilterDownloadTroubles (gagal memuat alamat IP yang diblokir), SiteTroubles (sayangnya telegram tidak tersedia)
  • peringatan sistem seperti HostGrowingDiskReadLatency (kartu SD murah berhenti dibaca)

Contoh pengaturan pemantauan:

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

Penemuan Otomatis untuk prometheus diatur ke folder /etc/prometheus/auto_http, contoh menambahkan host ke pemantauan (host tidak dipantau secara default):

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 penyedia, 2 BPI, failover siaran mana saja

Selain semuanya, saya berencana untuk menyambungkan ke dua penyedia agar Internet terus berfungsi, bahkan jika satu penyedia mengalami masalah dengan jaringan, atau mereka lupa membayar untuk Internet, dll., dan faktor manusia lainnya.

Pengalaman pengguna paling canggih tentang topik multi-wan dijelaskan di sini untuk sistem Mwan3 di bawah Openwrt. Solusi ini memiliki fungsionalitas yang kaya, tetapi pengaturan dan pengoperasian secara umum untuk multi-wan agak merepotkan. Hanya satu contoh: jika Anda datang ke beberapa situs dari dua alamat IP sekaligus, mereka mungkin tidak menyukainya, mereka akan berhenti bekerja => "Internet tidak berfungsi."

Mengingat pengalaman ini, saya memutuskan bahwa multihoming belum menjadi prioritas, hanya failover. Meskipun tampaknya di versi terbaru linux semuanya harus bekerja dengan satu perintah seperti:

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

Jadi, untuk menghindari satu titik kegagalan, kami mengambil 2 BPI, masing-masing terhubung ke satu penyedia, menghubungkannya bersama dan membuat komunikasi satu sama lain secara dinamis dialihkan melalui burung / OSPF.

Selanjutnya, pada masing-masing kami mengumumkan alamat IP yang sama jika layanan tersedia (Internet, DNS). Artinya, kami sendiri tidak akan meletakkan rute default, tetapi melalui burung. Solusinya memata-matai di sini .

Fungsionalitas ini belum diimplementasikan, virus korona yang berbahaya kacau (tidak semuanya berasal dari aliexpress; toko online lain, Layta, berjanji untuk mengirim dalam seminggu, dan lebih dari sebulan telah berlalu; penyedia kedua tidak berhasil memperpanjang kabel sebelum karantina, hanya berhasil membuat lubang di dinding untuk mengebor kabel).

Cara memesan R64

Papan itu sendiri di toko resmi SinoVoip.
Lebih baik juga memesan segera:

Ada nuansa - harga pengiriman dari beberapa waktu menjadi tidak cukup tinggi di toko resmi. Manajer Judy Huang meyakinkan saya bahwa tidak ada kesalahan, dan Anda dapat memilih ePacket seharga $5, tetapi saya melihat bahwa untuk Rusia hanya ada EMS seharga >33$. Tidak menyenangkan, tetapi tidak kritis. Selain itu, jika Anda memilih negara lain untuk pengiriman (saya melewati semua benua), pengiriman akan dikenakan biaya ~5$. Russophobes?.. Tapi kemudian saya menemukan bahwa untuk Prancis harga pengiriman juga ~$30, dan tenang.

Akibatnya, Judy menawarkan untuk memesan, tetapi tidak membayar (mengisyaratkan: kurangi kartu agar pembayaran tidak dilakukan secara otomatis); menulis kepadanya dan dia akan mengurangi harga pengiriman normal. Kesuksesan.

Isu

Belum semuanya bekerja dengan sempurna.

Performa

Perintah Ansible=Python dijalankan dengan lambat, bahkan saat idle, selama 20-30 detik; urutan besarnya lebih lama dari pada laptop x86. Selain itu, pada awalnya dilakukan dengan cukup cepat, ~ 3 detik, kemudian melambat dengan tajam. Mungkin ini karena CPU memanas (throttling). Kode Go juga berjalan lama:

# запрос ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊ для промСтСя ΠΈΠ· 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 berfungsi, tetapi berhenti di Armbian setelah sekitar satu hari, menulis:

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

Hanya restart membantu. Kita perlu melangkah lebih jauh mengelompokkan.

Ethernet

Ethernet berfungsi, tetapi setelah ~ sehari paket (DHCP) dari R64 berhenti datang.
Memulai ulang antarmuka membantu:

ifdown br0; sleep 30; ifup br0

Sopirnya baru, kernelnya belum diterima, saya harap Chinese Landen Chao menyelesaikan.

Sumber: www.habr.com

Tambah komentar