Penghala Banana Pi R64 - Debian, Wireguard, RKN

Banana Pi 64 ialah komputer papan tunggal yang serupa dengan Raspberry Pi, tetapi dengan berbilang port Ethernet, menjadikannya penghala pengedaran Linux tujuan umum.

Penghala Banana Pi R64 - Debian, Wireguard, RKN

Ya, Openwrt sudah wujud, tetapi ia mempunyai GUI dan CLI sendiri; terdapat Mikrotik, tetapi sekali lagi ia mempunyai GUI / CLI sendiri, dan Wireguard tidak berfungsi di luar kotak ... Secara umum, saya mahukan penghala dengan tetapan yang fleksibel, sambil kekal dalam rangka kerja Linux standard, yang anda gunakan setiap hari.

Dalam artikel di bawah nama BPI, R64, papan tunggal, saya akan maksudkan perkara yang sama - papan tunggal Banana Pi R64 itu sendiri.

Pemilihan imej. Muat turun melalui eMMC

Kemahiran pertama yang diperoleh apabila bekerja dengannya SBC secara amnya, dan dengan R64 khususnya, ini bermakna belajar cara memuatkan OS ke dalamnya dan dapat berinteraksi dengannya, kerana R64 tidak mempunyai port monitor (HDMI, contohnya). Apabila semuanya jatuh - Wifi berhenti berfungsi, rangkaian Ethernet, Bluetooth, USB, dll. terdapat UART, melalui antara muka yang anda sentiasa boleh melihat apa yang salah, dan juga menjalankan beberapa arahan dari konsol, jika perlu.

Algoritma sambungan ke R64 melalui USB-UART:

  • jalankan ke kedai alat ganti radio untuk mendapatkan kabel USB-UART (PL2303, Serial-to-USB)
  • kami menyambungkan satu hujung USB ke komputer, dan satu lagi, UART, ke R64, dengan tiga daripada empat wayar, seperti dalam gambar di bawah
  • dalam konsol komputer dijalankan sudo minicom

Selepas itu, dalam kebanyakan kes, konsol papan tunggal akan muncul = kejayaan.
Anda boleh melihat lebih banyak lagi di sini.

Penghala Banana Pi R64 - Debian, Wireguard, RKN

Seterusnya, cara paling mudah ialah memuatkan sistem pengendalian daripada kad SD: muat turun oleh pautan gambar dan muat naik:

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 kad ke dalam slot SD R64, hidupkannya, perhatikan pemuatan uboot terlebih dahulu pada konsol yang disambungkan, kemudian but Linux standard.

Pilihan but alternatif menggunakan kad 64Gb yang telah dibenamkan dalam R8, dipanggil eMMC. Menurut arahan di wiki, kami menulis semula imej ke peranti
/dev/mmcblk0 ke BPI, but semula, keluarkan kad SD, dayakan BPI semula... dan ia tidak berfungsi. Bagaimana untuk sampai ke sana Boot select jangan tahan.

Hakikatnya ialah sekurang-kurangnya untuk BPI anda perlu menetapkan bendera khas untuk dapat boot dari pemacu kilat dalaman:

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]

Seterusnya, anda perlu menulis pramuat ke partition but khas

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

Pengilang R64 (China) menyiarkan binari ini di sini. Apa yang dia lakukan tidak diketahui (tiada kod sumber), tetapi tanpa dia ia juga tidak akan berfungsi.

Secara umum, selepas itu, imej mula dimuatkan daripada eMMC. Jika anda ingin memikirkannya dan mencipta imej dari awal, maka untuk kedua-dua kes (SD / eMMC) anda perlu menulis beberapa fail lagi (pramuat untuk kad SD, ATF, u-boot), hanya untuk sampai ke kernel but. Topik ini masih lagi sedang berkembang, tetapi bagi kami perkara utama ialah ia berfungsi dan okay.

Sekarang, sejujurnya, saya tidak menggunakan muat turun eMMC, kad SD sudah mencukupi, tetapi saya menghabiskan banyak masa untuk membuatnya berfungsi, jadi biarkan ia berada dalam artikel.

Pilihan sistem pengendalian. Armbian

Tugas aplikasi pertama ialah melancarkan VPN, sudah tentu Wireguard. Ia serta-merta ternyata bahawa ia tidak dipasang dari sisi kernel, dan tidak ada tajuk. Saya membina semula kernel dan, daripada kebiasaan dengan x86, membina modul kernel menggunakan DKMS. Walau bagaimanapun, kelajuan pemasangan pada arm64 walaupun utiliti kecil tidak menyenangkan saya. Dan kemudian modul kernel lain diperlukan, dan seterusnya. Secara umum, ternyata semua yang berkaitan dengan kernel adalah lebih baik untuk dipasang pada komputer riba x86 tiub hangat, kemudian dipindahkan ke R64 dengan menyalin mudah, but semula dan diuji.

Perkara lain ialah bahagian ruang pengguna. Dalam kes saya memilih Debian, segala-galanya untuk seni bina arm64 sudah ada pada packages.debian.org dan tidak perlu membina semula apa-apa.

Untuk tidak menghasilkan basikal lain, saya ported armbia pada BPI R64.
Atau sebaliknya: bahagian ruang pengguna ialah Armbian, dan teras diambil dari repositori Frank-A. Imej terkini boleh dimuat turun di sini.

Semua aktiviti pembangunan bahagian perisian R64 dijalankan pada forum. Secara umumnya, pengilang itu sendiri berusaha untuk mempopularkan penghala Openwrt, tetapi terima kasih kepada aktiviti pembangun Frank dari Jerman, semua ciri dengan cepat berakhir dalam kernel Debian. Yang menghairankan, Frank aktif dalam setiap thread forum.

Organisasi ruang kerja: wayar

Secara berasingan, saya ingin memberitahu anda cara meletakkan SBC (bukan hanya BPI) di atas meja semasa pembangunan / ujian supaya tidak membawa kabel Ethernet kepadanya dari sumber Internet melalui seluruh bilik / pejabat. Hakikatnya, di satu pihak, anda perlu menyediakan Internet kepada kepingan besi, dan sebaliknya, segala-galanya boleh pecah dalam kepingan besi ini, dan terutamanya Wifi.

Mula-mula saya memutuskan untuk membeli "wisel" USB-Wifi yang murah, pasangkannya ke dalam satu-satunya port pada BPI dan lupakan wayarnya. Untuk melakukan ini, saya membeli TP-LINK TL-WN725N USB 2.0 yang murah, tetapi tidak lama kemudian ia menjadi jelas bahawa ia tidak akan berlepas: untuk wisel berfungsi, pemacu kernel diperlukan, yang, tentu saja, tidak ada di sana. (kemudian saya menyusun pemacu RTL8XXXU yang diperlukan, tetapi ia masih tidak praktikal). Dan kabel ethernet merosakkan pemandangan bilik untuk seketika.

Akibatnya, saya berjaya menyingkirkan kabel dengan bantuan Tenda MW3 (sistem jaringan Wifi): Saya hanya meletakkan satu kiub di bawah meja dan menyambungkan BPI ke port LAN yang terakhir dengan kabel Ethernet meter. Kejayaan.

Pengawal wayar, RKN, Burung

Salah satu perkara yang saya gunakan Banana PI adalah untuk mempunyai akses percuma ke tapak yang disekat oleh RKN, khususnya, supaya Telegram dan panggilan ke Slack berfungsi. Artikel mengenai topik ini telah pun dicadangkan mengenai HabrΓ©: masa, Π΄Π²Π°, 3.

Saya melaksanakan penggunaan penyelesaian sedemikian menggunakan Ansible: pautan.

VPS sepatutnya menjalankan Ubuntu 18.04. Saya menyemak prestasi pada dua hoster di Eropah: Amazon dan Digital Ocean.

Jadi, kami memasang Armbian di atas pada R64, ia boleh didapati melalui ssh di bawah nama hm-bananapi-1 dan mempunyai akses internet. Kami menggunakan skrip automasi secara berurutan dan menjalankan pemasangan itu sendiri pada 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

Seterusnya, anda perlu menggunakan VPN kami ke VPS dengan cara yang sama:

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

Di sini, hujahnya sentiasa semasa-vpn, dan nama VPS itu sendiri dikonfigurasikan dalam pembolehubah (dalam kes ini, ia adalah 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 menjana rahsia (khususnya, kunci Wireguard) dalam folder ./secrets, direktori sepatutnya kelihatan seperti jadi.

Automasi yang boleh dipercayai dalam Python

Anda mungkin mendapati bahawa bukannya format YAML, arahan Ansible dikodkan dalam skrip Python. Sebagai perbandingan, cara mendayakan daemon burung dengan cara biasa:

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

dan bagaimana perkara yang sama melalui Python:

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

Menulis arahan Ansible dengan kod Python membolehkan anda menggunakan semula kod tersebut, dan secara amnya, semua kemungkinan bahasa tujuan umum terbuka. Contohnya, memasang burung pada R64 dan VPS:

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

lihat kod fungsi install_bird().

Ciri ini dipanggil pybook dilaksanakan di sini. Belum ada dokumentasi pada pybook, maka saya akan membetulkan kecacatan ini.

Apa yang dia fikir huluan pada kesempatan ini.

Pemantauan. Prometheus

Jumlah: telegram berfungsi, linkedin dan pornhub juga, secara umum, pengalaman pengguna adalah ok. Tetapi semuanya boleh pecah, dan kepingan besi Cina juga.

Kemas kini kernel juga boleh menjadi menarik: sebagai contoh, saya ingin mengemas kini kernel 5.4 => 5.6, dengan baik, terdapat Wireguard di luar kotak, tidak perlu menampal ... Tidak lama kemudian daripada selesai: bersusah payah memindahkan patch dari 5.4 ke 5.6, kernel dimulakan, terowong ke VPS diping, tetapi burung tidak dapat menyambung dengan ralat "Ralat BGP"… "Digulung semula dalam ngeri" (c) ke 5.4; bergerak ke 5.6 telah ditangguhkan dalam TODO.

Oleh itu, sebagai tambahan kepada memasang penghala dan VPS, saya menambah pemantauan (pada x86 Ubuntu 18.04), yang dipasang pada hos berasingan dengan komponen berikut:

  • prometheus, alertmanager, blackbox_exporter - semua dalam docker
  • makluman dihantar ke saluran telegram menggunakan bot metalmatze/alertmanager-bot - juga dalam docker
  • tor untuk bot, supaya bot boleh memaklumkan situasi apabila Internet tersedia, tetapi telegram masih tidak berfungsi, dan bot itu sendiri tidak dapat menyambung
  • digunakan makluman: NodeVPNTroubles (tiada ping ke VPS), BirdVPNTroubles (tiada sesi Burung), AntifilterDownloadTroubles (gagal memuatkan alamat IP yang disekat), SiteTroubles (telegram malang tidak tersedia)
  • makluman sistem seperti HostGrowingDiskReadLatency (kad SD murah berhenti dibaca)

Contoh persediaan pemantauan:

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

Auto Discovery untuk prometheus ditetapkan kepada folder /etc/prometheus/auto_http, contoh menambah hos pada pemantauan (hos tidak dipantau secara lalai):

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 pembekal, 2 BPI, anycast failover

Sebagai tambahan kepada segala-galanya, saya merancang untuk menyambung kepada dua pembekal supaya Internet akan terus berfungsi, walaupun jika satu pembekal mempunyai masalah dengan rangkaian, atau mereka terlupa untuk membayar Internet, dsb., dan faktor manusia yang lain.

Pengalaman pengguna paling maju mengenai topik multi-wan diterangkan di sini untuk sistem Mwan3 di bawah Openwrt. Penyelesaian ini mempunyai fungsi yang kaya, tetapi menyediakan dan beroperasi secara umum untuk multi-wan agak menyusahkan. Hanya satu contoh: jika anda datang ke beberapa tapak dari dua alamat IP sekaligus, maka mereka mungkin tidak menyukainya, mereka akan berhenti berfungsi => "Internet tidak berfungsi."

Berdasarkan pengalaman ini, saya memutuskan bahawa multihoming belum lagi menjadi keutamaan, hanya failover. Walaupun nampaknya dalam versi terkini linux semuanya harus berfungsi dengan satu arahan seperti:

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

Jadi, untuk mengelakkan satu titik kegagalan, kami mengambil 2 BPI, masing-masing menyambung kepada satu pembekal, menyambungkannya bersama-sama dan membuat komunikasi antara satu sama lain secara dinamik melalui burung / OSPF.

Selanjutnya, pada setiap kami mengumumkan alamat IP yang sama jika perkhidmatan itu tersedia (Internet, DNS). Iaitu, kami tidak akan meletakkan laluan lalai sendiri, tetapi melalui burung. Penyelesaiannya mengintip di sini .

Fungsi ini belum lagi dilaksanakan, coronavirus yang berbahaya telah kacau (tidak semuanya datang dari aliexpress; kedai dalam talian lain, Layta, berjanji untuk menghantar dalam seminggu, dan lebih daripada sebulan telah berlalu; pembekal kedua tidak berjaya meregangkan kabel sebelum kuarantin, hanya berjaya membuat lubang di dinding untuk menggerudi kabel).

Bagaimana untuk memesan R64

Papan itu sendiri di kedai rasmi SinoVoip.
Ia juga lebih baik untuk memesan dengan segera:

  • makanan + maklumkan standard palam EU atau AS
  • sink haba: radiator/kipas; kerana kedua-dua CPU dipanaskan, dan cip suis
  • antena wifi, sebagai contoh

Terdapat nuansa - harga penghantaran dari beberapa waktu telah menjadi tidak mencukupi di kedai rasmi. Pengurus Judy Huang memberi jaminan kepada saya bahawa tiada kesilapan, dan anda boleh memilih ePacket dengan harga $5, tetapi saya melihat bahawa untuk Rusia hanya ada EMS untuk >33$. Tidak menyenangkan, tetapi tidak kritikal. Lebih-lebih lagi, jika anda memilih mana-mana negara lain untuk penghantaran (saya pergi melalui semua benua), penghantaran akan dikenakan bayaran ~5$. Russophobes?.. Tetapi kemudian saya mendapati bahawa untuk Perancis harga penghantaran juga ~$30, dan tenang.

Akibatnya, Judy menawarkan untuk membuat pesanan, tetapi tidak membayar (petunjuk: kurangkan pada kad supaya pembayaran tidak melalui secara automatik); menulis kepadanya dan dia akan mengurangkan harga penghantaran kepada normal. Kejayaan.

Isu

Belum semuanya berfungsi dengan sempurna.

Produktiviti

Ansible=Arahan Python dilaksanakan dengan perlahan, walaupun terbiar, selama 20-30 saat; susunan magnitud lebih lama daripada pada komputer riba x86. Lebih-lebih lagi, pada mulanya mereka dilakukan dengan cepat, ~ 3 saat, kemudian mereka perlahan dengan mendadak. Mungkin ini disebabkan oleh pemanasan CPU (throttling). Kod 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 selepas kira-kira sehari, 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 mulakan semula bantuan. Kita perlu pergi lebih jauh menyelesaikan.

Ethernet

Ethernet berfungsi, tetapi selepas ~ paket sehari (DHCP) dari R64 berhenti datang.
Memulakan semula antara muka membantu:

ifdown br0; sleep 30; ifup br0

Pemandunya baru, kernel belum diterima, saya harap Cina Landen Chao selesai.

Sumber: www.habr.com

Tambah komen