Banana Pi R64 Router - Debian, Wireguard, RKN

Banana Pi 64 mangrupikeun komputer papan tunggal anu sami sareng Raspberry Pi, tapi kalayan sababaraha palabuhan Ethernet, anu ngamungkinkeun anjeun ngarobih kana router dumasar kana distribusi Linux tujuan umum.

Banana Pi R64 Router - Debian, Wireguard, RKN

Sumuhun, geus aya Openwrt, tapi boga masalah sorangan, GUI na CLI; Aya Mikrotik, tapi deui boga GUI sorangan / CLI, sarta Wireguard teu dianggo out of the box ... Sacara umum, abdi hoyong router kalawan setélan fléksibel, bari tetep dina kerangka Linux Ubuntu baku, nu anjeun damel. kalawan unggal poé.

Dina tulisan dina nami BPI, R64, single-board, kuring bakal hartosna hal anu sami - Banana Pi R64 single-board sorangan.

Milih hiji gambar. Unduh via eMMC

Kaahlian anu pangheulana anjeun kedah kéngingkeun nalika damel KTSP sacara umum, tur kalawan R64 hususna, ieu hartina diajar kumaha ngamuat hiji sistem operasi kana eta sarta bisa berinteraksi sareng eta, sabab R64 teu boga port pikeun monitor a (Contona, HDMI). Nalika sagalana murag - Wifi, Ethernet, Bluetooth, USB, jsb dieureunkeun gawé. Aya UART, ngaliwatan antarbeungeut nu salawasna bisa ningali naon nu salah, sarta ngajalankeun sababaraha paréntah ti konsol, upami diperlukeun.

Algoritma pikeun nyambungkeun ka R64 via USB-UART:

  • urang ngajalankeun ka toko bagian radio pikeun kabel USB-UART (PL2303, Serial-to-USB)
  • sambungkeun hiji tungtung USB ka komputer, sarta séjén, UART, mun R64, kalawan tilu kawat kaluar opat, sakumaha dina gambar di handap ieu.
  • ngajalankeun dina konsol komputer sudo minicom

Saatos ieu, dina kalolobaan kasus bakal muncul konsol papan tunggal = sukses.
Anjeun tiasa ningali langkung rinci di dieu.

Banana Pi R64 Router - Debian, Wireguard, RKN

Salajengna, cara panggampangna nyaéta pikeun ngamuat sistem operasi tina kartu SD: unduh ku link gambar sareng eusian:

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

Urang selapkeun kartu kana slot R64 SD, hurungkeun, sarta nitenan konsol disambungkeun loading uboot munggaran, lajeng loading Linux Ubuntu.

Hiji pilihan boot alternatif ngagunakeun kartu 64Gb geus diwangun kana R8, disebut eMMC. Numutkeun petunjuk dina wiki, urang nyalin gambar ka alat
/ dev / mmcblk0 mun BPI, reboot, nyabut kartu SD, ngahurungkeun BPI deui ... na teu dianggo. Kumaha mun mudik Boot select ulah ngaganggu.

Kanyataanna nyaéta sahenteuna pikeun BPI anjeun kedah nyetél bandéra khusus supados tiasa boot ti 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]

Salajengna, anjeun kedah nyerat preloader kana 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

Produsén R64 (Cina) dipasang binér ieu di dieu. Naon anu teu dipikanyaho (teu aya kodeu sumber), tapi moal tiasa dianggo tanpa éta.

Sacara umum, saatos ieu, gambar mimiti dimuat tina eMMC. Upami anjeun hoyong terang sareng nyiptakeun gambar ti mimiti, teras pikeun dua kasus (SD / eMMC) anjeun kedah nyerat sababaraha file deui (preloader pikeun kartu SD, ATF, u-boot) ngan ukur pikeun ngamuat kernel. Topik ieu masih ngembang, Tapi pikeun urang hal utama anu gawéna sarta oke.

Ayeuna kuring unduh via eMMC, jujur, kuring henteu nganggo éta, kartu SD cekap, tapi kuring nyéépkeun seueur waktos pikeun damel, janten dina tulisan éta.

Milih hiji sistem operasi. Arbian

Tugas aplikasi anu munggaran nyaéta ngaluncurkeun VPN, sacara alami Wireguard. Langsung kapanggih yén di sisi kernel éta henteu dirakit sareng henteu aya header. Kuring ngawangun deui kernel sareng, sakumaha kabiasaan kuring sareng x86, ngarakit modul kernel nganggo DKMS. Sanajan kitu, laju ngawangun malah Utiliti leutik on arm64 unpleasantly kaget kuring. Lajeng modul kernel sejen diperlukeun, jsb. Sacara umum, tétéla yén sagalana nu patali jeung kernel pangalusna dirakit dina laptop x86 haneut, lajeng dipindahkeun ka R64 ku nyalin basajan, rebooted sarta diuji.

Hal anu sanés nyaéta bagian ruang pangguna. Dina kasus kuring milih Debian, sadayana pikeun arsitéktur arm64 parantos aya dina packages.debian.org sareng henteu kedah ngawangun deui nanaon.

Supaya henteu ngahasilkeun sapédah sanés, kuring porting Arbian dina BPI R64.
Atawa rada, ieu: bagian userspace nyaeta Armbian, sarta kernel dicokot tina Repository nu terus terang-A. Gambar panganyarna tiasa diunduh di dieu.

Sadaya kagiatan dina ngembangkeun bagian software R64 dilumangsungkeun dina forum. Sacara umum, produsén sorangan narékahan pikeun ngapopulérkeun router pikeun Openwrt, tapi berkat kagiatan pamekar Frank ti Jerman, sadaya fitur gancang ditungtungan dina kernel pikeun Debian. Ahéng, Frank aktip dina unggal thread forum.

Organisasi workspace: kawat

Kapisah, Abdi hoyong ngabejaan ka maneh kumaha, salila ngembangkeun / nguji, nempatkeun hiji SBC (teu ngan BPI) dina méja ku kituna teu ngajalankeun kabel Ethernet ka dinya ti sumber Internet sakuliah sakabéh kamar / kantor. Nyatana, di hiji sisi, anjeun kedah nyayogikeun sapotong hardware nganggo Internét, tapi di sisi anu sanés, sadayana dina sapotong hardware éta tiasa ngarecah, sareng mimitina Wifi.

Mimiti, kuring mutuskeun mésér "pisel" USB-Wifi anu murah, nyolok kana hiji-hijina port dina BPI sareng hilap kabelna. Jang ngalampahkeun ieu, kuring ngagaleuh TP-LINK TL-WN725N USB 2.0 anu murah, tapi pas janten jelas yén éta moal pareum: pikeun suling damel, anjeun peryogi supir kernel, anu, tangtosna, henteu aya. (engké kuring dirakit supir RTL8XXXU perlu, tapi masih praktis). Jeung kabel Ethernet manja katingal kamar bari.

Hasilna, kuring junun meunang leupas tina kabel kalayan bantuan Tenda MW3 (Sistim bolong Wifi): Kuring ngan nempatkeun hiji kubus handapeun méja tur nyambungkeun BPI ka port LAN kiwari dimungkinkeun ku kabel Ethernet méter-lila. Kasuksésan.

Wireguard, RKN, Manuk

Salah sahiji hal anu kuring hoyong nganggo Banana PI nyaéta gaduh aksés gratis kana situs anu diblokir ku RKN, khususna, supados telepon Telegram sareng Slack tiasa jalan. Artikel ngeunaan Habré parantos diusulkeun ngeunaan topik ieu: waktu, два, tilu.

Kuring nyebarkeun persis solusi ieu nganggo Ansible: link.

VPS dianggap ngajalankeun Ubuntu 18.04. Kuring pariksa pungsionalitasna dina dua hoster di Éropa: Amazon sareng Digital Ocean.

Janten, urang pasang Armbian di luhur dina R64, éta tiasa diaksés via ssh handapeun nami hm-bananapi-1 sarta boga aksés internét. Urang konsistén nyebarkeun Ansible, skrip automation sareng ngaluncurkeun pamasangan sorangan dina 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

Salajengna, anjeun kedah nyebarkeun VPN kami ka VPS dina cara anu sami:

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

Di dieu argumenna salawasna ayeuna-vpn, sareng nami VPS saleresna dikonpigurasi dina variabel (dina hal ieu 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 enya, sateuacan sadaya operasi ieu anjeun kedah ngahasilkeun rusiah (khususna konci Wireguard) kana polder ./secrets, diréktori kudu kasampak kawas janten.

Automation Ansible dina Python

Anjeun tiasa perhatikeun yén tinimbang dina format YAML, paréntah Ansible disandikeun dina skrip Python. Pikeun babandingan, kumaha cara ngaktipkeun daemon manuk ku cara biasa:

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

sareng kumaha ngalakukeun anu sami via Python:

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

Nulis paréntah Ansible di Python ngidinan Anjeun pikeun make deui kode, sarta sacara umum muka nepi sagala kemungkinan tina basa tujuan umum. Salaku conto, masang manuk dina R64 sareng VPS:

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

tingali kodeu fungsi install_bird().

fitur ieu disebut pybook dilaksanakeun di dieu. Henteu aya dokuméntasi dina pybook, tapi kuring bakal ngalereskeun masalah ieu engké.

Kumaha saur anjeunna hulu dina kasempetan ieu.

Ngawaskeun. Prometheus

Total: karya telegram, linkedin sareng pornhub ogé, sacara umum pangalaman pangguna henteu kunanaon. Tapi sagalana bisa megatkeun, kaasup hardware Cina.

Pembaruan kernel ogé tiasa pikaresepeun: contona, kuring hoyong ngamutahirkeun kernel 5.4 => 5.6, ogé Wireguard aya di luar kotak, teu kedah ditambal... Teu lami-lami saurna: Kuring teras-terasan mindahkeun patches tina 5.4. ka 5.6, kernel dimimitian nepi, torowongan ka VPS pinged, tapi manuk teu bisa nyambung jeung kasalahan "BGP Kasalahan" ... "Kuring digulung deui horor" (c) ka 5.4; Pindah ka 5.6 ditunda di TODO.

Ku alatan éta, salian masang router sareng VPS, kuring nambihan monitoring (dina x86 Ubuntu 18.04), anu dipasang dina host anu misah sareng komponén ieu:

  • prometheus, alertmanager, blackbox_exporter - sadayana di docker
  • Tanda dikirim ka saluran telegram nganggo bot metalmatze/alertmanager-bot - ogé dina Docker
  • tor pikeun bot, ku kituna bot tiasa waspada kaayaan nalika aya Internet, tapi Telegram masih teu jalan, sarta bot sorangan teu bisa nyambung.
  • dilarapkeun panggeuing: NodeVPNTroubles (euweuh ping kana VPS), BirdVPNTroubles (euweuh sesi Manuk), AntifilterDownloadTroubles (kasalahan ngamuat alamat IP anu diblokir), SiteTroubles (telegram anu teu aya nasibna henteu sayogi)
  • panggeuing sistem, contona, HostGrowingDiskReadLatency (kartu SD mirah janten teu tiasa dibaca)

Conto pamasangan ngawaskeun:

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

Auto Discovery for Prometheus dikonpigurasi dina folder /etc/prometheus/auto_http, conto nambahkeun host pikeun ngawaskeun (host henteu diawaskeun sacara standar):

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

Salian sagalana, abdi rencanana pikeun nyambung ka dua panyadia ambéh Internet bakal neruskeun dianggo, sanajan hiji panyadia boga masalah sareng jaringan, atawa maranéhna poho mayar Internet, jsb, sarta faktor manusa séjén.

Pangalaman pangguna anu paling maju dina topik multi-wan dijelaskeun di dieu pikeun sistem Mwan3 handapeun Openwrt. Solusi ieu ngagaduhan fungsionalitas anu beunghar, tapi netepkeun sareng ngoperasikeunana sacara umum pikeun multi-wan cukup nyusahkeun. Ngan hiji conto: lamun datang ka sababaraha situs ti dua alamat IP sakaligus, maranéhna bisa jadi teu resep, maranéhna bakal eureun gawé => "Internet teu jalan."

Nyandak kana akun pangalaman ieu, abdi mutuskeun yén multihoming teu prioritas acan, ngan failover. Sanajan, sigana dina versi panganyarna tina Linux Ubuntu sagalana kedah dianggo kalayan hiji paréntah kawas:

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

Ku kituna, dina urutan ulah hiji titik gagalna, urang nyandak 2 BPIs, sambungkeun unggal hiji panyadia, sambungkeun ka silih tur nyieun sambungan saling routing dinamis via manuk / OSPF.

Salajengna, urang ngiklankeun alamat IP anu sami dina masing-masing upami jasana sayogi (Internet, DNS). Nyaéta, urang moal nyetél jalur standar sorangan, tapi ngaliwatan manuk. Kuring nempo solusi di dieu .

Fungsionalitas ieu henteu acan dilaksanakeun, coronavirus insidious maénkeun trik di dieu (henteu sadayana sumping ti Aliexpress; toko online anu sanés, Layta, jangji bakal nganteurkeun dina saminggu, tapi langkung ti sabulan parantos kalangkung; panyadia kadua henteu gaduh waktos. pikeun manjangkeun kabel saméméh karantina, ukur liang dina bor kana témbok pikeun kabel).

Kumaha mesen R64

Papan sorangan aya di toko resmi SinoVoip.
Éta ogé hadé pikeun mesen langsung:

  • gizi + ngawartosan standar colokan EU atanapi AS
  • tilelep panas: radiators / kipas; sabab duanana CPU jeung chip switch anu manaskeun up
  • anteneu pikeun wifi, contona

Aya nuansa - harga pangiriman geus jadi inadequately tinggi di toko resmi pikeun sawatara waktu. Manajer Judy Huang ngayakinkeun kuring yén teu aya kasalahan, sareng anjeun tiasa milih ePacket pikeun $ 5, tapi kuring ningali yén pikeun Rusia ngan aya EMS pikeun> $ 33. Teu pikaresepeun, tapi henteu kritis. Sumawona, upami anjeun milih nagara sanés pikeun pangiriman (kuring ngalangkungan sadaya buana), pangiriman bakal ngarugikeun ~ $ 5. Russophobes?.. Tapi lajeng kuring manggihan yén pikeun Perancis harga pangiriman ogé ~ 30 $, sarta kuring calmed handap.

Hasilna, Judy nawiskeun pesenan, tapi henteu mayar (pitunjuk: nempatkeun kirang dina kartu supados pamayaran otomatis teu ngaliwat); nyeratna sareng anjeunna bakal ngirangan harga pangiriman ka normal. Kasuksésan.

isu

Henteu sadayana tiasa dianggo sampurna acan.

kakuwatan keur ngasilkeun

Ansible=Paréntah Python dieksekusi lalaunan, sanajan dianggurkeun, salila 20-30 detik; urutan gedena leuwih panjang batan dina laptop x86. Leuwih ti éta, mimitina aranjeunna dieksekusi rada gancang, ~ 3 detik, teras ngalambatkeun turun sharply. Ieu tiasa disababkeun ku pemanasan CPU (throttling). Kodeu Go ogé peryogi waktos anu lami kanggo damel:

# запрос метрик для прометея из 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 berpungsi, tapi dina Armbian lirén saatos sadinten, nyerat:

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

Ngan balikan deui mantuan. Urang kudu ngaléngkah angka eta kaluar.

Ethernet

Ethernet jalan, tapi sanggeus ~ 64 jam pakét (DHCP) ti RXNUMX eureun anjog.
Balikan deui antarmuka ngabantosan:

ifdown br0; sleep 30; ifup br0

Supirna énggal, teu acan katampi kana kernel, mugia éta Cina Landen Chao rengse eta.

sumber: www.habr.com

Tambahkeun komentar