Banana Pi R64 Router - Debian, Wireguard, RKN

Banana Pi 64 ni kompyuta ya bodi moja inayofanana na Raspberry Pi, lakini ikiwa na bandari kadhaa za Ethernet, ambayo inafanya uwezekano wa kuibadilisha kuwa router kulingana na usambazaji wa Linux wa madhumuni ya jumla.

Banana Pi R64 Router - Debian, Wireguard, RKN

Ndiyo, tayari kuna Openwrt, lakini ina matatizo yake mwenyewe, GUI yake na CLI; Kuna Mikrotik, lakini tena ina GUI/CLI yake mwenyewe, na Wireguard haifanyi kazi nje ya boksi... Kwa ujumla, nataka kipanga njia chenye mipangilio rahisi, huku kikisalia ndani ya mfumo wa Linux ya kawaida, ambayo unafanya kazi. na kila siku.

Katika makala chini ya majina BPI, R64, bodi moja, nitamaanisha kitu kimoja - Banana Pi R64 single-bodi yenyewe.

Kuchagua picha. Pakua kupitia eMMC

Ustadi wa kwanza kabisa unahitaji kupata wakati wa kufanya kazi nao SBC kwa ujumla, na kwa R64 hasa, hii ina maana ya kujifunza jinsi ya kupakia mfumo wa uendeshaji ndani yake na kuwa na uwezo wa kuingiliana nayo, kwa sababu R64 haina bandari ya kufuatilia (HDMI, kwa mfano). Wakati kila kitu kilipoanguka - Wifi, Ethernet, Bluetooth, USB, nk iliacha kufanya kazi.Kuna UART, kwa njia ya interface ambayo unaweza daima kuona kile kilichoenda vibaya, na pia kukimbia amri kadhaa kutoka kwa console, ikiwa ni lazima.

Algorithm ya kuunganisha kwa R64 kupitia USB-UART:

  • tunakimbilia kwenye duka la vipuri vya redio kwa kebo ya USB-UART (PL2303, Serial-to-USB)
  • unganisha ncha moja ya USB kwenye kompyuta, na nyingine, UART, kwa R64, na waya tatu kati ya nne, kama kwenye picha hapa chini.
  • endesha kwenye koni ya kompyuta sudo minicom

Baada ya hayo, katika hali nyingi console ya bodi moja itaonekana = mafanikio.
Unaweza kuona maelezo zaidi hapa.

Banana Pi R64 Router - Debian, Wireguard, RKN

Ifuatayo, njia rahisi ni kupakia mfumo wa uendeshaji kutoka kwa kadi ya SD: pakua na kiungo picha na ujaze:

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

Tunaingiza kadi kwenye slot ya R64 SD, kuiwasha, na kuchunguza kiweko kilichounganishwa kikipakia kwanza uboot, kisha upakiaji wa kawaida wa Linux.

Chaguo mbadala la kuwasha ni kutumia kadi ya 64Gb ambayo tayari imejengwa kwenye R8, inayoitwa eMMC. Kulingana na maagizo katika wiki, tunakili picha kwenye kifaa
/dev/mmcblk0 kwa BPI, fungua upya, ondoa kadi ya SD, washa BPI tena ... na haifanyi kazi. Jinsi ya kwenda na kurudi Boot select usijisumbue.

Ukweli ni kwamba angalau kwa BPI unahitaji kuweka bendera maalum ili uweze boot kutoka kwa gari la ndani la flash:

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]

Ifuatayo, unahitaji kuandika kipakiaji awali kwenye kizigeu maalum cha buti

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

Mtengenezaji R64 (Uchina) alichapisha jozi hii hapa. Inachofanya haijulikani (hakuna misimbo ya chanzo), lakini haitafanya kazi bila hiyo pia.

Kwa ujumla, baada ya hili, picha zinaanza kupakia kutoka eMMC. Ikiwa unataka kuitambua na kuunda picha kutoka mwanzo, basi kwa visa vyote viwili (SD/eMMC) unahitaji kuandika faili kadhaa zaidi (kipakiaji awali cha kadi ya SD, ATF, u-boot) ili tu upakie kernel. Mada hii bado yanaendelea, lakini kwetu jambo kuu ni kwamba inafanya kazi na ni sawa.

Sasa ninapakua kupitia eMMC, kuwa waaminifu, siitumii, kadi ya SD inatosha, lakini nilitumia muda mwingi kuifanya ifanye kazi, basi iwe katika makala.

Kuchagua mfumo wa uendeshaji. Kiarbia

Kazi ya kwanza ya programu ni kuzindua VPN, kawaida Wireguard. Iligunduliwa mara moja kuwa upande wa kernel haukukusanywa na hapakuwa na vichwa. Niliunda tena kernel na, kama ilivyo kawaida yangu na x86, nilikusanya moduli ya kernel kwa kutumia DKMS. Walakini, kasi ya kujenga hata huduma ndogo kwenye arm64 ilinishangaza vibaya. Na kisha moduli nyingine ya kernel ilihitajika, nk. Kwa ujumla, zinageuka kuwa kila kitu kinachohusiana na kernel ni bora kukusanyika kwenye kompyuta ya joto ya x86, kisha kuhamishiwa kwenye R64 kwa kuiga rahisi, upya upya na kupimwa.

Jambo lingine ni sehemu ya nafasi ya mtumiaji. Katika kesi yangu ya kuchagua Debian, kila kitu cha usanifu wa arm64 tayari kiko kwenye packages.debian.org na hakuna haja ya kujenga tena chochote.

Ili kutozalisha baiskeli nyingine, I imehamishwa Kiarbia kwa BPI R64.
Au tuseme, hii: sehemu ya nafasi ya mtumiaji ni Armbian, na kernel inachukuliwa kutoka kwa hazina Frank-A. Picha ya hivi karibuni inaweza kupakuliwa hapa.

Shughuli zote juu ya maendeleo ya sehemu ya programu ya R64 inafanywa mkutano. Kwa ujumla, mtengenezaji mwenyewe anajitahidi kutangaza kipanga njia cha Openwrt, lakini kutokana na shughuli ya msanidi programu Frank kutoka Ujerumani, vipengele vyote huishia haraka kwenye kernel ya Debian. Kwa kushangaza, Frank yuko hai katika kila mazungumzo ya jukwaa.

Shirika la nafasi ya kazi: waya

Kando, ningependa kukuambia jinsi, wakati wa ukuzaji / majaribio, weka SBC (sio BPI tu) kwenye meza ili usiendeshe kebo ya Ethernet kutoka kwa chanzo cha Mtandao kwenye chumba/ofisi nzima. Ukweli ni kwamba, kwa upande mmoja, unahitaji kutoa kipande cha vifaa na mtandao, lakini kwa upande mwingine, kila kitu katika kipande hicho cha vifaa kinaweza kuvunja, na kwanza kabisa Wifi.

Kwanza, niliamua kununua "filimbi" ya bei nafuu ya USB-Wifi, kuunganisha kwenye bandari pekee kwenye BPI na kusahau kuhusu waya. Ili kufanya hivyo, nilinunua TP-LINK TL-WN725N USB 2.0 ya bei nafuu, lakini hivi karibuni ikawa wazi kuwa haitaondoka: ili filimbi ifanye kazi, unahitaji dereva wa kernel, ambayo, kwa kweli, haikuwepo. (baadaye nilikusanya dereva muhimu wa RTL8XXXU, lakini bado haiwezekani). Na kebo ya Ethernet iliharibu mwonekano wa chumba kwa muda.

Matokeo yake, niliweza kuondokana na cable kwa msaada wa Tenda MW3 (mfumo wa mesh ya Wifi): Niliweka tu mchemraba mmoja chini ya meza na kuunganisha BPI kwenye bandari ya LAN ya mwisho na cable ya Ethernet ya urefu wa mita. Mafanikio.

Wireguard, RKN, Ndege

Mojawapo ya mambo ambayo ninataka kutumia Banana PI ni kupata ufikiaji wa bure kwa tovuti zilizozuiwa na RKN, haswa, ili simu za Telegraph na Slack zifanye kazi. Nakala kuhusu Habre tayari zimependekezwa kuhusu mada hii: wakati, Π΄Π²Π°, tatu.

Nilipeleka suluhisho hili haswa kwa kutumia Ansible: kiungo.

VPS inadhaniwa kuwa inaendesha Ubuntu 18.04. Niliangalia utendaji kazi kwenye wapangishaji wawili huko Uropa: Amazon na Bahari ya Dijiti.

Kwa hivyo, tuliweka Armbian hapo juu kwenye R64, inapatikana kupitia ssh chini ya jina hm-bananapi-1 na ina ufikiaji wa mtandao. Tunasambaza hati za Ansible, otomatiki na kuzindua usakinishaji wenyewe kwenye 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

Ifuatayo, unahitaji kupeleka VPN yetu kwa VPS kwa njia ile ile:

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

Hapa hoja ni ya sasa-vpn, na jina halisi la VPS limeundwa kwa kutofautisha (katika kesi hii ni 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

Ndio, kabla ya shughuli hizi zote unahitaji kutoa siri (haswa funguo za Wireguard) kwenye folda. ./secrets, saraka inapaswa kuonekana kama hivyo.

Automation Ansible katika Python

Unaweza kugundua kuwa badala ya kuwa katika umbizo la YAML, amri Ansible zimesimbwa katika hati za Python. Kwa kulinganisha, jinsi ya kuwezesha daemon ya ndege kwa njia ya kawaida:

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

na jinsi ya kufanya hivyo kupitia Python:

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

Kuandika Amri Zinazofaa katika Python hukuruhusu kutumia tena nambari, na kwa ujumla hufungua uwezekano wote wa lugha ya kusudi la jumla. Kwa mfano, kusanikisha ndege kwenye R64 na VPS:

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

tazama msimbo wa kazi install_ndege().

Kipengele hiki kinachoitwa pybook kutekelezwa hapa. Bado hakuna hati kwenye pybook, lakini nitarekebisha suala hili baadaye.

Anafikiria nini Mto kwenye hafla hii.

Ufuatiliaji. Prometheus

Jumla: telegram inafanya kazi, linkedin na pornhub pia, kwa ujumla uzoefu wa mtumiaji ni sawa. Lakini kila kitu kinaweza kuvunja, ikiwa ni pamoja na vifaa vya Kichina.

Masasisho ya Kernel pia yanaweza kuvutia: kwa mfano, nilitaka kusasisha kernel 5.4 => 5.6, vizuri, Wireguard iko nje ya boksi, hakuna haja ya kuweka kiraka... Punde tu kusema: Nilihamisha viraka kutoka 5.4 kwa uchungu sana. hadi 5.6, kernel ilianza, handaki ya VPS ilipiga ping, lakini ndege haiwezi kuunganisha na hitilafu "Hitilafu ya BGP" ... "Nilirudi nyuma kwa hofu" (c) hadi 5.4; Hatua ya 5.6 iliahirishwa katika TODO.

Kwa hivyo, pamoja na kusanikisha router na VPS, niliongeza ufuatiliaji (kwenye x86 Ubuntu 18.04), ambayo imewekwa kwenye mwenyeji tofauti na vifaa vifuatavyo:

  • prometheus, alertmanager, blackbox_exporter - wote katika docker
  • Tahadhari hutumwa kwa chaneli ya telegramu kwa kutumia metalmatze/alertmanager-bot bot - pia katika Docker
  • tor kwa bot, ili bot iweze kuonya hali wakati kuna mtandao, lakini telegraph bado haifanyi kazi, na bot yenyewe haiwezi kuunganishwa.
  • imetumika arifa: NodeVPNTroubles (hakuna ping kwa VPS), BirdVPNTroubles (hakuna kipindi cha Ndege), AntifilterPakuaTroubles (hitilafu ya kupakia anwani za IP zilizozuiwa), SiteTroubles (telegramu iliyoharibika haipatikani)
  • arifa za mfumo, kwa mfano, HostGrowingDiskReadLatency (kadi ya bei nafuu ya SD haisomeki)

Mfano wa ufuatiliaji wa ufungaji:

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

Ugunduzi Kiotomatiki wa Prometheus umesanidiwa katika /etc/prometheus/auto_http folda, mfano wa kuongeza seva pangishi kwa ufuatiliaji (wapangishi hawafuatiliwi kwa chaguo-msingi):

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

CHA KUFANYA: Watoa huduma 2, BPI 2, kutofaulu kwa utumaji wowote

Mbali na kila kitu, nilipanga kuunganishwa na watoa huduma wawili ili mtandao uendelee kufanya kazi, hata kama mtoa huduma mmoja alikuwa na matatizo na mtandao, au alisahau kulipa mtandao, nk, na mambo mengine ya kibinadamu.

Uzoefu wa juu zaidi wa mtumiaji juu ya mada ya multi-wan imeelezwa hapa kwa mfumo wa Mwan3 chini ya Openwrt. Suluhisho hili lina utendaji mzuri, lakini kusanidi na kuifanya kwa ujumla kwa wan nyingi ni shida sana. Mfano mmoja tu: ukifika kwenye baadhi ya tovuti kutoka kwa anwani mbili za IP mara moja, huenda wasipende, wataacha kufanya kazi => "Mtandao haufanyi kazi."

Kwa kuzingatia uzoefu huu, niliamua kuwa multihoming sio kipaumbele bado, ni kushindwa tu. Ingawa, inaonekana kwamba katika matoleo ya hivi karibuni ya Linux kila kitu kinapaswa kufanya kazi na amri moja kama:

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

Kwa hiyo, ili kuepuka hatua moja ya kushindwa, tunachukua BPIs 2, kuunganisha kila mmoja kwa mtoa huduma mmoja, kuunganisha kwa kila mmoja na kufanya uunganisho kwa kila mmoja kwa njia ya nguvu kupitia ndege / OSPF.

Ifuatayo, tunatangaza anwani sawa ya IP kwa kila mmoja ikiwa huduma inapatikana (Mtandao, DNS). Hiyo ni, hatutaweka njia ya msingi sisi wenyewe, lakini kupitia ndege. Niligundua suluhisho hapa .

Utendaji huu bado haujatekelezwa, coronavirus ya hila ilifanya ujanja hapa (sio kila kitu kilifika kutoka kwa Aliexpress; duka lingine la mtandaoni, Layta, aliahidi kuwasilisha baada ya wiki, lakini zaidi ya mwezi mmoja umepita; mtoaji wa pili hakuwa na wakati. kupanua kebo kabla ya kuwekwa karantini, iliweza tu kupata shimo kwenye ukuta kwa kebo).

Jinsi ya kuagiza R64

Bodi yenyewe iko kwenye duka rasmi SinoVoip.
Pia ni bora kuagiza mara moja:

  • lishe + julisha kiwango cha plug cha EU au Marekani
  • kuzama kwa joto: radiators / mashabiki; kwa sababu CPU na chip ya kubadili inawaka moto
  • antena ya wifi, kwa mfano

Kuna nuance - bei ya utoaji imekuwa juu ya kutosha katika duka rasmi kwa muda. Meneja Judy Huang alinishawishi kuwa hakukuwa na makosa, na unaweza kuchagua ePacket kwa $5, lakini niliona kuwa kwa Urusi kuna EMS kwa >$33 pekee. Haifurahishi, lakini sio muhimu. Zaidi ya hayo, ukichagua nchi nyingine yoyote kwa uwasilishaji (nilipitia mabara yote), uwasilishaji utagharimu ~$5. Russophobes?.. Lakini basi niligundua kuwa kwa Ufaransa bei ya utoaji pia ni ~ 30$, na nikatulia.

Kama matokeo, Judy alijitolea kutoa agizo, lakini sio kulipa (maoni: kuweka chini kwenye kadi ili malipo ya moja kwa moja yasipite); mwandikie na atapunguza bei ya kujifungua kuwa ya kawaida. Mafanikio.

Masuala

Sio kila kitu kinafanya kazi kikamilifu bado.

Uzalishaji

Ansible=Amri za Python hutekelezwa polepole, hata zile zisizo na kazi, kwa sekunde 20-30; mpangilio wa ukubwa mrefu kuliko kwenye kompyuta ya mkononi ya x86. Zaidi ya hayo, mwanzoni hutekelezwa haraka sana, ~ sekunde 3, kisha hupungua kwa kasi. Hii inaweza kuwa ni kwa sababu ya joto la CPU (kupunguza kasi). Nambari ya Go pia inachukua muda mrefu kufanya kazi:

# запрос ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊ для промСтСя ΠΈΠ· 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 inafanya kazi, lakini kwa Armbian inasimama baada ya siku moja, anaandika:

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

Kuanzisha upya tu husaidia. Tunahitaji kuendelea panga.

Ethernet

Ethernet inafanya kazi, lakini baada ya ~ masaa 64 pakiti (DHCP) kutoka RXNUMX huacha kuwasili.
Kuanzisha upya kiolesura husaidia:

ifdown br0; sleep 30; ifup br0

Dereva ni mpya, bado hajakubaliwa kwenye kokwa, natumai ni Landen Chao ya Wachina. huimaliza.

Chanzo: mapenzi.com

Kuongeza maoni