Маршрутызатар Banana Pi R64 - Debian, Wireguard, РКН
Banana Pi 64 – гэта аднаплатны кампутар па тыпе Raspberry Pi, але з некалькімі партамі Ethernet, што дае магчымасць зрабіць з яго маршрутызатар на базе дыстрыбутыва Linuх агульнага прызначэння.
Так, ужо ёсць Openwrt, але ў яго свае замарочкі свой GUI і CLI; ёсць Mikrotik, але ў яго ізноў жа свой GUI/CLI, ды і Wireguard са скрынкі не працуе… Увогуле жадаецца маршрутызатар з гнуткімі наладамі, пры гэтым застаўшыся ў рамках стандартнага лінукса, з якім працуеш кожны дзень.
У артыкуле пад назвамі BPI, R64, аднаплатнік я буду разумець адно і тое ж – уласна сам аднаплатнік Banana Pi R64.
Выбар выявы. Загрузка па eMMC
Самы першы навык, які трэба набыць пры працы з SBC наогул, і з R64 у прыватнасці, гэта навучыцца грузіць у яго аперацыёнку і мець магчымасць узаемадзейнічаць з ім, бо ў R64 няма порта для манітора (HDMI, напрыклад). Калі ўсё адвалілася – перастаў працаваць Wifi, сетка Ethernet, Bluetooth, USB і іншае ёсць UART, праз інтэрфейс якога заўсёды можна паглядзець, што пайшло не так, а таксама запусціць пару каманд з кансолі, па неабходнасці.
Алгарытм падлучэння да R64 па USB-UART:
бяжым у краму радыёдэталяў за кабелем USB-UART (PL2303, Serial-to-USB)
падлучальны адзін USB-канец да кампутара, а іншы, UART,- да R64, трыма правадамі з чатырох, як на малюнку ніжэй
у кансолі кампутара запускаем sudo minicom
Пасля гэтага ў большасці выпадкаў з'явіцца кансоль аднаплатніка = поспех.
Падрабязней можна паглядзець тут.
Далей, прасцей за ўсё загрузіць аперацыйную сістэму з SD-карты: спампоўваем па спасылцы вобраз і заліваем яго:
устаўляемы карту ў SD-слот R64, уключаем, назіраем па падлучанай кансолі загрузку спачатку uboot, затым стандартную загрузку лінукса.
Альтэрнатыўны варыянт загрузкі – з дапамогай ужо зашытай ў R64 карты памерам 8Gb, званай eMMC. Па інструкцыі ў вікі перапісваем выяву на прыладу
/dev/mmcblk0 у BPI, перагружаемся, выцягваем SD-карту, уключаем BPI зноў… і не працуе. Як туды-сюды Boot select ні тузай.
Справа ў тым, што як мінімум для BPI неабходна паставіць спецыяльны сцяг, каб мець магчымасць грузіцца з унутранай флэшкі:
Вытворца R64 (Кітай) выклаў гэты бінар тут. Што ён робіць невядома (зыходнікаў няма), але без яго таксама не заробіць.
Увогуле-то пасля гэтага выявы пачынаюць грузіцца і з eMMC. Калі ж захацець разабрацца і ствараць выявы з нуля, то для абодвух выпадкаў (SD/eMMC) трэба запісваць яшчэ некалькі файлаў (preloader для SD-карты, ATF, u-boot), толькі каб дабрацца да загрузкі ядра. Тэма гэтая да гэтага часу развіваецца, Але для нас галоўнае, што працуе і добра.
Цяпер я загрузку па eMMC, шчыра кажучы, не выкарыстоўваю, SD карты дастаткова, але я даволі шмат часу выдаткаваў на тое, каб яно зарабіла, таму хай будзе ў артыкуле.
Выбар аперацыёнкі. Armbian
Першая прыкладная задача – запусціць VPN, натуральна Wireguard. Адразу ж выявілася, што з боку ядра ён не сабраны, і загалоўкаў няма. Перасабраў ядро і, па звычцы з x86, сабраў модуль ядра з дапамогай DKMS. Аднак хуткасць зборкі на arm64 нават невялікіх утыліт мяне непрыемна здзівіла. А далей яшчэ адзін модуль ядра запатрабаваўся, і т.д. Увогуле, выходзіць, што ўсё, злучанае з ядром, лепш збіраць на цёплым-лямпавым наўтбуку x86, затым простым капіяваннем пераносіць на R64, перагружацца і тэставаць.
Іншая справа - юзейспейсная частка. У маім выпадку выбару Debian, усё для архітэктуры arm64 ужо ёсць на packages.debian.org і нічога перазбіраць не даводзіцца.
Каб не пладзіць чарговы ровар, я партаваўАрмбіян на BPI R64.
Дакладней так: userspace-ная частка - Armbian, а ядро бярэцца з рэпазітара Фрэнк-а. Самы свежы вобраз можна спампаваць тут.
Уся актыўнасць па распрацоўцы софтавай часткі R64 вядзецца на форуме. Наогул кажучы, сам вытворца імкнецца папулярызаваць роўтар пад Openwrt, але дзякуючы актыўнасці распрацоўніка Frank-а з Нямеччыны ўсе фічы хутка апыняюцца ў ядры для Debian-а. Дзіўна, але Frank актыўны ў кожнай галінцы форума.
Арганізацыя працоўнай прасторы: правады
Асобна жадаю распавесці, як падчас распрацоўкі/тэставанні размясціць SBC (не толькі BPI) на стале так, каб не весці Ethernet-кабель да яго ад крыніцы інтэрнэту праз увесь пакой/офіс. Справа ў тым, што з аднаго боку трэба забяспечыць жалязякі інтэрнэт, а з іншага боку ў гэтай самай жалязякі можа ўсё ламацца, і ў першую чаргу Wifi.
Спачатку я вырашыў набыць танны USB-Wifi "свісток", уторкнуць яго ў адзіны порт на BPI і забыцца аб правадах. Для гэтага набыў недарагі TP-LINK TL-WN725N USB 2.0, але вельмі хутка стала зразумела, што не ўзляціць: для працы свістка патрэбен драйвер ядра, якога там, натуральна, не было (пазней я сабраў патрэбны драйвер RTL8XXXU, але ўсё роўна гэта непрактычна ). І Ethernet-кабель псаваў выгляд пакоя некаторы час.
У выніку ад кабеля мне атрымалася пазбавіцца з дапамога Tenda MW3 (Wifi mesh-сістэма): проста размясціў адзін кубік пад сталом і метровым Ethernet-кабелем падлучыў BPI да LAN-порту апошняга. Поспех.
Wireguard, РКН, Bird
Адна з жадалек, для чаго я выкарыстоўваю Banana PI – мець вольны доступ на сайты, заблакаваныя РКН, у прыватнасці, каб працаваў Telegram і званкі ў Slack-е. На гэтую тэму ўжо былі прапанаваны артыкулы на Хабры: раз, два, 3.
Разгортванне менавіта такога рашэння я рэалізаваў з дапамогай Ansible: спасылка.
Мяркуецца, што VPS працуе пад Ubuntu 18.04/XNUMX. Працаздольнасць праверыў на двух хосцерах ў Еўропе: 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
Далей трэба аналагічнай выявай задэплоіць на VPS наш VPN:
ansible-playbook ./router.py -l current-vpn
Тут аргумент заўсёды current-vpn, а ўласна імя VPS наладжваецца ў зменнай (у дадзеным выпадку гэта paris-vpn-aws-t2-micro-1):
with mapping:
append("name", "start bird")
with mapping("systemd"):
append("name", "bird")
append("state", "started")
append("enabled", "yes")
Запіс каманд Ansible кодам на Python дазваляе паўторна выкарыстоўваць код, ды і наогул адчыненыя ўсе магчымасці мовы агульнага прызначэння. Напрыклад, усталёўка bird на R64 і VPS:
Разам: тэлеграмчык працуе, linkedin і pornhub таксама, увогуле user experience – ок. Але ўсё можа ламацца, і кітайскія жалязякі таксама.
Абнаўленні ядра таксама бываюць цікавымі: напрыклад, я захацеў абнавіць ядро 5.4 => 5.6, нуачо, тамака жа Wireguard з скрынкі, не трэба патчыць… Сказана-зроблена: карпатліва пераносіў патчы з 5.4 на 5.6, ядро завялося, тунэль да тунэля да не можа злучыцца з памылкай "BGP Error"… "У жаху адкаціўся назад" (з) на 5.4; пераезд на 5.6 адклаў у TODO.
Таму ў дадатак да ўсталёўкі роўтара і VPS дадаў маніторынг (на x86 Ubuntu 18.04/XNUMX), які ставіцца на асобны хост з наступнымі кампанентамі:
prometheus, alertmanager, blackbox_exporter - усё ў докеры
алерты накіроўваюцца ў тэлеграм-канал з дапамогай робата metalmatze/alertmanager-bot — таксама ў докеры
tor для бота, каб бот мог алерціць сітуацыі, калі інтэрнэт ёсць, але тэлеграм усё роўна не працуе, і сам бот не можа злучыцца
прыкладныя алерты: NodeVPNTroubles (няма ping-а да VPS), BirdVPNTroubles (няма сесіі Bird), AntifilterDownloadTroubles (памылка загрузкі заблакаваных IP-адрасоў), SiteTroubles (недаступны злапомны тэлеграм)
сістэмныя алерты, напрыклад, HostGrowingDiskReadLatency (танная SD-карта перастае чытацца)
У дадатку да ўсяго запланаваў падключыцца да двух правайдэрам, каб інтэрнэт працягнуў працаваць, нават калі ў аднаго правайдэра праблемы з сеткай, ці забыліся заплаціць за інтэрнэт і г.д., і іншы чалавечы фактар.
Найбольш прасунуты user experience на тэму multi-wan апісаны тут для сістэмы Mwan3 пад Openwrt. У дадзенага рашэння багаты функцыянал, але налада і эксплуатацыя наогул для multi-wan даволі клапотная. Адзін толькі прыклад: калі прыходзіць на некаторыя сайты адразу з двух IP-адрасоў, то ім гэта можа не спадабаецца, яны перастануць працаваць => "інтэрнэт не працуе".
Улічваючы гэты досвед вырашыў, што multihoming пакуль не ў прыярытэце, толькі failover. Хоць, здаецца, у апошніх версіях 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). Гэта значыць прастаўляць маршрут па змаўчанні будзем не самі, а з дапамогай bird. Рашэнне падгледзеў тут .
Дадзены функцыянал пакуль не рэалізаваў, падступны каранавірус і тут падгадзіў (не ўсё прыехала c аліэкспрэс; яшчэ адзін інтэрнэт-крама, Layta, абяцаў даставіць за тыдзень, а ўжо больш за месяц прайшло; другі правайдэр не паспеў кабель працягнуць да каранціну, паспеў толькі дзірку ў сцяне прасвідраваць для кабеля).
Як замовіць R64
Сама плата ў афіцыйнай краме SinoVoip.
Таксама лепш адразу замовіць:
харчаванне + паведаміць стандарт штэкера ЕС ці ЗША
цеплаадвод: радыятары/вентылятары; таму што і CPU грэецца, і чып switch-а
Ёсць нюанс — кошт дастаўкі з нейкага часу стаў неадэкватна высокім у афіцыйнай краме. Мэнэджар Judy Huang пераконвала мяне, што памылкі няма, і можна абраць ePacket за $5, але я бачыў, што для Расіі ёсць толькі EMS за >33$. Непрыемна, але не крытычна. Прычым, калі абраць любую іншую краіну для дастаўкі (перабраў усе кантыненты), дастаўка будзе за ~5$. Русафобы?.. Але потым я знайшоў, што для Францыі кошт дастаўкі таксама ~30$, і супакоіўся.
У выніку Judy прапанавала зрабіць замову, але не аплачваць (намякаць: пакласці на карту менш, каб аўтаматычна аплата не прайшла); напісаць ёй, і яна знізіць цану дастаўкі да нармальнай. Поспех.
Пытанні
Не ўсё пакуль працуе ідэальна.
Proizvoditelnost
Павольна выконваюцца каманды Ansible=Python, нават халастыя, па 20-30 секунд; на парадак даўжэй, чым на ноўце x86. Прычым спачатку выконваюцца дастаткова хутка, ~3 секунды, затым рэзка запавольваюцца. Магчыма гэта адбываецца з-за які награваецца CPU (throttling). Код на 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
Wi-Fi
Wifi працуе, але на Armbian недзе праз суткі перастае, піша: