Рутер 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, чрез интерфейса на който винаги можете да видите какво се е объркало и също така да изпълните няколко команди от конзолата, ако е необходимо.

Алгоритъм за свързване към R64 чрез USB-UART:

  • тичаме до магазина за радиочасти за 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 слота, включваме я и наблюдаваме как свързаната конзола зарежда първо uboot, след това стандартно зареждане на Linux.

Алтернативна опция за зареждане е използването на 64Gb карта, която вече е вградена в R8, наречена eMMC. Според инструкциите в wiki копираме изображението на устройството
/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-boot), само за да стигнете до зареждането на ядрото. Тази тема е все още се развива, но за нас най-важното е да работи и да е наред.

Сега изтеглям през eMMC, честно казано, не го използвам, SD карта е достатъчна, но прекарах доста време, за да го накарам да работи, така че нека бъде в статията.

Избор на операционна система. армбиец

Първата задача на приложението е да стартира VPN, естествено Wireguard. Веднага беше открито, че от страна на ядрото не е сглобено и няма хедъри. Създадох отново ядрото и, както е моят навик с x86, сглобих модула на ядрото с помощта на DKMS. Скоростта на изграждане дори на малки комунални услуги на arm64 обаче ме изненада неприятно. И тогава беше необходим друг модул на ядрото и т.н. Като цяло се оказва, че всичко, свързано с ядрото, се сглобява най-добре на топъл x86 лаптоп, след което се прехвърля на R64 чрез просто копиране, рестартира се и се тества.

Друго нещо е частта с потребителското пространство. В моя случай на избор на Debian, всичко за arm64 архитектурата вече е на packages.debian.org и няма нужда да престроявам нищо.

За да не произвеждам друг велосипед, аз пренесен Армбийски на BPI R64.
Или по-скоро това: частта от потребителското пространство е 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

Едно от нещата, за които искам да използвам Banana 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

Тук аргументът винаги е 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 Automation в 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")

Писането на Ansible команди в Python ви позволява да използвате повторно кода и като цяло отваря всички възможности на езика с общо предназначение. Например инсталиране на bird на 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 Error" ... "Върнах се с ужас" (c) до 5.4; Преминаването към 5.6 беше отложено в TODO.

Ето защо, в допълнение към инсталирането на рутера и VPS, добавих мониторинг (на x86 Ubuntu 18.04), който е инсталиран на отделен хост със следните компоненти:

  • prometheus, alertmanager, blackbox_exporter - всички в докер
  • Сигналите се изпращат до телеграмния канал с помощта на бота metalmatze/alertmanager-bot - също в Docker
  • tor за бота, така че ботът да може да предупреждава за ситуации, когато има интернет, но телеграмата все още не работи и самият бот не може да се свърже
  • прилаган сигнали: NodeVPNTroubles (няма ping към VPS), BirdVPNTroubles (няма Bird сесия), AntifilterDownloadTroubles (грешка при зареждане на блокирани IP адреси), SiteTroubles (злополучната телеграма не е достъпна)
  • системни предупреждения, например HostGrowingDiskReadLatency (евтината SD карта става нечетлива)

Пример за инсталиране на мониторинг:

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

Автоматичното откриване за Prometheus е конфигурирано в папката /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

ЗАДАЧИ: 2 доставчика, 2 BPI, преход към произволен отказ

В допълнение към всичко планирах да се свържа с два доставчика, така че интернет да продължи да работи, дори ако един доставчик има проблеми с мрежата или е забравил да плати за интернет и т.н., както и други човешки фактори.

Описано е най-напредналото потребителско изживяване по темата за 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. Видях решението тук .

Тази функционалност все още не е внедрена, тук коварният коронавирус изигра номер (не всичко пристигна от Aliexpress; друг онлайн магазин, Layta, обеща да достави след седмица, но измина повече от месец; вторият доставчик нямаше време за удължаване на кабела преди карантина, успях само да пробия дупка в стената за кабела).

Как да поръчам R64

Самата платка е в официалния магазин SinoVoip.
Също така е по-добре да поръчате веднага:

  • хранене + информирайте стандарта за щепсел на ЕС или САЩ
  • радиатор: радиатори/вентилатори; тъй като и процесорът, и чипът на превключвателя се нагряват
  • wifi антена, например

Има нюанс - цената за доставка е станала неадекватно висока в официалния магазин от известно време. Мениджърът Judy Huang ме убеди, че няма грешка и можете да изберете 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 часа пакетите (DHCP) от RXNUMX спират да пристигат.
Рестартирането на интерфейса помага:

ifdown br0; sleep 30; ifup br0

Драйверът е нов, все още не е приет в ядрото, надявам се да е китайски Landen Chao завършва го.

Източник: www.habr.com

Добавяне на нов коментар