October 21

Обновляем Ubiquiti UniFi Dream Machine через CLI. В 2024-м. Из России. С любовью.

Содержание

Дерзкое вступление

Каждый российский Ubiquiti-кид знает, что современный Ubiquiti штатно и богоугодно обновляется только через web-интерфейс, причем только в однокнопочном режиме («Обновись!»), не предполагающем даже подсовывание файла прошивки, а взаимодействуя исключительно с официальным сайтом. И для пользователей из РФ это проблема, потому что по состоянию на осень 2024 года, сайт Ubiquiti банит российские IP. Боль? Боль.

Автору же довелось испытать ее в тройном размере, потому что обновлять пришлось UniFi Dream Machine с очень старой прошивкой — 1.11.4 — на борту. Об этом и будет этот мини-рассказ, который заодно будет содержать в себе парочку важных ключевых вхождений с ошибками, по которым автор безуспешно тыкался по гуглам, пока в итоге не задебажил все сам.

Первые робкие шаги и решение ошибки "SSL certificate problem"

В первом абзаце мы уже выяснили, что обновиться штатно из РФ нельзя, а значит нам придется провалиться в недра CLI. Автор наивно решил, что обойдется малой кровью: скачает свежую прошивку (на момент написания сей заметки — 4.0.21), натравит девайс на нее и получит обновленное ПО. Спойлер: он ошибался…

Но пока мы об этом ничего не знаем и решаем первый квест: как скачать и загрузить прошивку на девайс?

С ответом на первую часть - как скачать - все более-менее понятно: используем VPN. А вот загрузить на девайс - уже несколько сложнее. В некоем "раньше" мы использовали протокол SCP. С Dream Machine такое не проканало - она не хочет принимать SCP-подключения. А значит нам остаются wget или curl, которые, в свою очередь, тянут за собой необходимость выложить файлы прошивок на web-сервер. Для рядовых пользователей в этих целях можно предложить использовать что-то вроде TinyWeb Server от Ritlabs, но автор пошел путем самурая, решив выложить прошивки на наш сайт - treolink.ru. Который падла подписан SSL-сертификатом и принимает только https-подключения. А значит wget нам уже не подходит. Но у нас ведь есть curl?...

Итак, наша UDM базово запущена, живет на адресе 192.168.1.1, на ней включена галочка, разрешающая SSH-подключения. Прошивка скачана и выложена на сайт treolink.ru под именем fwupdate.bin. Начинаем парад.

Подключаемся к UDM через SSH:

ssh [email protected]

Загружаем прошивку на устройство:

curl -k -o /mnt/data/fwupdate.bin https://treolink.ru/fwupdate.bin

ключ -k игнорирует проверку SSL-сертификата сервера, который на сайтах в .ru-зоне вряд ли будет пройдена, выдавая ошибку:

curl: (60) SSL certificate problem: self signed certificate in certificate chain
More details here: https://curl.haxx.se/docs/sslcerts.html

curl failed to verify the legitimacy of the server and therefore could not
establish a secure connection to it. To learn more about this situation and
how to fix it, please visit the web page mentioned above.

(и как это обойти, стало понятно далеко не сразу)

Путь /mnt/data должен существовать на устройстве. Если версия вашего системного ПО UDM уже перевалила за 2.х, то сразу загружайте файлы в /home.

Успешный успех в выполнении команды будет выглядеть примерно следующим образом:

% Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed
100 583M 100 583M 0 0 10.7M 0 0:00:53 0:00:53 --:--:— 11.1M

Теперь попробуем установить новую прошивку на устройство командой:

ubnt-upgrade /mnt/data/fwupdate.bin

И эпично отлетаем с ошибкой:

ubnt-upgrade: [info] Getting FW file from /mnt/data/fwupdate.bin
Firmware file: '/tmp/upgrade-workspace/upgrade.bin'
Debbox firmware found!
ubnt-upgrade: [info] Upgrading ...
Firmware file: '/tmp/upgrade-workspace/upgrade.bin'
Debbox firmware found!
ubnt-upgrade: [error] No uImage (#2)

Решаем ошибку ubnt-upgrade: [error] No uImage (#2)

Гугл настолько ничего не знает про эту ошибку, что даже пытается вас уговорить изменить запрос на "No Image", предполагая, что буква 'u' - это опечатка.

Пройдя путь поисков и страданий, автор выяснил, что обновляться с 1.11 сразу на 4.х Ubiquiti не хочет, и ошибка связана именно с тем, что мы пытаемся совершить фазовый переход через несколько версий ПО сразу на актуальное. Так не получится. Обновляться придется последовательно.

Методом проб и ошибок, был найден путь обновлений, который выглядит, мягко говоря, не самым очевидным образом:

  • 1.11.4 обновляем до 1.12.33
  • 1.12.33 обновляем до 1.12.38
  • 1.12.38 обновляем до 2.5.17
  • 2.5.17 обновляем до 3.1.15
  • и уже 3.1.15 - на 4.0.21

Скачиваем и выкладываем на web-сервер 1.12.33 и загружаем ее на устройство:

curl -k -o /mnt/data/udm-1.12.33.bin https://treolink.ru/udm-1.12.33.bin

Запускаем установку:

ubnt-upgrade /mnt/data/udm-1.12.33.bin

Успешный успех проявит себя таким образом:

ubnt-upgrade: [info] Getting FW file from /mnt/data/udm-1.12.38.bin
Firmware file: '/tmp/upgrade-workspace/upgrade.bin'
ubnt-upgrade: [info] Upgrading ...
Firmware file: '/tmp/upgrade-workspace/upgrade.bin'
Connection to 192.168.1.1 closed by remote host.
Connection to 192.168.1.1 closed.

Устройство перезагрузится, после чего надо будет зайти в его настройки и снова включить разрешение на SSH-подключения.

Точно таким же образом обновляемся на 1.12.38, а потом на 2.5.17 (не забываем каждый раз разрешать SSH в веб-интерфейсе UDM; да, он каждый раз сбрасывается).

Переезжаем в синтаксис CLI 2.x

Переехав на 2.5.17, у нас с вами поменяется синтаксис в CLI (а у автора подспудно закэшировались fingerprint'ы RSA-ключа на хосте, и пришлось выполнить команду ssh-keygen -R 192.168.1.1, потому что SSH не давал подключаться к устройству). Также пропадет папка /mnt/data, поэтому скачивать следующую прошивку будем уже в /home:

curl -k -o /home/udm-3.1.15.bin https://treolink.ru/udm-3.1.15.bin

И обновление мы теперь тоже будем выполнять по-новому:

ubnt-systool fwupdate /home/udm-3.1.15.bin

Успешный успех будет выглядеть так:

root@UDM:/# ubnt-systool fwupdate /home/udm-3.1.15.bin
16328
Firmware: UDM.al324.v3.1.15.b8f4d08.230721.2147
INFO[0004] Firmware upgrade start
INFO[0004] Invoke hooks under /usr/lib/ubnt/hooks/system/upgrade-top
INFO[0007] Update by updater top path=[/tmp/fw-updater]
INFO[0020] Upgrade uboot path=[/var/cache/fwupdate/upgrade.uboot]
INFO[0041] Upgrade kernel path=[/var/cache/fwupdate/upgrade.kernel]
INFO[0042] Upgrade rootfs path=[/var/cache/fwupdate/upgrade.rootfs]
INFO[0063] Update by updater bottom path=[/tmp/fw-updater]
INFO[0064] Invoke hooks under /usr/lib/ubnt/hooks/system/upgrade-bottom
INFO[0064] Firmware upgrade end
Firmware ready - rebooting to update...

Ну и финальный аккорд - точно также обновляемся на 4.0.21. После последней перезагрузки чекаем результат командой info:

Model: UniFi Dream Machine
Version: 4.0.21.16991
MAC Address: 70:a7:41:72....
IP Address: 192.168....
Hostname: UDM
Uptime: 709 seconds
NTP: Synchronized
Status: Connected (http://127.0.0.1:8080/inform)

Победа.

А можно ли было всего этого избежать?

А можно было. На будущее автор позапридумал держать под рукой роутер Mikrotik с настроенным VPN куда-нибудь в Европы, чтобы выпускать все эти Ubiquiti в свет строго через зарубежные IP. Но и тут обнаружился нюанс: устройства с прошивками 2-летней давности хоть убей не соглашаются обновляться через web. А через интерфейс командной строки все затруднения и ошибки вылетают также неизбежно, кроме, разве что, ошибки SSL-сертификата, потому что девайс можно сразу же травить на официальный сайт.

В целом же процесс обновления Ubiquiti сейчас - не самый простой, приятный и тривиальный. "Лишний повод не связываться," - подумал про себя автор.

P.S. Прошивки живут тут: https://ui.com/download/releases/firmware