Banana Pi R64 router - Debian, Wireguard, RKN

Ang Banana Pi 64 usa ka single-board nga kompyuter nga susama sa Raspberry Pi, apan adunay daghang mga Ethernet port, nga nagpaposible sa paghimo niini nga usa ka router base sa usa ka general-purpose Linux distribution.

Banana Pi R64 router - Debian, Wireguard, RKN

Oo, adunay na Openwrt, apan kini adunay kaugalingon nga mga problema, ang GUI ug CLI; Adunay Mikrotik, apan pag-usab kini adunay kaugalingon nga GUI / CLI, ug ang Wireguard dili molihok sa gawas sa kahon ... Sa kinatibuk-an, gusto ko ang usa ka router nga adunay flexible nga mga setting, samtang nagpabilin sulod sa gambalay sa standard Linux, nga imong gitrabaho. uban sa matag adlaw.

Sa artikulo ubos sa mga ngalan nga BPI, R64, single-board, pareho ra ang akong ipasabot - ang Banana Pi R64 single-board mismo.

Pagpili og hulagway. Pag-download pinaagi sa eMMC

Ang labing una nga kahanas nga kinahanglan nimo nga maangkon kung nagtrabaho SBC sa kinatibuk-an, ug sa partikular nga R64, kini nagpasabot sa pagkat-on kon sa unsang paagi sa pag-load sa usa ka operating system ngadto niini ug makahimo sa pagpakig-uban niini, tungod kay ang R64 walay pantalan alang sa usa ka monitor (HDMI, pananglitan). Sa diha nga ang tanan nahulog - Wifi, Ethernet, Bluetooth, USB, ug uban pa mihunong sa pagtrabaho. Adunay usa ka UART, pinaagi sa interface nga imong makita kanunay kung unsa ang sayup, ug usab magpadagan sa pipila ka mga sugo gikan sa console, kung gikinahanglan.

Algorithm sa pagkonektar sa R64 pinaagi sa USB-UART:

  • midagan mi sa radio parts store para sa USB-UART cable (PL2303, Serial-to-USB)
  • ikonektar ang usa ka tumoy sa USB sa kompyuter, ug ang lain, UART, sa R64, nga adunay tulo nga mga wire gikan sa upat, sama sa litrato sa ubos
  • modagan sa computer console sudo minicom

Pagkahuman niini, sa kadaghanan nga mga kaso ang single-board console makita = kalampusan.
Makita nimo ang dugang nga mga detalye dinhi.

Banana Pi R64 router - Debian, Wireguard, RKN

Sunod, ang labing kadali nga paagi mao ang pag-load sa operating system gikan sa usa ka SD card: pag-download pinaagi sa link hulagway ug pun-a kini:

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

Among gisulod ang card ngadto sa R64 SD slot, i-on kini, ug obserbahan ang konektado nga console nga nag-load una sa uboot, dayon ang standard nga Linux loading.

Usa ka alternatibo nga kapilian sa boot mao ang paggamit sa usa ka 64Gb card nga gitukod na sa R8, nga gitawag nga eMMC. Sumala sa mga panudlo sa wiki, gikopya namon ang imahe sa aparato
/dev/mmcblk0 sa BPI, i-reboot, kuhaa ang SD card, i-on pag-usab ang BPI ... ug dili kini molihok. Unsaon pagbalik ug balik Boot select ayaw kabalaka.

Ang tinuod mao nga labing menos alang sa BPI kinahanglan nimo nga magbutang usa ka espesyal nga bandila aron maka-boot gikan sa usa ka internal nga 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]

Sunod, kinahanglan nimo nga isulat ang preloader sa usa ka espesyal nga partisyon sa 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) nag-post niini nga binary dinhi. Ang gibuhat niini wala mahibal-an (walay mga source code), apan dili usab kini molihok kung wala kini.

Sa kinatibuk-an, pagkahuman niini, ang mga imahe nagsugod sa pagkarga gikan sa eMMC. Kung gusto nimo nga mahibal-an kini ug maghimo mga imahe gikan sa wala, unya alang sa duha nga mga kaso (SD / eMMC) kinahanglan nimo nga isulat ang daghang mga file (preloader alang sa SD card, ATF, u-boot) aron lang ma-load ang kernel. Kini nga hilisgutan mao gihapon molambo, apan alang kanamo ang panguna nga butang mao nga kini molihok ug okay.

Karon nag-download ako pinaagi sa eMMC, sa tinuud, wala nako kini gigamit, igo na ang usa ka SD card, apan gigugol nako ang daghang oras aron magamit kini, busa ibutang kini sa artikulo.

Pagpili sa usa ka operating system. Armbian

Ang una nga buluhaton sa aplikasyon mao ang paglansad sa usa ka VPN, natural nga Wireguard. Diha-diha dayon nadiskobrehan nga sa kernel nga bahin wala kini gipundok ug walay mga ulohan. Akong gitukod pag-usab ang kernel ug, sama sa akong batasan sa x86, gitigom ang kernel module gamit ang DKMS. Bisan pa, ang katulin sa pagtukod bisan sa gagmay nga mga gamit sa arm64 dili maayo nga nakurat kanako. Ug unya gikinahanglan ang laing kernel module, ug uban pa. Sa kinatibuk-an, kini nahimo nga ang tanan nga may kalabutan sa kernel labing maayo nga gitigum sa usa ka mainit nga x86 laptop, dayon gibalhin sa R64 pinaagi sa yano nga pagkopya, pag-reboot ug pagsulay.

Ang laing butang mao ang bahin sa userspace. Sa akong kaso sa pagpili sa Debian, ang tanan alang sa arm64 nga arkitektura naa na sa packages.debian.org ug dili na kinahanglan nga tukuron pag-usab ang bisan unsang butang.

Aron dili makagama og laing bisikleta, ako ported armbian sa BPI R64.
O hinoon, kini: ang bahin sa userspace mao ang Armbian, ug ang kernel gikuha gikan sa repository Frank-A. Ang pinakabag-o nga hulagway mahimong ma-download dinhi.

Ang tanan nga kalihokan sa pagpalambo sa software nga bahin sa R64 gidala sa gawas sa ang forum. Sa kinatibuk-an nga pagsulti, ang tiggama mismo naningkamot nga itanyag ang router alang sa Openwrt, apan salamat sa kalihokan sa developer nga si Frank gikan sa Alemanya, ang tanan nga mga bahin dali nga natapos sa kernel alang sa Debian. Katingad-an, si Frank aktibo sa matag forum thread.

Organisasyon sa workspace: mga wire

Gilain, gusto nako isulti kanimo kung giunsa, sa panahon sa pag-uswag / pagsulay, pagbutang usa ka SBC (dili lamang usa ka BPI) sa usa ka lamesa aron dili makadagan ang usa ka Ethernet cable gikan sa usa ka gigikanan sa Internet sa tibuuk nga kwarto / opisina. Ang tinuod mao nga, sa usa ka bahin, kinahanglan nimo nga maghatag usa ka piraso sa hardware nga adunay Internet, apan sa laing bahin, ang tanan sa kana nga piraso sa hardware mahimong maguba, ug una sa tanan Wifi.

Una, nakahukom ko nga mopalit og barato nga USB-Wifi nga "whistle", i-plug kini sa bugtong port sa BPI ug kalimtan ang mga wire. Aron mahimo kini, nagpalit ako usa ka barato nga TP-LINK TL-WN725N USB 2.0, apan sa wala madugay nahibal-an nga dili kini mawala: aron molihok ang whistle, kinahanglan nimo ang usa ka driver sa kernel, nga, siyempre, wala didto. (sa ulahi akong gitigum ang gikinahanglan nga RTL8XXXU drayber, apan kini dili praktikal). Ug ang Ethernet cable nakadaot sa hitsura sa kwarto sa makadiyot.

Ingon usa ka sangputanan, nakuha nako ang kable sa tabang sa Tenda MW3 (Wifi mesh system): Gibutang ra nako ang usa ka cube sa ilawom sa lamesa ug gikonektar ang BPI sa LAN port sa ulahi gamit ang usa ka metro nga taas nga Ethernet cable. Kalampusan.

Wireguard, RKN, Langgam

Usa sa mga butang nga gusto nakong gamiton ang Banana PI mao ang pagbaton og libre nga pag-access sa mga site nga gibabagan sa RKN, ilabi na, aron ang mga tawag sa Telegram ug Slack mahimong molihok. Ang mga artikulo bahin sa HabrΓ© gisugyot na bahin niini nga hilisgutan: mga panahon, duha ka, tulo.

Gi-deploy nako kini nga solusyon gamit ang Ansible: link.

Ang VPS gituohan nga nagpadagan sa Ubuntu 18.04. Gisusi nako ang pag-andar sa duha ka host sa Europe: Amazon ug Digital Ocean.

Busa, among gi-install ang Armbian sa ibabaw sa R64, kini ma-access pinaagi sa ssh ubos sa ngalan hm-bananapi-1 ug adunay internet access. Kami makanunayon nga nag-deploy sa Ansible, automation nga mga script ug naglansad sa pag-install mismo 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

Sunod, kinahanglan nimo nga i-deploy ang among VPN sa VPS sa parehas nga paagi:

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

Dinhi ang argumento kanunay nga kasamtangan-vpn, ug ang aktwal nga ngalan sa VPS gi-configure sa usa ka variable (sa kini nga kaso kini 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, sa wala pa ang tanan nga kini nga mga operasyon kinahanglan nimo nga maghimo mga sekreto (sa partikular nga mga yawe sa Wireguard) sa folder ./secrets, ang direktoryo kinahanglan nga tan-awon sama sa mao nga.

Ansible Automation sa Python

Mahimo nimong mamatikdan nga imbes nga naa sa format nga YAML, ang mga Ansible nga mga mando gi-encode sa mga script sa Python. Alang sa pagtandi, kung giunsa ang paghimo sa bird daemon sa naandan nga paagi:

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

ug unsaon pagbuhat sa ingon pinaagi sa Python:

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

Ang pagsulat sa Ansible nga mga sugo sa Python nagtugot kanimo sa paggamit pag-usab sa code, ug sa kinatibuk-an nagbukas sa tanan nga mga posibilidad sa kinatibuk-ang katuyoan nga pinulongan. Pananglitan, ang pag-instalar sa langgam sa R64 ug VPS:

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

tan-awa ang function code install_bird().

Kini nga bahin gitawag pybook gipatuman dinhi. Wala pa'y dokumentasyon sa pybook, apan ayohon nako kini nga isyu sa ulahi.

Unsa iyang hunahuna sa ibabaw sa suba niining higayona.

Pagmonitor. Prometheus

Kinatibuk-an: ang telegrama nagtrabaho, linkedin ug pornhub usab, sa kinatibuk-an ok ang kasinatian sa user. Apan ang tanan mahimong mabuak, lakip ang Chinese hardware.

Ang mga pag-update sa kernel mahimo usab nga makapaikag: pananglitan, gusto nako nga i-update ang kernel 5.4 => 5.6, maayo, ang Wireguard naa sa gawas sa kahon, dili kinahanglan nga i-patch ... Wala dayon gisulti kaysa nahuman: Makugi kong gibalhin ang mga patch gikan sa 5.4 hangtod sa 5.6, ang kernel nagsugod, ang tunel sa VPS nag-ping, apan ang langgam dili makakonektar sa sayup nga "BGP Error" ... "Mibalik ako sa kalisang" (c) sa 5.4; Ang pagbalhin sa 5.6 gi-postpone sa TODO.

Busa, dugang sa pag-instalar sa router ug VPS, gidugang nako ang pag-monitor (sa x86 Ubuntu 18.04), nga gi-install sa usa ka bulag nga host nga adunay mga musunud nga sangkap:

  • prometheus, alertmanager, blackbox_exporter - tanan sa docker
  • Ang mga alerto gipadala sa telegram channel gamit ang metalmatze/alertmanager-bot bot - usab sa Docker
  • tor alang sa bot, aron ang bot makaalerto sa mga sitwasyon kung adunay Internet, apan ang telegrama wala gihapon molihok, ug ang bot mismo dili makakonektar
  • gipadapat mga alerto: NodeVPNTroubles (walay ping sa VPS), BirdVPNTroubles (walay Bird session), AntifilterDownloadTroubles (sayup sa pagkarga sa gibabagan nga mga IP address), SiteTroubles (wala'y mahimo nga telegrama)
  • mga alerto sa sistema, pananglitan, HostGrowingDiskReadLatency (ang barato nga SD card dili na mabasa)

Pananglitan sa setup sa pagmonitor:

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

Ang Auto Discovery para sa Prometheus gi-configure sa /etc/prometheus/auto_http folder, usa ka pananglitan sa pagdugang sa usa ka host sa pag-monitor (ang mga host dili gibantayan pinaagi sa 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 providers, 2 BPI, anycast failover

Dugang pa sa tanan, nagplano ako nga magkonektar sa duha ka mga provider aron ang Internet magpadayon sa pagtrabaho, bisan kung ang usa ka provider adunay mga problema sa network, o nakalimot sila sa pagbayad sa Internet, ug uban pa, ug uban pang mga hinungdan sa tawo.

Ang labing abante nga kasinatian sa tiggamit sa hilisgutan sa multi-wan gihulagway dinhi alang sa Mwan3 nga sistema ubos sa Openwrt. Kini nga solusyon adunay daghang pag-andar, apan ang pag-set up ug pag-operate niini sa kinatibuk-an alang sa multi-wan medyo masamok. Usa lang ka pananglitan: kung moadto ka sa pipila ka mga site gikan sa duha ka mga adres sa IP sa usa ka higayon, mahimo nga dili nila kini gusto, mohunong sila sa pagtrabaho => "Ang Internet wala molihok."

Gikonsiderar kini nga kasinatian, nakahukom ko nga ang multihoming dili pa usa ka prayoridad, failover lamang. Bisan pa, ingon og sa pinakabag-o nga mga bersyon sa Linux ang tanan kinahanglan nga magtrabaho sa usa ka sugo sama sa:

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

Busa, aron sa paglikay sa usa ka punto sa kapakyasan, kita sa pagkuha sa 2 BPIs, Sumpaysumpaya ang matag usa ngadto sa usa ka provider, ikonektar sila sa usag usa ug sa paghimo sa koneksyon sa usag usa dinamikong routing pinaagi sa langgam/OSPF.

Sunod, gi-anunsyo namon ang parehas nga IP address sa matag usa kung magamit ang serbisyo (Internet, DNS). Sa ato pa, dili namo ibutang ang default nga ruta sa among kaugalingon, apan pinaagi sa langgam. Gipangita nako ang solusyon dinhi .

Kini nga pag-andar wala pa gipatuman, ang maliputon nga coronavirus nagdula dinhi (dili tanan moabut gikan sa Aliexpress; laing online nga tindahan, Layta, misaad nga ihatud sa usa ka semana, apan kapin sa usa ka bulan ang milabay; ang ikaduha nga tighatag wala’y oras. aron i-extend ang cable sa wala pa ang quarantine, nakahimo lamang sa pagkuha sa usa ka lungag sa drill ngadto sa bungbong alang sa cable).

Unsaon pag order ug R64

Ang board mismo anaa sa opisyal nga tindahan SinoVoip.
Mas maayo usab nga mag-order dayon:

  • nutrisyon + ipahibalo ang EU o US plug standard
  • heat sink: radiators/fans; tungod kay ang CPU ug ang switch chip nag-init
  • wifi antenna, alang sa panig-ingnan

Adunay usa ka nuance - ang presyo sa pagpadala nahimong dili igo nga taas sa opisyal nga tindahan sulod sa pipila ka panahon. Gikombinsir ako ni Manager Judy Huang nga wala'y sayup, ug mahimo nimong pilion ang ePacket sa $5, apan nakita nako nga alang sa Russia adunay EMS lamang sa> $33. Dili maayo, apan dili kritikal. Dugang pa, kung mopili ka sa bisan unsang nasud alang sa paghatud (naagian nako ang tanan nga mga kontinente), ang paghatud mokantidad ~ $5. Russophobes?.. Apan unya akong nahibal-an nga alang sa France ang presyo sa pagpadala usab ~ 30 $, ug ako mikalma.

Ingon nga resulta, si Judy mitanyag nga mag-order, apan dili mobayad (Timaan: gamay ra ang pagbutang sa kard aron dili moagi ang awtomatik nga pagbayad); sulati siya ug pakunhuran niya ang presyo sa pagpadala sa normal. Kalampusan.

mga isyu

Dili pa ang tanan nagtrabaho sa hingpit.

Pag-uswag

Ansible=Ang mga sugo sa Python hinay nga gipatuman, bisan ang mga walay pulos, sulod sa 20-30 ka segundo; usa ka han-ay sa magnitude nga mas taas kaysa sa x86 nga laptop. Dugang pa, sa una kini dali nga gipatuman, ~ 3 segundos, unya hinay kini nga hinay. Mahimong tungod kini sa pag-init sa CPU (throttling). Ang Go code nagkinahanglan usab og taas nga panahon sa pagtrabaho:

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

Ang Wifi nagtrabaho, apan sa Armbian kini mihunong pagkahuman sa usa ka adlaw, misulat:

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

Makatabang ra ang pag-restart. Kinahanglan natong magpadayon hunahunaa kini.

Ethernet

Ang Ethernet nagtrabaho, apan pagkahuman sa ~ 64 oras nga mga pakete (DHCP) gikan sa RXNUMX mihunong sa pag-abot.
Ang pagsugod pag-usab sa interface makatabang:

ifdown br0; sleep 30; ifup br0

Bag-o ang drayber, wala pa kini gidawat sa kernel, hinaut nga kini si Chinese Landen Chao mahuman kini.

Source: www.habr.com

Idugang sa usa ka comment