Приветствую всех!

Два года назад я уже рассказывал о том, как запустить у себя дома базовую станцию 4G LTE. Тем не менее, в той сети работал только мобильный интернет, тогда как при попытке позвонить или отправить SMS связь немедленно обрывалась.

Самое время восполнить это упущение. Сегодня мы поднимем сеть, в которой будут работать все эти функции. Заодно разберёмся, как работают звонки в LTE-сетях, как запустить такую сеть при помощи SDR и как заставить это всё работать. Как водится, будет много интересного.

❯ Суть такова

Когда-то давно мне уже доводилось запускать сеть 4G LTE в минимальной работоспособной конфигурации. Телефон успешно подключался и выходил в интернет, но мне, конечно, хотелось ещё большего.

Уверен, сейчас все (ну, или почти все) примерно представляют себе, что такое VoLTE и то, для чего он нужен. Если вы читаете этот текст с телефона, то звонит он наверняка благодаря поддержке этой функции.

Тем не менее, по сравнению с обычными сетями типа GSM устроено это совершенно иначе. Как оно работает и как запустить это в «домашней» сети, сейчас и узнаем.

❯ Как работает VoLTE

Начнём с самого начала: с того, как вообще совершаются звонки в 4G-сетях. Вариантов тут всего два.

Первый из них — откат на сеть предыдущего поколения (Circuit Switched Fallback). Он поддерживается и поныне, дабы трубки, где VoLTE выключен или не поддерживается, в принципе могли звонить.

Момент переключения на более старую сеть вы можете пронаблюдать лично, если выключите VoLTE на телефоне, включите мобильный интернет, а затем попробуете кому-то позвонить. При начале вызова значок «4G» в строке состояния пропадёт. Такую систему тоже можно воссоздать в домашних условиях, если поднять 2G-сеть с тем же PLMN (то есть с теми же кодами MCC и MNC) и настроить в ней SIP.

Но, думаю, даже непосвящённым понятно, что пробрасывать звонки через более старые сети - это костыль не самое оптимальное решение. Перед началом соединения происходит задержка, поскольку телефон должен «соскочить» на более старую сеть, а сетевое соединение при этом прерывается. Конечно, полностью избавиться от такой системы нельзя, так как тогда более старые телефоны больше не смогут звонить, но было бы странно не придумать что-то оптимизированное именно с учётом архитектуры LTE-сетей.

Так появился второй вариант — тот самый VoLTE. Это протокол передачи голоса в сотовых сетях через каналы пакетной передачи данных, проще говоря, через обычные сети TCP/IP. Чем-то он напоминает привычный VoIP, но всё же отличается от него другим форматом пакета, обеспечивающим чуть меньший его размер. Эти пакеты обрабатывает специальный модуль в ядре сети — IMS (IP Multimedia Subsystem). Таким образом, в выигрыше оказываются и операторы (VoLTE обеспечивает чуть ли не шестикратный прирост пропускной способности в сравнении с обычными сетями GSM, а, значит, положить сеть становится значительно труднее), и пользователи (качество звука в VoLTE значительно лучше , если, конечно, связь LTE вообще есть).

❯ Что такое SRVCC?

Так уж вышло, что стабильное соединение LTE есть далеко не везде. Если в момент вызова по VoLTE уровень сигнала просядет, то звонок прервётся. Поэтому существует специальная процедура переключения на сеть более старого поколения на тот случай, если её сигнал в это время лучше. Называется она SRVCC (Single Radio Voice Call Continuity).

Когда уровень сигнала от телефона начинает проседать и падает ниже некоего значения, которое БС считает критическим, отправляется запрос на резервирование голосового канала. MME связывается с MSC, находит ближайшую доступную вышку и выделяет на ней канал. После этого телефон переключается на эту вышку, а разговор продолжается. Для пользователя это выглядит как кратковременное заикание или некоторое ухудшение качества связи. Само собой, если в этот момент производилась передача данных, соединение либо (в случае с 2G) сбрасывается, либо (в случае с 3G) продолжается на более низкой скорости.
Также существует и обратный вариант: при возвращении абонента обратно в зону покрытия 4G звонок можно перевести на VoLTE. Впрочем, распространено это меньше из-за сложностей реализации: пока абонент находится в сети 2G/3G, ядро сети LTE не может получать информацию о состоянии соединения.

❯ SMS в LTE-сетях

Как и в случае со звонками, вариантов тут два.

Первый — SMS over SGs. В этом случае помимо LTE-сети телефон регистрируется и в «старом» центре коммутации (MSC) GSM. После этого он становится доступен как MME (для передачи данных в LTE-сети), так и MSC (для SMS). При отправке сообщения телефон формирует специальный пакет, а MME передаёт его MSC, который его обрабатывает абсолютно так же, как если бы абонент находился в обычной сети 2G. Аналогичным образом происходит и приём. Сообщение приходит в SMS-центр GSM-сети и передаётся в MSC. Тот передаёт его MME, который и производит отправку на абонентское устройство. На этот раз при отправке или приёме SMS сброса соединения LTE не происходит.

Второй — SMS over IMS. Как нетрудно понять, предыдущее решение хоть и работает, но всё же реализован был исключительно для совместимости. В «нативной» реализации сообщения упаковываются в обычные пакеты данных, передаваемые по TCP/IP. Обработкой этих пакетов занимается всё тот же IMS.

❯ Обзор оборудования

Как и в случае с «простой» 4G-сетью, для того, чтобы запустить такое дома, требуется SDR с комплектом антенн, программируемые симки и сами телефоны, которые будем подключать к сети. Поэтому комплект оборудования остаётся неизменным.

Это SDR, самый важный компонент, он же и самый дорогой.

В моём случае это USRP B200mini-i. Другого экземпляра за столько лет у меня пока не появилось.

Телефон Samsung Galaxy M12.

Телефон Samsung Galaxy S5.

С этой моделью надо быть внимательным: некоторые прошивки не поддерживают VoLTE. Перед тем, как пытаться использовать его для наших целей, этот момент обязательно надо уточнить.

Также надо учесть, что некоторые аппараты не поддерживают работу в частных VoLTE-сетях.

Обычно этим грешат айфоны и трубки некоторых китайских вендоров. Иногда помогает установить MCC 001 и MNC 01, но работает это далеко не всегда. Со всем этим тоже надо ознакомиться перед началом опытов.

И, наконец, программируемые SIM-карты. Что это такое, для чего они нужны и как их записывать, я уже рассказывал в посте про 4G.

Выбор их всё так же невелик, но с недавних пор появился ещё один вариант от китайской фирмы PISWORDS.

Записываются они стандартным ПО GRSIMWrite, ищутся в продаже на российском Али и, по отзывам, работают в таких частных сетях. Так что при отсутствии возможности купить Sysmocom или Gialer стоит обратить внимание на них.

❯ Ставим софт

В прошлый раз мы использовали софт srsRAN. Но есть один нюанс: компонентов, необходимых для работы VoLTE, там нет. Поэтому ставить будем следующее:

  • Сам srsRAN. В этот раз из всего комплекта понадобится только srsENB — софт базовой станции.

  • Open5GS. Это новое ядро сети. Сейчас оно будет использоваться как ядро 4G-сети, про 5G поговорим как-нибудь позже.

  • Kamailio. Тут всё просто — это SIP-сервер.

В этот раз ставить всё по отдельности не будем. К нашем счастью, существует уже установленный и настроенный софт, запиханный в Docker. Именно его-то мы и будем ставить.
В качестве ОС я использовал Ubuntu 22.04.5 LTS. Но никто не мешает использовать и другой дистрибутив: здесь это не так критично.

Для начала необходимо поставить Docker, поскольку штатно в Ubuntu он не стоит. Для этого выполним следующие команды:

sudo apt update
sudo apt install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
sudo tee /etc/apt/sources.list.d/docker.sources <<EOF
Types: deb
URIs: https://download.docker.com/linux/ubuntu
Suites: $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}")
Components: stable
Signed-By: /etc/apt/keyrings/docker.asc
EOF
sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

Теперь очередь самих контейнеров. Клонируем репозиторий и собираем их:

git clone https://github.com/herlesupreeth/docker_open5gs
cd docker_open5gs/base
sudo docker build --no-cache --force-rm -t docker_open5gs .
cd ../ims_base
sudo docker build --no-cache --force-rm -t docker_kamailio .
cd ..
sudo docker compose -f 4g-volte-deploy.yaml build
cd ../srslte
sudo docker build --no-cache --force-rm -t docker_srslte .

Вообще, сам автор репозитория разместил ссылки на уже готовые контейнеры. Но всё же я предпочёл собрать их самому. Итак, выполняем команды, после чего в консоли должно будет появиться примерно следующее:

Да, если что, конкретно этот контейнер предназначен совсем для другого и в рамках данной статьи собирать его не требуется. Но нетрудно догадаться, что визуально процесс ничем не отличается. Занимает всё это порядочно времени, у меня на весь софт ушло чуть больше полутора часов. Так что запаситесь терпением.

Далее редактируем файл .env.

Поменять нужно следующие параметры:

  • MCC - код страны. В данном случае у меня стоит 460, то есть код Китая. Никакого подтекста тут нет, просто симка так и осталась прошитой под опыты с китайским железом.

  • MNC - код сети.

  • DOCKER_HOST_IP - IP-адрес машины, на которой работает ядро сети.

  • SGWU_ADVERTISE_IP - тот же самый адрес.

  • UE_IPV4_INTERNET - диапазон IP-адресов, выделяемых телефонам для мобильной сети.

  • UE_IPV4_IMS - диапазон IP-адресов, выделяемых телефонам для VoLTE.

Теперь запускаем контейнер с ядром сети:

cd docker_open5gs
source .env
sudo ufw disable
sudo sysctl -w net.ipv4.ip_forward=1
sudo docker compose -f 4g-volte-deploy.yaml up

Запуск начался.

Вскоре в консоли должны будут быстро посыпаться логи.

❯ Абоненты

Как и в случае с srsEPC, необходимо занести данные SIM-карт.

Итак, открываем браузер и переходим по адресу http://localhost:9999 (либо по адресу ПК, на котором работает сеть).

Авторизуемся с учётными данными admin@1423. Нас встречает вот такой экран, где располагается список абонентов. На свежераскатанной системе он будет пуст.

В углу жмякаем плюсик. Открывается окно добавления нового абонента. Заполняем поля IMSI, K, OPc, AMF. Нажимаем на жирный голубой плюс и вводим номер телефона (MSISDN).

Теперь очередь точек доступа. Проматываем окно чуть ниже и заполняем параметры.

Для добавления новых полей жмякаем голубой плюс.

После ввода данных нижняя таблица в свойствах абонента должна выглядеть как на этом скриншоте.

Аналогичным образом надо создать профиль для второго телефона. Больше в этом интерфейсе делать нам нечего, можно его закрыть.

Теперь надо занести данные в OsmoHLR для работы SMS, для чего подключаемся к его консоли:

telnet 172.22.0.32 4258

Теперь заносим данные следующей командой:

enable
subscriber imsi [IMSI-1] create
subscriber imsi [IMSI-1] update msisdn [MSISDN-1]
subscriber imsi [IMSI-2] create
subscriber imsi [IMSI-2] update msisdn [MSISDN-2]

Само собой, IMSI и номера телефонов надо забить свои.

Вот так всё это выглядит.

❯ Пуск!

Ну что же, настал самый ответственный момент.

Открываем файл rr_enb.conf, выбираем нужный канал, на котором будет работать БС. Более подробно про это всё описывается тут. Подключаем к компьютеру SDR с накрученными антеннами. Выполняем команду:

sudo uhd_usrp_probe

В SDR загрузится ПО, и он станет готов к работе.

Аналогичным образом редактируем файл .env (если запуск производится на той же машине, что и ядро сети, то создаём копию):

  • MCC — код страны, должен совпадать с тем, что в ядре сети.

  • MNC — код сети, должен совпадать с тем, что в ядре сети.

  • DOCKER_HOST_IP — IP-адрес машины, на которой работает БС.

  • MME_IP — IP-адрес машины, на которой работает ядро сети.

  • SRS_ENB_IP — IP-адрес машины, на которой работает БС.

И теперь запускаем контейнер:

cd docker_open5gs
source .env
sudo cpupower frequency-set -g performance
sudo docker compose -f srsenb.yaml up -d && docker container attach srsenb

Секунд через десять на SDR загорится зелёный светодиод активной передачи, а в консоли ядра сети промелькнёт сообщение, что теперь число подключенных БС равно 1.

Всё, можно пробовать.

❯ Подключаем телефоны

Для начала произведём некоторую настройку.

На телефоне создаём точку доступа ims с типом ims. Так же создаём обычную точку доступа internet.

Вот так всё это выглядит.

Аналогичные действия производим на втором телефоне.

Если БС в этот момент уже запущена, то, скорее всего, телефон сходу увидит сеть и зацепит её.

Можно даже выйти в интернет и убедиться, что сетевое соединение есть.

Всё! Можно звонить!

SMS между двумя трубками тоже летают.

❯ Завершение работы

Выключить эту сеть после опытов тоже довольно просто:

В консоли с ядром сети нажимаем Ctrl+C и ждём, пока все контейнеры завершат работу. После этого вводим команду:

sudo docker stop srsenb

Через несколько секунд индикатор на SDR погаснет. В следующий раз развернуть сеть можно будет всё теми же командами.

❯ Что же у нас получилось?

Вот так вот, с помощью нехитрых приспособлений буханку белого (или чёрного) хлеба можно превратить в троллейбус. Но зачем?
Итак, теперь наша домашняя сеть теперь поддерживает не только мобильный интернет, но и привычные звонки и SMS, причём запускается всё это ненамного сложнее, чем вариант просто с Open5GS.

Я прекрасно понимаю, что повторить это всё смогут очень немногие, поскольку стоимость радиооборудования весьма высока. Тем не менее, просто сама возможность поднять в домашних условиях сотовую сеть на базе полностью открытого железа и софта — это безумно круто.

Такие дела.


Новости, обзоры продуктов и конкурсы от команды Timeweb.Cloud — в нашем Telegram-канале

Перед оплатой в разделе «Бонусы и промокоды» в панели управления активируйте промокод и получите кэшбэк на баланс.

Комментарии (50)


  1. slavius
    09.01.2026 09:02

    Я предположил бы что это частный опыт сотрудника сотовой компании. Ан нет.
    Хотя и облачный провайдер, но опыт нужен совсем другой.
    И хотя лично мне это недостижимо - все равно спасибо за статьи такого уровня.
    Жаль, что плюсик за статью можно ставить каждой статье, но автору только один раз.


    1. MaFrance351 Автор
      09.01.2026 09:02

      Спасибо, очень приятно.

      В данном случае я просто любитель, оборудование это находится у меня дома.