Banana Pi R64 երթուղիչ - Debian, Wireguard, RKN

Banana Pi 64-ը Raspberry Pi-ին նման մեկ տախտակով համակարգիչ է, բայց մի քանի Ethernet պորտերով, ինչը հնարավորություն է տալիս այն վերածել երթուղիչի՝ հիմնված Linux-ի ընդհանուր նշանակության բաշխման վրա:

Banana Pi R64 երթուղիչ - Debian, Wireguard, RKN

Այո, արդեն կա Openwrt, բայց այն ունի իր խնդիրները՝ իր GUI-ն և CLI-ն; Mikrotik-ը կա, բայց նորից իր GUI/CLI-ն ունի, ու Wireguard-ը դուրս չի գալիս... Ընդհանրապես, ես ուզում եմ ճկուն կարգավորումներով երթուղիչ, մինչդեռ մնա ստանդարտ Linux-ի շրջանակում, որը դու ես աշխատում. ամեն օրվա հետ։

BPI, R64, մեկ տախտակ անուններով հոդվածում ես նկատի կունենամ նույն բանը՝ հենց ինքը Banana Pi R64 մեկ տախտակը:

Պատկերի ընտրություն. Ներբեռնեք eMMC-ի միջոցով

Առաջին հմտությունը, որը դուք պետք է ձեռք բերեք հետ աշխատելիս SBC ընդհանուր առմամբ, և մասնավորապես R64-ի դեպքում, դա նշանակում է սովորել, թե ինչպես բեռնել օպերացիոն համակարգը դրա մեջ և կարողանալ շփվել դրա հետ, քանի որ R64-ը չունի մոնիտորի համար պորտ (օրինակ, HDMI): Երբ ամեն ինչ ընկավ՝ Wifi-ը, Ethernet-ը, Bluetooth-ը, USB-ն և այլն, դադարեցին աշխատել: Կա UART, որի ինտերֆեյսի միջոցով դուք միշտ կարող եք տեսնել, թե ինչն է սխալվել, ինչպես նաև, անհրաժեշտության դեպքում, մի քանի հրաման գործարկել վահանակից:

USB-UART-ի միջոցով R64-ին միանալու ալգորիթմ.

  • մենք վազում ենք ռադիոյի մասերի խանութ USB-UART մալուխի համար (PL2303, Սերիական-USB)
  • USB մի ծայրը միացրեք համակարգչին, իսկ մյուսը՝ UART-ը, R64-ին, չորսից երեք լարով, ինչպես ստորև նկարում
  • գործարկել համակարգչային վահանակում sudo minicom

Դրանից հետո շատ դեպքերում կհայտնվի մեկ տախտակի վահանակ = հաջողություն:
Դուք կարող եք տեսնել ավելի մանրամասն այստեղ.

Banana Pi R64 երթուղիչ - Debian, Wireguard, RKN

Հաջորդը, ամենահեշտ ձևը օպերացիոն համակարգը SD քարտից բեռնելն է ՈՒղեցույց պատկերը և լրացրեք այն.

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

Մենք քարտը տեղադրում ենք R64 SD բնիկի մեջ, միացնում ենք այն և դիտում ենք կապակցված վահանակի բեռնումը նախ uboot, ապա ստանդարտ Linux բեռնում:

Բեռնման այլընտրանքային տարբերակն օգտագործում է R64-ում արդեն ներկառուցված 8 Գբ քարտ, որը կոչվում է eMMC: Վիքիում նշված ցուցումների համաձայն՝ պատկերը պատճենում ենք սարքին
/dev/mmcblk0 դեպի BPI, վերագործարկեք, հեռացրեք SD քարտը, նորից միացրեք BPI-ն... և այն չի աշխատում: Ինչպես հետ ու առաջ գնալ Boot select մի անհանգստացեք.

Փաստն այն է, որ առնվազն BPI-ի համար անհրաժեշտ է հատուկ դրոշ դնել, որպեսզի կարողանաք բեռնել ներքին ֆլեշ կրիչից.

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]

Հաջորդը, դուք պետք է գրեք preloader-ը հատուկ boot partition-ում

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

Արտադրող R64-ը (Չինաստան) տեղադրել է այս երկուական տարբերակը այստեղ. Այն, ինչ անում է, անհայտ է (աղբյուրային կոդեր չկան), բայց առանց դրա նույնպես չի աշխատի:

Ընդհանուր առմամբ, սրանից հետո պատկերները սկսում են բեռնվել eMMC-ից։ Եթե ​​ցանկանում եք դա պարզել և զրոյից պատկերներ ստեղծել, ապա երկու դեպքում էլ (SD/eMMC) պետք է գրել ևս մի քանի ֆայլ (նախաբեռնիչ SD քարտի համար, ATF, u-boot), որպեսզի հասնեք միջուկը բեռնելուն: Այս թեման դեռ զարգանում է, բայց մեզ համար գլխավորն այն է, որ այն աշխատում է և լավ է:

Այժմ ես ներբեռնում եմ eMMC-ի միջոցով, ճիշտն ասած, չեմ օգտագործում այն, բավական է SD քարտը, բայց ես բավականին շատ ժամանակ եմ ծախսել, որպեսզի այն աշխատի, այնպես որ թող լինի հոդվածում:

Օպերացիոն համակարգի ընտրություն: Արմբյանը

Ծրագրի առաջին խնդիրն է գործարկել VPN, բնականաբար, Wireguard: Անմիջապես պարզվեց, որ միջուկի կողմից այն հավաքված չէր և վերնագրեր չկան: Ես վերակառուցեցի միջուկը և, ինչպես սովորություն էի x86-ի հետ, հավաքեցի միջուկի մոդուլը՝ օգտագործելով DKMS: Սակայն arm64-ի վրա նույնիսկ փոքր կոմունալ ծառայությունների կառուցման արագությունն ինձ տհաճորեն զարմացրեց։ Եվ հետո պահանջվեց մեկ այլ միջուկի մոդուլ և այլն: Ընդհանուր առմամբ, պարզվում է, որ միջուկի հետ կապված ամեն ինչ լավագույնս հավաքվում է տաք x86 նոութբուքի վրա, այնուհետև տեղափոխվում է R64՝ պարզ պատճենահանման միջոցով, վերագործարկվում և փորձարկվում:

Մեկ այլ բան օգտվողների տարածքի մասն է: Debian-ի ընտրության դեպքում, arm64 ճարտարապետության համար ամեն ինչ արդեն առկա է packages.debian.org-ում և կարիք չկա որևէ բան վերակառուցելու:

Այլ հեծանիվ չարտադրելու համար Ի տեղափոխված Հայբ BPI R64-ի վրա:
Ավելի ճիշտ՝ սա՝ userspace մասը Armbian է, իսկ միջուկը վերցված է պահոցից։ Անկեղծ-Ա. Վերջին պատկերը կարելի է ներբեռնել այստեղ.

R64-ի ծրագրային մասի մշակման ողջ գործունեությունը իրականացվում է ֆորում. Ընդհանուր առմամբ, արտադրողն ինքն է ձգտում հանրահռչակել Openwrt-ի երթուղիչը, սակայն Գերմանիայից Ֆրանկ մշակողի գործունեության շնորհիվ բոլոր հնարավորությունները արագ հայտնվում են Debian-ի միջուկում: Զարմանալիորեն, Ֆրենկն ակտիվ է ֆորումի յուրաքանչյուր թեմայում:

Աշխատանքային տարածքի կազմակերպում` լարեր

Առանձին-առանձին, ես կցանկանայի ձեզ պատմել, թե ինչպես մշակման/փորձարկման ընթացքում սեղանի վրա տեղադրել SBC (ոչ միայն BPI), որպեսզի ինտերնետ աղբյուրից Ethernet մալուխ չանցկացվի ամբողջ սենյակում/գրասենյակում: Փաստն այն է, որ մի կողմից պետք է ինտերնետով ապահովել սարքավորում, բայց մյուս կողմից այդ սարքավորման մեջ ամեն ինչ կարող է փչանալ, և առաջին հերթին Wifi-ը։

Նախ, ես որոշեցի գնել էժան USB-Wifi «սուլիչ», միացնել այն BPI-ի միակ պորտին և մոռանալ լարերի մասին: Դա անելու համար ես գնեցի էժան TP-LINK TL-WN725N USB 2.0, բայց շատ շուտով պարզ դարձավ, որ այն չի հեռանա. սուլիչն աշխատելու համար ձեզ անհրաժեշտ է միջուկի վարորդ, որն, իհարկե, այնտեղ չկար: (հետագայում ես հավաքեցի անհրաժեշտ RTL8XXXU դրայվերը, բայց դա դեռ անիրագործելի է): Իսկ Ethernet մալուխը որոշ ժամանակ փչացրեց սենյակի տեսքը։

Արդյունքում ինձ հաջողվեց ազատվել մալուխից Tenda MW3 (Wifi mesh համակարգ) օգնությամբ. ես պարզապես մեկ խորանարդ դրեցի սեղանի տակ և BPI-ն միացրեցի վերջինիս LAN պորտին մետր երկարությամբ Ethernet մալուխով: Հաջողություն.

Wireguard, RKN, Bird

Բանան PI-ն օգտագործելու բաներից մեկը, մասնավորապես, RKN-ի կողմից արգելափակված կայքերին անվճար մուտք ունենալն է, որպեսզի Telegram-ի և Slack-ի զանգերը կարողանան աշխատել: Habré-ի վերաբերյալ հոդվածներ արդեն առաջարկվել են այս թեմայով. ժամանակ, два, երեք.

Ես տեղադրեցի հենց այս լուծումը՝ օգտագործելով Ansible. ՈՒղեցույց.

Ենթադրվում է, որ VPS-ն աշխատում է Ubuntu 18.04-ով: Ես ստուգեցի Եվրոպայում երկու հոսթերների ֆունկցիոնալությունը՝ Amazon և Digital Ocean:

Այսպիսով, մենք տեղադրեցինք վերը նշված Armbian-ը R64-ի վրա, այն հասանելի է ssh-ի միջոցով անվան տակ hm-bananapi-1 և ունի ինտերնետ հասանելիություն։ Մենք հետևողականորեն տեղադրում ենք Ansible, ավտոմատացման սկրիպտներ և ինքնին տեղադրում ենք 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

Հաջորդը, դուք պետք է նույն կերպ տեղակայեք մեր VPN-ը VPS-ում.

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

Այստեղ արգումենտը միշտ ընթացիկ-vpn է, իսկ իրական VPS անունը կազմաձևված է փոփոխականում (այս դեպքում դա 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

Օհ, այո, այս բոլոր գործողություններից առաջ անհրաժեշտ է թղթապանակում գաղտնիքներ ստեղծել (մասնավորապես, Wireguard ստեղները): ./secrets, գրացուցակը պետք է նման լինի այնքան.

Ansible ավտոմատացում Python-ում

Դուք կարող եք նկատել, որ YAML ձևաչափով լինելու փոխարեն, Ansible հրամանները կոդավորված են Python սկրիպտներում: Համեմատության համար, թե ինչպես կարելի է միացնել թռչնի դեյմոնը սովորական ձևով.

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

և ինչպես անել նույնը Python-ի միջոցով.

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

Python-ում Ansible հրամաններ գրելը թույլ է տալիս նորից օգտագործել կոդը և, ընդհանուր առմամբ, բացում է ընդհանուր նշանակության լեզվի բոլոր հնարավորությունները: Օրինակ, թռչնի տեղադրումը R64-ի և VPS-ի վրա.

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

տես գործառույթի կոդը install_bird ().

Այս հատկությունը կոչվում է pybook իրականացվել է այստեղ. Դեռևս pybook-ի վերաբերյալ փաստաթուղթ չկա, բայց ես ավելի ուշ կուղղեմ այս խնդիրը:

Ինչ է նա մտածում հոսանքն ի վեր այս մասին:

Մոնիտորինգ. Պրոմեթևս

Ընդամենը. Telegram-ը աշխատում է, linkedin-ը և pornhub-ը նույնպես, ընդհանուր առմամբ, օգտագործողի փորձը լավ է: Բայց ամեն ինչ կարող է կոտրվել, ներառյալ չինական ապարատը:

Միջուկի թարմացումները նույնպես կարող են հետաքրքիր լինել. օրինակ, ես ուզում էի թարմացնել միջուկը 5.4 => 5.6, դե, Wireguard-ը դուրս է տուփից, կարկատելու կարիք չկա... Անմիջապես ասացի. մինչև 5.4, միջուկը գործարկվեց, թունելը դեպի VPS ping-ը, բայց թռչունը չի կարող միանալ «BGP Error» սխալի հետ... «Ես սարսափով հետ գլորվեցի» (c) մինչև 5.6; TODO-ում հետաձգվել է 5.4-ի անցումը:

Հետևաբար, բացի երթուղիչի և VPS-ի տեղադրումից, ես ավելացրեցի մոնիտորինգ (x86 Ubuntu 18.04-ում), որը տեղադրված է առանձին հոսթի վրա հետևյալ բաղադրիչներով.

  • prometheus, alertmanager, blackbox_exporter - բոլորը դոկերում
  • Ահազանգերը ուղարկվում են հեռագրային ալիք՝ օգտագործելով metalmatze/alertmanager-bot բոտը, ինչպես նաև Docker-ում:
  • tor bot-ի համար, որպեսզի բոտը կարողանա զգուշացնել իրավիճակների մասին, երբ կա ինտերնետ, բայց telegram-ը դեռ չի աշխատում, և բոտն ինքը չի կարող միանալ
  • դիմել է ահազանգերNodeVPNTroubles (առանց VPS-ի ping), BirdVPNT խնդիրներ (առանց Bird նիստի), AntifilterDownloadTroubles (արգելափակված IP հասցեների բեռնման սխալ), SiteTroubles (չարաբաստիկ հեռագիրն անհասանելի է)
  • համակարգի ծանուցումներ, օրինակ՝ HostGrowingDiskReadLatency (էժան SD քարտը դառնում է անընթեռնելի)

Մոնիտորինգի տեղադրման օրինակ.

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

Prometheus-ի համար Auto Discovery-ը կազմաձևված է /etc/prometheus/auto_http թղթապանակում, մոնիտորինգին հոսթ ավելացնելու օրինակ (հոսթները լռելյայն չեն վերահսկվում).

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 մատակարար, 2 BPI, anycast failover

Ի հավելումն ամեն ինչի, ես նախատեսում էի միանալ երկու պրովայդերների, որպեսզի ինտերնետը շարունակի աշխատել, եթե նույնիսկ մեկ պրովայդերն խնդիրներ ունենա ցանցի հետ, կամ նրանք մոռացել են վճարել ինտերնետի համար և այլն, և այլ մարդկային գործոններ:

Նկարագրված է մուլտի-վան թեմայի վերաբերյալ օգտագործողների առավել առաջադեմ փորձը այստեղ Openwrt-ի ներքո Mwan3 համակարգի համար: Այս լուծումն ունի հարուստ ֆունկցիոնալություն, սակայն այն կարգավորելն ու գործարկելն ընդհանրապես բազմա-վանի համար բավականին անհանգիստ է: Միայն մեկ օրինակ. եթե դուք միանգամից երկու IP հասցեից հայտնվեք որոշ կայքերի վրա, դա նրանց կարող է դուր չգալ, նրանք կդադարեն աշխատել => «Ինտերնետը չի աշխատում»:

Հաշվի առնելով այս փորձը՝ ես որոշեցի, որ բազմաբնակարանային աշխատանքը դեռ առաջնահերթություն չէ, այլ միայն ձախողում: Չնայած, թվում է, որ Linux-ի վերջին տարբերակներում ամեն ինչ պետք է աշխատի մեկ հրամանով, ինչպիսին է.

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

Այսպիսով, մեկ խափանման կետից խուսափելու համար մենք վերցնում ենք 2 BPI, յուրաքանչյուրը միացնում ենք մեկ մատակարարի, միացնում դրանք միմյանց և միմյանց հետ կապը դարձնում դինամիկ երթուղի bird/OSPF-ի միջոցով:

Հաջորդը, մենք գովազդում ենք նույն IP հասցեն յուրաքանչյուրի վրա, եթե ծառայությունը հասանելի է (Ինտերնետ, DNS): Այսինքն՝ մենք ինքներս չենք սահմանելու լռելյայն երթուղին, այլ թռչնի միջով։ Ես նկատեցի լուծումը այստեղ .

Այս ֆունկցիոնալությունը դեռ չի իրականացվել, ստոր կորոնավիրուսն այստեղ խաբել է (ամեն ինչ չէ, որ հասել է Aliexpress-ից. մեկ այլ առցանց խանութ՝ Layta-ն, խոստացել է առաքել մեկ շաբաթից, բայց անցել է ավելի քան մեկ ամիս, երկրորդ մատակարարը ժամանակ չի ունեցել։ մալուխը կարանտինից առաջ երկարացնելու համար, միայն հաջողվեց անցք բացել պատի մեջ մալուխի համար):

Ինչպես պատվիրել R64

Տախտակն ինքնին գտնվում է պաշտոնական խանութում SinoVoip.
Ավելի լավ է նաև անմիջապես պատվիրել.

  • սնունդ + տեղեկացրեք ԵՄ-ի կամ ԱՄՆ-ի վարդակից ստանդարտին
  • ջերմատախտակ՝ ռադիատորներ/օդափոխիչներ; քանի որ և՛ պրոցեսորը, և՛ անջատիչի չիպը տաքանում են
  • ալեհավաք wifi-ի համար, օրինակ

Մի նրբերանգ կա՝ առաքման գինը որոշ ժամանակով դարձել է ոչ ադեկվատ բարձր պաշտոնական խանութում։ Մենեջեր Ջուդի Հուանգը ինձ համոզեց, որ սխալ չկա, և դուք կարող եք ընտրել ePacket-ը $5-ով, բայց ես տեսա, որ Ռուսաստանի համար կա միայն EMS-ը >33 դոլարով: Տհաճ, բայց ոչ քննադատական: Ավելին, եթե առաքման համար ընտրեք որևէ այլ երկիր (ես անցել եմ բոլոր մայրցամաքներով), ապա առաքումը կարժենա ~5$։ Ռուսոֆոբե՞ր.. Բայց հետո գտա, որ Ֆրանսիայի համար էլ առաքման գինը ~30$ է, ու հանգստացա։

Արդյունքում Ջուդին առաջարկեց պատվիրել, բայց չվճարել (ակնարկՔարտի վրա ավելի քիչ դրեք, որպեսզի ավտոմատ վճարումը չանցնի); գրեք նրան, և նա կիջեցնի առաքման գինը նորմալ: Հաջողություն.

Հարցեր

Դեռ ամեն ինչ չէ, որ կատարյալ է աշխատում։

Արտադրողականություն

Ansible=Python հրամանները կատարվում են դանդաղ, նույնիսկ անգործուն, 20-30 վայրկյան; մեծության կարգով ավելի երկար, քան x86 նոութբուքի վրա: Ընդ որում, սկզբում դրանք կատարվում են բավականին արագ՝ ~3 վայրկյան, հետո կտրուկ դանդաղում են։ Դա կարող է պայմանավորված լինել պրոցեսորի տաքացումով (խեղդում): Go կոդը նույնպես երկար ժամանակ է պահանջում աշխատելու համար.

# запрос метрик для прометея из 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-ն աշխատում է, բայց Armbian-ում մոտ մեկ օր հետո դադարում է, գրում է.

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

Միայն վերագործարկումն է օգնում: Պետք է առաջ շարժվել գլուխ հանել.

Ethernet

Ethernet-ն աշխատում է, բայց ~64 ժամ հետո RXNUMX-ից փաթեթները (DHCP) կդադարեն ժամանումը:
Ինտերֆեյսի վերագործարկումն օգնում է.

ifdown br0; sleep 30; ifup br0

Վարորդը նոր է, այն դեռ չի ընդունվել միջուկում, հուսով եմ, որ դա չինական Landen Chao է ավարտում է այն.

Source: www.habr.com

Добавить комментарий