Маршрутызатар Banana Pi R64 - Debian, Wireguard, РКН

Banana Pi 64 – гэта аднаплатны кампутар па тыпе Raspberry Pi, але з некалькімі партамі Ethernet, што дае магчымасць зрабіць з яго маршрутызатар на базе дыстрыбутыва Linuх агульнага прызначэння.

Маршрутызатар Banana Pi R64 - Debian, Wireguard, РКН

Так, ужо ёсць 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

Пасля гэтага ў большасці выпадкаў з'явіцца кансоль аднаплатніка = поспех.
Падрабязней можна паглядзець тут.

Маршрутызатар Banana Pi R64 - Debian, Wireguard, РКН

Далей, прасцей за ўсё загрузіць аперацыйную сістэму з 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

устаўляемы карту ў SD-слот R64, уключаем, назіраем па падлучанай кансолі загрузку спачатку uboot, затым стандартную загрузку лінукса.

Альтэрнатыўны варыянт загрузкі – з дапамогай ужо зашытай ў R64 карты памерам 8Gb, званай 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]

Далей, у спецыяльны boot-вы раздзел трэба запісаць preloader

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) трэба запісваць яшчэ некалькі файлаў (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):

$ 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. Для параўнання, як звычайным спосабам уключыць дэман bird:

- 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")

Запіс каманд Ansible кодам на Python дазваляе паўторна выкарыстоўваць код, ды і наогул адчыненыя ўсе магчымасці мовы агульнага прызначэння. Напрыклад, усталёўка bird на R64 і VPS:

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

паглядзець код функцыі install_bird().

Дадзеная фіча пад назвай pybook рэалізавана тут. Дакументацыі па pybook пакуль няма, потым выпраўлю гэты недахоп.

Што думае уверх па плыні з гэтай нагоды.

Маніторынг. Prometheus

Разам: тэлеграмчык працуе, 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-карта перастае чытацца)

Прыклад усталёўкі маніторынгу:

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

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

У дадатку да ўсяго запланаваў падключыцца да двух правайдэрам, каб інтэрнэт працягнуў працаваць, нават калі ў аднаго правайдэра праблемы з сеткай, ці забыліся заплаціць за інтэрнэт і г.д., і іншы чалавечы фактар.

Найбольш прасунуты 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-а
  • антэну для wifi, напрыклад

Ёсць нюанс — кошт дастаўкі з нейкага часу стаў неадэкватна высокім у афіцыйнай краме. Мэнэджар 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 недзе праз суткі перастае, піша:

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 працуе, але праз ~суткі пакеты (DHCP) ад R64 перастаюць прыходзіць.
Дапамагае рэстарт інтэрфейсу:

ifdown br0; sleep 30; ifup br0

Драйвер новы, у ядро ​​яшчэ не прынялі, спадзяюся кітаец Landen Chao дапілуе.

Крыніца: habr.com

Дадаць каментар