
Запустить «чистую» 5G дома вполне возможно. Команда дирекции по исследованиям и разработкам СберМобайла прошла весь путь от выбора железа до получения доступа в интернет, и собрала подробное пошаговое руководство для тех, кто готов повторить эксперимент самостоятельно. В этой статье мы развернём автономную сеть 5G NR в режиме StandAlone (SA) — без опоры на LTE. Использовать для этого будем доступные на маркетплейсах компоненты и открытые решения.
В роли подсистемы радиодоступа выступит srsRAN_Project (gNodeB), функции ядра возьмёт на себя Open5GS. Оба компонента запустим на одной машине под Ubuntu Linux.
Что касается «железа», то мы использовали обычный x86-ПК и SDR USRP B210 micro — модификацию платы Ettus Research USRP B210, совместимую с драйвером UHD. В роли абонентского устройства выступил Realme GT Neo 3T.
Архитектура и логическое разбиение
Общая диаграмма сети будет выглядеть так:

Сеть логически поделена на две части: ядро и базовую станцию. Ядро обеспечивает подключение gNodeB по N2, аутентификацию пользователей и предоставление пакетных сервисов (в этом примере — доступ в интернет). Базовая станция даёт радиоканал конечному пользователю и состоит из трёх соединённых по USB 3.0 логических частей: Central Unit и Distributed Unit, предназначенных для декодирования радиосигнала и соединения с ядром сети, и радиочасти в виде устройства SDR.
Практические нюансы перед началом
Процессор и набор инструкций. При развёртывании ядра сети необходимо удостовериться, что ваш процессор поддерживает набор инструкций AVX. Абсолютное большинство современных процессоров его поддерживает, однако модели старых поколений Intel Celeron могут и не поддерживать. В случае нашего ядра сети этим набором инструкций пользуется база данных MongoDB, в которой хранятся абонентские профили. Оптимальный вариант — система с шестью и более ядрами, или четыре ядра с SMT.
Виртуализация. Базовую станцию мы сознательно не развёртываем в VM, чтобы не пробрасывать USB-соединение через гипервизор. Для ядра сети это не критично, но мы запустим его в той же ОС, что и софт базовой станции.
Графический доступ. Если развёртывать на сервере без графической оболочки и браузера, то удобно заранее настроить удалённый доступ к Open5GS WebUI (пример — ниже). При установке на рабочую станцию с браузером WebUI доступен локально.
При настройке опираемся на официальные руководства: по установке драйвера UHD, развёртыванию Open5GS и настройке srsRAN_Project. Однако помимо цитирования руководств в статье будут отмечены причины выбранных решений и модификаций. Все эти руководства составлены непосредственными разработчиками программных стеков и написаны на английском языке. Русскоязычных материалов, полностью описывающих развёртывание сети 5G, найти не удалось.
Установка драйвера UHD
UHD — драйвер с открытым исходным кодом и реализацией под разные ОС, включая Windows и Linux. Он входит в дистрибутив Ubuntu Linux. В нашем случае в рассматриваемой сборке доступна версия 4.6.0.0. Для корректной работы устанавливаем актуальный драйвер UHD из репозитория Ettus Research (PPA) и получаем последнюю версию — 4.9.0.0 на момент подготовки материала.
Команды ниже добавляют репозиторий, устанавливают драйвер и утилиты:
sudo add-apt-repository ppa:ettusresearch/uhd
sudo apt-get update
sudo apt-get install libuhd-dev uhd-host
В нашей конфигурации мы используем не оригинальную версию USRP B210, а китайский аналог B210 micro, поэтому далее необходимо загрузить в наше устройство SDR-прошивку от производителя, поскольку оно несовместимо с оригинальными образами Ettus Research. Начиная с версии 3.15 LTS-образы прошивки совместимы с более новыми версиями драйвера UHD, как минимум до текущей версии 4.9.0.0. Поэтому размещаем образы либо в директории по умолчанию, где их будет искать драйвер UHD, либо определяем директорию образов для драйвера через переменные окружения.
После установки драйвера убедитесь, что хост видит устройство SDR: uhd_usrp_probe
Установка ПО базовой станции
srsRAN_Project — это ответвление от общей ветки srsRAN, ориентированное на поддержку в основном 5G NR в сетях 5G SA. В нашем примере будем использовать приложение gNodeB для работы с SDR через драйвер UHD. Комбинация этого стека с USRP и будет представлять собой базовую станцию 5G.
Для работы со стеком SRS есть блок-схема по рекомендуемому типу установки, которую можно найти на сайте разработчика:

Для конфигурации «USRP + базовое приложение SRS + актуальный UHD» удобно использовать готовые пакеты из официального репозитория Software Radio Systems (PPA) — это ускоряет подготовку и снижает риски несовместимостей.
Устанавливаем ПО по инструкции:
sudo add-apt-repository ppa:softwareradiosystems/srsran-project
sudo apt-get update
sudo apt-get install srsran-project -y
Установка Open5GS и MongoDB
Open5GS многократно описан, поэтому сосредоточимся на ключевых пунктах из руководства. Open5GS реализует функции ядра сети для LTE/5G. В этом проекте используется 5G SA; сервисы ядра запускаются отдельными демонами и взаимодействуют по loopback-адресам 127.0.0.x — к этой же подсети будет подключена базовая станция.
Начинаем с установки MongoDB, в которой будут храниться абонентские профили:
$ sudo apt update
$ sudo apt install gnupg
$ curl -fsSL https://pgp.mongodb.com/server-8.0.asc | sudo gpg -o /usr/share/keyrings/mongodb-server-8.0.gpg --dearmor
echo "deb [ arch=amd64,arm64 signed-by=/usr/share/keyrings/mongodb-server-8.0.gpg ] https://repo.mongodb.org/apt/ubuntu noble/mongodb-org/8.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-8.0.list
$ sudo apt update
$ sudo apt install -y mongodb-org
$ sudo systemctl start mongod
$ sudo systemctl enable mongod
Далее устанавливаем непосредственно компоненты ядра сети:
$ sudo add-apt-repository ppa:open5gs/latest
$ sudo apt update
$ sudo apt install open5gs
Установка и доступ к Open5GS WebUI
WebUI используется для создания абонентских профилей и задания параметров доступа.
Установка Node.js для WebUI:
# Download and import the Nodesource GPG key
$ sudo apt update
$ sudo apt install -y ca-certificates curl gnupg
$ sudo mkdir -p /etc/apt/keyrings
$ curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | sudo gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg
# Create deb repository
$ NODE_MAJOR=20
$ echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node\_$NODE\_MAJOR.x nodistro main" | sudo tee /etc/apt/sources.list.d/nodesource.list
# Run Update and Install
$ sudo apt update
$ sudo apt install nodejs -y
Установка WebUI:
$ curl -fsSL https://open5gs.org/open5gs/assets/webui/install | sudo -E bash -
Если на сервере нет графической оболочки и браузера, то удобнее открыть интерфейс со стороннего ПК. Для этого в unit-файл /lib/systemd/system/open5gs-webui.service добавляем строки, разрешающие подключение извне.

Если же вы изначально ставите софт на ПК с браузером, то этот шаг можно пропустить и управлять абонентскими данными через http://localhost:9999.
Настройка: srsRAN_Project + Open5GS (COTS UE)
Ориентируемся на официальную инструкцию SRS для работы с коммерческим смартфоном (COTS UE). Мы не используем GPSDO: для одной gNodeB без handover внутренний осциллятор достаточно стабилен, однако при наличии внешнего эталона используйте его.
Берём стандартный набор параметров: band n78, TDD, полоса 20 МГц. Если вашему смартфону удобнее другой бэнд, то скорректируйте ARFCN, режим (TDD/FDD), ширину канала и шаг поднесущих OFDM. Внутренний валидатор SRS откажет при противоречащей стандарту конфигурации.
Используем файл gnb_rf_b200_tdd_n78_20mhz.yml из configs и копируем его в /apps/gnb. Сначала задаём корректный PLMN (MCC+MNC), причём он должен совпадать с ядром — здесь используется 00101 (тестовая сеть). Проверьте clock: internal — без внешнего источника, external — если вы подаёте внешнюю синхронизацию на вход 10 МГц, или же gpsdo, если у вас на плате есть модуль GPSDO.
Рабочий фрагмент конфигурации gNodeB:
cu_cp:
amf:
addr: 127.0.1.10
port: 38412
bind_addr: 127.0.0.1
supported_tracking_areas:
- tac: 7
plmn_list:
- plmn: "00101"
tai_slice_support_list:
- sst: 1
ru_sdr:
device_driver: uhd
device_args: type=b200,num_recv_frames=64,num_send_frames=64
clock: internal
srate: 23.04
tx_gain: 70
rx_gain: 40
cell_cfg:
dl_arfcn: 627340
band: 78
channel_bandwidth_MHz: 20
common_scs: 30
plmn: "00101"
tac: 7
pci: 1
Настройка ядра: NRF, AMF, UPF — что правим и почему
Конфигурация сетевых функций находится в /etc/open5gs, где каждый узел — отдельный .yaml. Для 5G SA нам нужны, как минимум, три файла: nrf.yaml (каталог сетевых функций), amf.yaml (сигнализация/регистрация), upf.yaml (пользовательская плоскость).
В amf.yaml задаём адрес NGAP — по умолчанию gNodeB ищет AMF на 127.0.1.100. В upf.yaml прописываем адрес GTP-U. Во всех задействованных файлах MCC+MNC должны совпадать с конфигурацией базовой станции.
Минимальный набор правок (AMF и UPF):
# /etc/open5gs/amf.yaml
ngap:
server:
- address: 127.0.1.100
# /etc/open5gs/upf.yaml
gtpu:
server:
- address: 127.0.1.100
А чтобы у абонента появился доступ во внешнюю сеть, включаем пересылку IPv4 и настраиваем NAT в интерфейсе туннеля ogstun:
### Enable IPv4 Forwarding
$ sudo sysctl -w net.ipv4.ip_forward=1
### Add NAT Rule
$ sudo iptables -t nat -A POSTROUTING -s 10.45.0.0/16 ! -o ogstun -j MASQUERADE
Сим-карты и абонентские профили
На маркетплейсах можно найти перезаписываемые сим-карты с возможностью записи Ki и OP/OPc, и совместимый кард-ридер. На физических Windows 7/10 связка GRSIMWrite + Espada Smartread USB работает стабильно, на виртуальных машинах ридер был виден не всегда. Совместимость смартфонов также различается: например, на устаревших моделях возможны ошибки распознавания сим-карты.
Профили заводим через WebUI. Для корректной аутентификации по алгоритму Mil(l)enage на сим-картах и в БД должны совпадать: IMSI, OPc, Ki, AMF (Authentication Management Field). Также разработчики рекомендуют выбрать в абонентском профиле тип APN IPv4, а не IPv4/IPv6.
Все данные записываем на сим-карты и в базу данных через WebUI:


Запуск и проверка по шагам
Подготовка ОС. Запускаем скрипт повышения производительности из каталога Scripts в инсталляции srsRAN_Project: перевод CPU в режим performance повышает стабильность. В отдельных сценариях разработчики рекомендуют отключить Hyper-Threading для выигрыша в однопотоке. Учитывайте требование: по умолчанию системе нужно не меньше пяти логических ядер.
Старт gNodeB. Переходим в каталог apps/gnb и запускаем с подготовленным конфигурационным файлом:
sudo gnb -c gnb_rf_b200_tdd_n78_20mhz.yml
В логе увидите характерную «лесенку» регистрации и переход в рабочее состояние:

Наблюдаем ядро. В отдельном окне удобно смотреть лог AMF и процесс аутентификации: tail -f /var/log/open5gs/amf.log.
Смартфон. Вставьте сим и включите устройство. Если PLMN на сим-карте не совпадает с PLMN в конфигурации, то включите роуминг. Также разработчики рекомендуют отключить опции VoLTE и VoNR. Режим NR Only можно выбрать в сервисном меню, открыв с помощью приложения 5GSwitch, но на Android 11+ то же меню доступно по коду ##4636#*#*.

Выбирайте в сервисном меню телефона режим NR Only, после чего в логе AMF должны появиться сообщения об аутентификации абонента. Если всё было настроено правильно, то по окончании аутентификации вы должны увидеть в логе AMF сообщение authentication complete, а на экране телефона должен появиться индикатор 5G. Если до этого вы настраивали доступ в интернет для абонентов, то можно приступать к тестам.
Что получилось и куда развиваться
Мы собрали автономную сеть 5G NR на srsRAN_Project и Open5GS из доступных компонентов и открытого ПО. Этот пример не претендует на промышленную эксплуатацию: зона покрытия мала, handover’ов нет, частотную и фазовую синхронизацию не использовали, голос не настроен, отказоустойчивость не реализовали. Для этих задач в экосистеме open-source/open-hardware есть решения разной зрелости, их можно интегрировать по мере роста требований. Концепция SDR упрощает эволюцию: при совместимости радиотракта с нужными диапазонами и достаточной мощности CPU переход к будущим стандартам — вопрос обновления стека.
olegtsss
Очень интересный стенд, я давно любил позаниматься с openbts на Motorola мобильниках, о usrp приходилось только мечтать. Как показывает себя в работе китайский аналог, были ли танцы с бубном по его интеграции в проект? Насколько стенд можно непрерывно эксплуатировать хотя бы в лабораторных условиях ?