Banana Pi R64 router – Debian, Wireguard, RKN

Ang Banana Pi 64 ay isang single-board na computer na katulad ng Raspberry Pi, ngunit may ilang mga Ethernet port, na ginagawang posible na gawing router ito batay sa isang pangkalahatang layunin na pamamahagi ng Linux.

Banana Pi R64 router – Debian, Wireguard, RKN

Oo, mayroon nang Openwrt, ngunit mayroon itong sariling mga problema, ang GUI at CLI nito; Mayroong Mikrotik, ngunit muli ay mayroon itong sariling GUI/CLI, at ang Wireguard ay hindi gumagana sa labas ng kahon... Sa pangkalahatan, gusto ko ng isang router na may mga flexible na setting, habang nananatili sa loob ng balangkas ng karaniwang Linux, na iyong pinagtatrabahuhan. kasama sa bawat araw.

Sa artikulo sa ilalim ng mga pangalan na BPI, R64, single-board, ang ibig kong sabihin ay ang parehong bagay - ang Banana Pi R64 single-board mismo.

Pagpili ng isang imahe. I-download sa pamamagitan ng eMMC

Ang pinakaunang kasanayan na kailangan mong makuha kapag nagtatrabaho SBC sa pangkalahatan, at sa partikular na R64, nangangahulugan ito ng pag-aaral kung paano i-load ang isang operating system dito at magagawang makipag-ugnayan dito, dahil ang R64 ay walang port para sa isang monitor (halimbawa, HDMI). Nang bumagsak ang lahat - Huminto sa paggana ang Wifi, Ethernet, Bluetooth, USB, atbp. Mayroong UART, sa pamamagitan ng interface kung saan palagi mong makikita kung ano ang mali, at magpatakbo din ng ilang utos mula sa console, kung kinakailangan.

Algorithm para sa pagkonekta sa R64 sa pamamagitan ng USB-UART:

  • tumakbo kami sa tindahan ng mga piyesa ng radyo para sa isang USB-UART cable (PL2303, Serial-to-USB)
  • ikonekta ang isang USB end sa computer, at ang isa, UART, sa R64, na may tatlong wire sa apat, tulad ng nasa larawan sa ibaba
  • tumakbo sa computer console sudo minicom

Pagkatapos nito, sa karamihan ng mga kaso ay lilitaw ang single-board console = tagumpay.
Maaari mong makita ang higit pang mga detalye dito.

Banana Pi R64 router – Debian, Wireguard, RKN

Susunod, ang pinakamadaling paraan ay i-load ang operating system mula sa isang SD card: i-download sa pamamagitan ng link larawan at punan ito:

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

Ipinasok namin ang card sa R64 SD slot, i-on ito, at obserbahan muna ang nakakonektang console na naglo-load ng uboot, pagkatapos ay karaniwang naglo-load ng Linux.

Ang isang alternatibong opsyon sa pag-boot ay ang paggamit ng 64Gb card na naka-built na sa R8, na tinatawag na eMMC. Ayon sa mga tagubilin sa wiki, kinokopya namin ang imahe sa device
/dev/mmcblk0 sa BPI, i-reboot, alisin ang SD card, i-on muli ang BPI... at hindi ito gumana. Paano bumalik at pabalik Boot select huwag kang mag-abala.

Ang katotohanan ay hindi bababa sa para sa BPI kailangan mong magtakda ng isang espesyal na bandila upang makapag-boot mula sa isang panloob na flash drive:

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]

Susunod, kailangan mong isulat ang preloader sa isang espesyal na partisyon ng boot

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

Ang Manufacturer R64 (China) ay nag-post ng binary na ito dito. Ang ginagawa nito ay hindi alam (walang source code), ngunit hindi rin ito gagana kung wala ito.

Sa pangkalahatan, pagkatapos nito, magsisimulang mag-load ang mga larawan mula sa eMMC. Kung nais mong malaman ito at lumikha ng mga imahe mula sa simula, pagkatapos ay para sa parehong mga kaso (SD/eMMC) kailangan mong magsulat ng ilang higit pang mga file (preloader para sa SD card, ATF, u-boot) para lamang ma-load ang kernel. Ang paksang ito ay pa rin ay umuunlad, ngunit para sa amin ang pangunahing bagay ay gumagana ito at okay.

Ngayon ay nagda-download ako sa pamamagitan ng eMMC, sa totoo lang, hindi ko ito ginagamit, sapat na ang SD card, ngunit gumugol ako ng maraming oras upang gumana ito, kaya hayaan ito sa artikulo.

Pagpili ng isang operating system. Armbian

Ang unang gawain sa application ay ang maglunsad ng VPN, natural na Wireguard. Kaagad na natuklasan na sa gilid ng kernel ay hindi ito na-assemble at walang mga header. Binuo ko muli ang kernel at, tulad ng aking ugali sa x86, binuo ang kernel module gamit ang DKMS. Gayunpaman, ang bilis ng pagbuo ng kahit na maliliit na kagamitan sa arm64 ay hindi kanais-nais na nagulat sa akin. At pagkatapos ay kailangan ang isa pang kernel module, atbp. Sa pangkalahatan, lumalabas na ang lahat ng bagay na nauugnay sa kernel ay pinakamahusay na binuo sa isang mainit na x86 laptop, pagkatapos ay inilipat sa R64 sa pamamagitan ng simpleng pagkopya, pag-reboot at pagsubok.

Ang isa pang bagay ay ang bahagi ng userspace. Sa aking kaso ng pagpili ng Debian, lahat ng bagay para sa arkitekturang arm64 ay nasa packages.debian.org na at hindi na kailangang muling buuin ang anuman.

Upang hindi makagawa ng isa pang bisikleta, I ported armbian sa BPI R64.
O sa halip, ito: ang bahagi ng userspace ay Armbian, at ang kernel ay kinuha mula sa repositoryo Lantad-A. Maaaring ma-download ang pinakabagong larawan dito.

Ang lahat ng aktibidad sa pagbuo ng bahagi ng software ng R64 ay isinasagawa sa pagtitipon. Sa pangkalahatan, ang tagagawa mismo ay nagsisikap na gawing popular ang router para sa Openwrt, ngunit salamat sa aktibidad ng developer na si Frank mula sa Germany, ang lahat ng mga tampok ay mabilis na napupunta sa kernel para sa Debian. Nakakagulat, aktibo si Frank sa bawat thread ng forum.

Organisasyon ng workspace: mga wire

Hiwalay, nais kong sabihin sa iyo kung paano, sa panahon ng pag-unlad/pagsusubok, maglagay ng SBC (hindi lamang isang BPI) sa isang mesa upang hindi magpatakbo ng isang Ethernet cable dito mula sa isang mapagkukunan ng Internet sa buong silid/opisina. Ang katotohanan ay, sa isang banda, kailangan mong ibigay ang piraso ng hardware na may Internet, ngunit sa kabilang banda, lahat ng bagay sa piraso ng hardware na iyon ay maaaring masira, at una sa lahat Wifi.

Una, nagpasya akong bumili ng murang USB-Wifi na "whistle", isaksak ito sa nag-iisang port sa BPI at kalimutan ang tungkol sa mga wire. Upang gawin ito, bumili ako ng isang murang TP-LINK TL-WN725N USB 2.0, ngunit sa lalong madaling panahon naging malinaw na hindi ito aalis: para gumana ang sipol, kailangan mo ng kernel driver, na, siyempre, ay wala doon ( kalaunan ay binuo ko ang kinakailangang driver ng RTL8XXXU, ngunit hindi pa rin ito praktikal ). At ang Ethernet cable ay nasira ang hitsura ng silid nang ilang sandali.

Bilang resulta, nagawa kong tanggalin ang cable sa tulong ng Tenda MW3 (Wifi mesh system): Naglagay lang ako ng isang cube sa ilalim ng mesa at ikinonekta ang BPI sa LAN port ng huli gamit ang isang metrong Ethernet cable. Tagumpay.

Wireguard, RKN, Ibon

Isa sa mga bagay na gusto kong gamitin ang Banana PI ay ang magkaroon ng libreng access sa mga site na hinarangan ng RKN, sa partikular, para gumana ang mga tawag sa Telegram at Slack. Ang mga artikulo sa HabrΓ© ay iminungkahi na sa paksang ito: oras, Π΄Π²Π°, tatlo.

Eksaktong ipinatupad ko ang solusyon na ito gamit ang Ansible: link.

Ang VPS ay ipinapalagay na nagpapatakbo ng Ubuntu 18.04. Sinuri ko ang functionality sa dalawang hoster sa Europe: Amazon at Digital Ocean.

Kaya, na-install namin ang Armbian sa itaas sa R64, naa-access ito sa pamamagitan ng ssh sa ilalim ng pangalan hm-bananapi-1 at may internet access. Patuloy kaming nag-deploy ng Ansible, mga script ng automation at inilunsad ang mismong pag-install sa 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

Susunod, kailangan mong i-deploy ang aming VPN sa VPS sa parehong paraan:

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

Narito ang argumento ay palaging kasalukuyang-vpn, at ang aktwal na pangalan ng VPS ay na-configure sa isang variable (sa kasong ito ito ay 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 oo, bago ang lahat ng mga operasyong ito kailangan mong bumuo ng mga lihim (sa partikular na mga Wireguard key) sa folder ./secrets, ang direktoryo ay dapat magmukhang kaya.

Ansible Automation sa Python

Maaari mong mapansin na sa halip na nasa format na YAML, ang mga Ansible na command ay naka-encode sa mga script ng Python. Para sa paghahambing, kung paano paganahin ang bird daemon sa karaniwang paraan:

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

at kung paano gawin ang pareho sa pamamagitan ng Python:

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

Ang pagsusulat ng mga Ansible na utos sa Python ay nagbibigay-daan sa iyong muling gamitin ang code, at sa pangkalahatan ay nagbubukas ng lahat ng mga posibilidad ng pangkalahatang layunin na wika. Halimbawa, ang pag-install ng ibon sa R64 at VPS:

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

tingnan ang function code install_bird().

Ang tampok na ito ay tinatawag na pybook ipinatupad dito. Wala pang dokumentasyon sa pybook, ngunit aayusin ko ang isyung ito sa ibang pagkakataon.

Ano sa tingin niya salungat sa agos tungkol dito.

Pagsubaybay. Prometheus

Kabuuan: gumagana ang telegram, linkedin at pornhub din, sa pangkalahatan ay ok ang karanasan ng gumagamit. Ngunit lahat ay maaaring masira, kabilang ang Chinese hardware.

Ang mga pag-update ng kernel ay maaari ding maging kawili-wili: halimbawa, nais kong i-update ang kernel 5.4 => 5.6, mabuti, ang Wireguard ay nariyan sa labas ng kahon, hindi na kailangang mag-patch... Hindi pa nasabi sa tapos na: Maingat kong inilipat ang mga patch mula sa 5.4 hanggang sa 5.6, nagsimula ang kernel, nag-ping ang tunel sa VPS, ngunit hindi makakonekta ang ibon sa error na "BGP Error" ... "Nag-roll back ako sa horror" (c) sa 5.4; Ang paglipat sa 5.6 ay ipinagpaliban sa TODO.

Samakatuwid, bilang karagdagan sa pag-install ng router at VPS, nagdagdag ako ng pagsubaybay (sa x86 Ubuntu 18.04), na naka-install sa isang hiwalay na host na may mga sumusunod na sangkap:

  • prometheus, alertmanager, blackbox_exporter - lahat ay nasa docker
  • Ang mga alerto ay ipinapadala sa telegrama channel gamit ang metalmatze/alertmanager-bot bot - din sa Docker
  • tor para sa bot, upang ang bot ay makapag-alerto sa mga sitwasyon kapag may Internet, ngunit ang telegrama ay hindi pa rin gumagana, at ang bot mismo ay hindi makakonekta
  • inilapat mga alerto: NodeVPNTroubles (walang ping sa VPS), BirdVPNTroubles (walang Bird session), AntifilterDownloadTroubles (error sa paglo-load ng mga naka-block na IP address), SiteTroubles (hindi available ang masamang telegrama)
  • mga alerto sa system, halimbawa, HostGrowingDiskReadLatency (naging hindi nababasa ang murang SD card)

Halimbawa ng setup ng pagsubaybay:

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

Ang Auto Discovery para sa Prometheus ay na-configure sa folder na /etc/prometheus/auto_http, isang halimbawa ng pagdaragdag ng host sa pagsubaybay (ang mga host ay hindi sinusubaybayan bilang 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 provider, 2 BPI, anycast failover

Bilang karagdagan sa lahat, pinlano kong kumonekta sa dalawang provider upang patuloy na gumana ang Internet, kahit na ang isang provider ay may mga problema sa network, o nakalimutan nilang magbayad para sa Internet, atbp., at iba pang mga kadahilanan ng tao.

Ang pinaka-advanced na karanasan ng user sa paksa ng multi-wan ay inilarawan dito para sa Mwan3 system sa ilalim ng Openwrt. Ang solusyon na ito ay may maraming pag-andar, ngunit ang pag-set up at pagpapatakbo nito sa pangkalahatan para sa multi-wan ay medyo mahirap. Isang halimbawa lang: kung pumunta ka sa ilang site mula sa dalawang IP address nang sabay-sabay, maaaring hindi nila ito gusto, hihinto sila sa paggana => "hindi gumagana ang Internet."

Isinasaalang-alang ang karanasang ito, napagpasyahan kong hindi pa priority ang multihoming, failover lang. Bagaman, tila sa pinakabagong mga bersyon ng Linux ang lahat ay dapat gumana sa isang utos tulad ng:

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

Kaya, upang maiwasan ang isang punto ng pagkabigo, kumukuha kami ng 2 BPI, ikinonekta ang bawat isa sa isang provider, ikinonekta sila sa isa't isa at gawin ang koneksyon sa isa't isa na dynamic na pagruruta sa pamamagitan ng bird/OSPF.

Susunod, ina-advertise namin ang parehong IP address sa bawat isa kung available ang serbisyo (Internet, DNS). Iyon ay, hindi namin itatakda ang default na ruta sa aming sarili, ngunit sa pamamagitan ng ibon. Nakita ko ang solusyon dito .

Ang pag-andar na ito ay hindi pa naipapatupad, ang mapanlinlang na coronavirus ay naglaro ng isang lansihin dito (hindi lahat ay dumating mula sa Aliexpress; isa pang online na tindahan, Layta, ay nangako na maghahatid sa isang linggo, ngunit higit sa isang buwan ang lumipas; ang pangalawang provider ay walang oras upang i-extend ang cable bago mag-quarantine, nakuha lamang ang isang butas sa drill sa dingding para sa cable).

Paano mag-order ng R64

Ang board mismo ay nasa opisyal na tindahan SinoVoip.
Mas mainam din na mag-order kaagad:

  • pagkain + ipaalam sa EU o US plug standard
  • heat sink: radiators/fans; dahil parehong umiinit ang CPU at ang switch chip
  • wifi antenna, halimbawa

Mayroong isang nuance - ang presyo ng paghahatid ay naging hindi sapat na mataas sa opisyal na tindahan sa loob ng ilang panahon. Nakumbinsi ako ni Manager Judy Huang na walang error, at maaari kang pumili ng ePacket para sa $5, ngunit nakita ko na para sa Russia mayroon lamang EMS para sa >$33. Hindi kasiya-siya, ngunit hindi kritikal. Bukod dito, kung pipili ka ng ibang bansa para sa paghahatid (napuntahan ko ang lahat ng mga kontinente), ang paghahatid ay nagkakahalaga ng ~$5. Russophobes?.. Ngunit pagkatapos ay nalaman ko na para sa France ang presyo ng paghahatid ay ~30$ din, at huminahon ako.

Bilang resulta, nag-alok si Judy na mag-order, ngunit hindi magbayad (paramdam: maglagay ng mas kaunti sa card upang ang awtomatikong pagbabayad ay hindi dumaan); sumulat sa kanya at babawasan niya sa normal ang presyo ng paghahatid. Tagumpay.

Mga Isyu

Hindi pa gumagana nang perpekto ang lahat.

Pagiging Produktibo

Ansible=Ang mga utos ng Python ay dahan-dahang isinasagawa, kahit na walang ginagawa, sa loob ng 20-30 segundo; isang order ng magnitude na mas mahaba kaysa sa isang x86 laptop. Higit pa rito, sa una ang mga ito ay naisakatuparan nang mabilis, ~ 3 segundo, pagkatapos ay bumagal sila nang husto. Ito ay maaaring dahil sa pag-init ng CPU (throttling). Ang Go code ay tumatagal din ng mahabang panahon upang gumana:

# запрос ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊ для промСтСя ΠΈΠ· 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

Gumagana ang Wifi, ngunit sa Armbian huminto ito pagkatapos ng halos isang araw, sumulat:

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

Isang restart lang ang nakakatulong. Kailangan nating mag-move on pag-ayos.

Ethernet

Gumagana ang Ethernet, ngunit pagkatapos ng ~64 na oras na packet (DHCP) mula sa RXNUMX ay huminto sa pagdating.
Nakakatulong ang pag-restart ng interface:

ifdown br0; sleep 30; ifup br0

Bago ang driver, hindi pa natatanggap sa kernel, sana Chinese Landen Chao. tapusin ito.

Pinagmulan: www.habr.com

Magdagdag ng komento