Banana Pi R64 маршрутизаторы - Debian, Wireguard, RKN

Banana Pi 64 - Raspberry Pi-ге ұқсас, бірақ бірнеше Ethernet порттары бар бір тақталы компьютер, бұл оны жалпы мақсаттағы Linux дистрибутивіне негізделген маршрутизаторға айналдыруға мүмкіндік береді.

Banana Pi R64 маршрутизаторы - Debian, Wireguard, RKN

Иә, қазірдің өзінде Openwrt бар, бірақ оның өз проблемалары бар, оның GUI және CLI; Микротик бар, бірақ оның тағы да өзінің 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, Serial-to-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 ұяшығына салып, оны қосамыз және қосылған консольдің алдымен жүктелуін, содан кейін стандартты Linux жүктелуін бақылаймыз.

Балама жүктеу опциясы eMMC деп аталатын R64 ішіне орнатылған 8 Гб картасын пайдалану болып табылады. Викидегі нұсқауларға сәйкес суретті құрылғыға көшіреміз
/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]

Содан кейін арнайы жүктеу бөліміне алдын ала жүктеуші жазу керек

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-жүктеу) жазу керек. Бұл тақырып әлі дамиды, бірақ біз үшін бастысы - бұл жұмыс істейді және жақсы.

Қазір мен eMMC арқылы жүктеп аламын, шынымды айтсам, оны қолданбаймын, SD картасы жеткілікті, бірақ мен оны жұмысқа алу үшін көп уақыт жұмсадым, сондықтан ол мақалада болсын.

Операциялық жүйені таңдау. Армиялық

Қолданбаның бірінші міндеті - VPN, әрине, Wireguard іске қосу. Ядро жағында оның жинақталмағаны және тақырыптары жоқ екені бірден анықталды. Мен ядроны қайта құрдым және x86-дағы әдетім бойынша DKMS арқылы ядро ​​модулін жинадым. Дегенмен, arm64-те тіпті шағын коммуникацияларды салу жылдамдығы мені жағымсыз таң қалдырды. Содан кейін басқа ядро ​​модулі қажет болды, т.б. Жалпы, ядроға қатысты барлық нәрсе жылы x86 ноутбугында жақсы жиналады, содан кейін қарапайым көшіру, қайта жүктеу және сынақтан өткізу арқылы R64-ке ауыстырылады.

Тағы бір нәрсе - пайдаланушы кеңістігі бөлігі. Менің Debian таңдаған жағдайда, arm64 архитектурасына арналған барлығы packages.debian.org сайтында бар және ештеңені қайта құрудың қажеті жоқ.

Басқа велосипед шығармас үшін, И тасымалданды Армян BPI R64 бойынша.
Дәлірек айтқанда, бұл: пайдаланушы кеңістігі бөлігі - Armbian, ал ядро ​​репозиторийден алынған ашық-А. Соңғы суретті жүктеп алуға болады осында.

R64 бағдарламалық қамтамасыз ету бөлігін әзірлеу бойынша барлық іс-шаралар жүзеге асырылады форум. Жалпы айтқанда, өндірушінің өзі Openwrt үшін маршрутизаторды танымал етуге тырысады, бірақ Германиядан келген Франк әзірлеушісінің белсенділігінің арқасында барлық мүмкіндіктер Debian ядросында тез аяқталады. Бір қызығы, Фрэнк форумның әрбір ағынында белсенді.

Жұмыс кеңістігін ұйымдастыру: сымдар

Сонымен қатар, әзірлеу/тестілеу кезінде бүкіл бөлме/кеңсе бойынша Интернет көзінен оған Ethernet кабелін жібермеу үшін SBC (тек BPI емес) үстелге қалай орналастыру керектігін айтқым келеді. Өйткені, бір жағынан, интернетпен жабдықты қамтамасыз ету керек, бірақ екінші жағынан, бұл жабдықтың барлық бөлігі, ең алдымен Wifi бұзылуы мүмкін.

Біріншіден, мен арзан USB-Wifi «ысқырығын» сатып алуды шештім, оны BPI-дегі жалғыз портқа қосып, сымдарды ұмытып кеттім. Мұны істеу үшін мен қымбат емес TP-LINK TL-WN725N USB 2.0 сатып алдым, бірақ көп ұзамай оның өшпейтіні белгілі болды: ысқырық жұмыс істеуі үшін ядро ​​​​драйвері қажет, ол, әрине, жоқ еді. (кейін мен қажетті RTL8XXXU драйверін жинадым, бірақ бұл әлі де мүмкін емес). Ал Ethernet кабелі бөлменің көркін біраз уақытқа бұзды.

Нәтижесінде мен Tenda MW3 (Wifi тор жүйесі) көмегімен кабельден құтылдым: мен жай ғана бір текшені үстелдің астына қойып, BPI-ді метрлік Ethernet кабелімен соңғысының LAN портына қостым. Жетістік.

Wireguard, RKN, Bird

Banana PI-ді пайдаланғым келетін нәрселердің бірі - RKN бұғаттаған сайттарға, атап айтқанда, Telegram және Slack қоңыраулары жұмыс істей алатындай етіп тегін кіру. Осы тақырып бойынша Хабре туралы мақалалар ұсынылған: рет, два, үш.

Мен Ansible көмегімен дәл осы шешімді қолдандым: байланыс.

VPS Ubuntu 18.04 нұсқасымен жұмыс істейді деп болжанады. Мен Еуропадағы екі хосттердің функционалдығын тексердім: Amazon және Digital Ocean.

Сонымен, біз R64-ке жоғарыдағы Armbian орнаттық, ол атаумен 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, каталог келесідей болуы керек солай.

Python тілінде Ansible Automation

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-тен патчтарды қатты тапсырдым. 5.6-ға дейін, ядро ​​қосылды, VPS-ке туннель пинг алды, бірақ құс "BGP қатесі" қатесіне қосыла алмайды ... "Мен қорқынышпен оралдым" (c) 5.4; TODO-да 5.6-ға көшу кейінге қалдырылды.

Сондықтан, маршрутизатор мен VPS орнатудан басқа, мен келесі компоненттері бар бөлек хостта орнатылған мониторингті (x86 Ubuntu 18.04 жүйесінде) қостым:

  • prometheus, alertmanager, blackbox_exporter - барлығы докерде
  • Ескертулер telegram арнасына metalmatze/alertmanager-бот боты арқылы жіберіледі - сонымен қатар Docker-те
  • ботқа арналған tor, осылайша бот Интернет болған кезде жағдайларды ескертеді, бірақ телеграмма әлі жұмыс істемейді және боттың өзі қосыла алмайды.
  • қолданылды ескертулер: NodeVPNtroubles (VPS жүйесіне пинг жоқ), BirdVPNtroubles (Құс сеансы жоқ), 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, кез келген тарату ауыстырылуы

Барлығына қоса, мен екі провайдерге қосылуды жоспарладым, тіпті егер бір провайдер желіде ақаулық болса немесе олар Интернетке төлеуді ұмытып кетсе де, Интернет жұмыс істей береді, т.б. және басқа да адами факторлар.

Мульти-ван тақырыбы бойынша ең озық пайдаланушы тәжірибесі сипатталған осында 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 аламыз, әрқайсысын бір провайдерге қосамыз, оларды бір-бірімен байланыстырамыз және құс/OSPF арқылы динамикалық маршруттауды бір-бірімен байланыстырамыз.

Әрі қарай, егер қызмет қолжетімді болса (Интернет, DNS) әрқайсысында бірдей IP мекенжайын жарнамалаймыз. Яғни, әдепкі маршрутты өзіміз емес, құс арқылы орнатамыз. Мен шешімді тыңдадым осында .

Бұл функционалдық әлі іске асырылған жоқ, жасырын коронавирус мұнда трюк ойнады (бәрі Aliexpress-тен келген жоқ; басқа интернет-дүкен, Layta бір аптада жеткіземін деп уәде берді, бірақ бір айдан астам уақыт өтті; екінші провайдердің уақыты болмады. Карантинге дейін кабельді ұзарту үшін, кабельге арналған қабырғаға бұрғылауды ғана алды).

R64 қалай тапсырыс беруге болады

Тақтаның өзі ресми дүкенде SinoVoip.
Сондай-ақ дереу тапсырыс берген дұрыс:

  • тағам + ЕО немесе АҚШ штепсельдік стандартын хабарлаңыз
  • радиатор: радиаторлар/желдеткіштер; себебі процессор да, коммутатор чипі де қызып жатыр
  • Wi-Fi антеннасы, мысалы

Бір нюанс бар - жеткізу бағасы біраз уақыттан бері ресми дүкенде жеткіліксіз жоғары болды. Менеджер Джуди Хуан мені қате жоқ екеніне сендірді және сіз ePacket-ті 5 долларға таңдауға болады, бірақ мен Ресей үшін тек 33 долларға EMS бар екенін көрдім. Жағымсыз, бірақ сыни емес. Сонымен қатар, егер сіз жеткізу үшін кез келген басқа елді таңдасаңыз (мен барлық континенттерді аралап шықтым), жеткізу ~ 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

Драйвер жаңа, ол ядроға әлі қабылданбаған, бұл қытайлық Ланден Чао деп үміттенемін оны аяқтайды.

Ақпарат көзі: www.habr.com

пікір қалдыру