2023 год стал началом массового отключения ныне уже устаревших сетей третьего поколения. Многие операторы по всему миру уже вывели из эксплуатации эти сети или запланировали это на ближайшие годы. Самое время для того, чтобы поднять такую базовую станцию у себя. И, как выяснилось в процессе, это не так просто, как может показаться.
Итак, в сегодняшней статье разберёмся с тем, как собрать и заставить работать софт для поднятия сотовой сети типа UMTS. Узнаем, как устроены и работают такие сети. Традиционно будет много интересного.
❯ Суть такова
Так уж вышло, что открытых реализаций сетей третьего поколения практически нет. CDMA-450, равно как и CDMA-800 не реализовал пока что никто. С сетями UMTS всё несколько получше, но не менее печально.
Софт от Osmocom использует для своей работы фемтосоту (достать которую в наших краях — то ещё испытание), а других реализаций почти что и не существует. А с распространением сетей 4G и постепенным уходом в историю 3G (во многих местах их отключают даже раньше обычных 2G) интерес к данному стандарту почти пропал.
Но всё же один чуть более доступный вариант есть. Так что смахнём пыль с софта многолетней давности и попробуем поднять у себя и такую сеть.
❯ Как работает 3G
Вообще, сети третьего поколения включают в себя сразу несколько стандартов (например, почивший CDMA2000 (он же CDMA-450), известный в России как «Скайлинк», тоже относился к третьему поколению), но обычно при упоминании 3G имеют в виду сеть UMTS (Universal Mobile Telecommunications System). В отличие от GSM с его таймслотами, тут используется технология WCDMA.
Сеть состоит из трёх основных компонентов:
- Core Network (CN). Это опорная сеть, где находится БД абонентов (HSS), шлюзы (всё те же GGSN и SGSN, с которыми мы уже сталкивались в GPRS) и центр коммутации.
- Radio Access Network (UTRAN, UMTS Terrestrial RAN). Она состоит из базовых станций (Node B) и их контроллеров (RNC, Radio Network Controllers).
- User Equipment (UE). Это те самые устройства, которые подключаются к базовым станциям — телефоны, модемы и прочее оборудование.
3G работает в нескольких диапазонах, часть из которых совпадает с таковыми для GSM. Наиболее распространёнными являются 850, 900, 1800 и 1900 МГц. В каждом диапазоне есть свой набор каналов (UARFCN). Как и в случае с 4G, для расчёта частоты по номеру канала и наоборот существуют специальные формулы, но куда проще воспользоваться соответствующим софтом.
❯ Почему 2G переживёт 3G
Многие наверняка заинтересуются: почему же сети 3G выводят из эксплуатации раньше, чем 2G? Причин для этого много:
- В сетях GSM работает большое количество встраиваемого и околопромышленного оборудования — модемы, сигнализации, датчики, устройства контроля доступа.
- Сети 3G намного дороже в планировании и обслуживании, нежели 2G.
- Базовые станции 2G обладают большей зоной покрытия, нежели 3G/4G.
- Освобождённые диапазоны 3G можно использовать для расширения сетей 4G.
В нашей стране уход таких сетей в историю ожидается в 2027-2030 годах. Кое-где (например, в некоторых районах Подмосковья) 3G уже нет.
❯ Обзор оборудования
Самое время посмотреть на используемое железо. Оно несильно отличается от использовавшегося в прошлых опытах.
Перво-наперво идёт SDR. Это всё тот же USRP B200mini-i.
Телефон. В моём случае — Sony Xperia L2. Я много им пользовался и знаю, что (в отличие от 4G) с 3G никаких проблем у него нет.
Всё те же программируемые симки, оставшиеся от опытов с LTE. Забегая вперёд, скажу, что с теми, что на фото, соединение упорно не поднималось. О том, как решить эту проблему, поговорим чуть позже.
❯ Софт
Как же запустить эту сеть, если оригинальный софт от Osmocom с SDR не работал? Есть такая штука как OpenBTS-UMTS. Это ПО и позволяет сделать то, что нам хотелось — запустить у себя рабочую сеть третьего поколения.
Софт этот лежит на Github RangeNetworks, а на сайте Fairwaves даже есть какая-то инструкция по сборке.
После сборки и запуска ПО нас должно ожидать нечто вроде того, что показано в этом видео (к слову говоря, оно явно было снято в России, судя по операторам, которые ловит телефон). Проблема только одна — оно не работает. OpenBTS-UMTS появился больше десяти лет назад, за это время успели несколько раз измениться библиотеки, зависимости, драйверы и всё остальное ПО. В результате попытка провернуть описанное по той ссылке приведёт к ошибке после выполнения первой же команды. В этом вся боль старого софта для Linux, когда пробуешь его собрать, получаешь сотню ошибок, пытаешься поставить зависимости нужных версий, но в итоге получаешь так и не заработавший софт и отвалившееся что-то ещё.
Также в той инструкции использовался такой экзотический девайс как Fairwaves UmTRX. Штука эта весьма интересная, однако в нынешних реалиях купить его по сути нереально.
Так что в данной статье я постараюсь показать, как же всё-таки заставить данный софт собраться и работать в наши дни (и стоит ли вообще пытаться это делать).
❯ Что понадобится для запуска сети 3G?
Итак, разберёмся с необходимыми компонентами.
- SDR. Это самый важный компонент. OpenBTS-UMTS поддерживает исключительно драйвер UHD, поэтому из всех существующих SDR подойдёт только USRP. LimeSDR, BladeRF и другие устройства работать не будут. Также поддерживается ранее упомянутый UmTRX, но найти его весьма и весьма тяжело.
- Компьютер с ОС Linux. Какие к нему выдвигаются требования, поговорим чуть позже.
- SIM-карты, пригодные для записи. 3G не имеет режима работы без шифрования, поэтому необходимы программируемые SIM-карты, в которые можно записать свою пару IMSI-Ki.
- Антенны. Свою сеть я поднимал в диапазоне GSM-900, так что необходимы антенны, способные работать на этих частотах.
- Сам телефон, который будет подключаться к сети. Само собой, он должен поддерживать работу в сетях 3G.
Самое время разбираться с программной частью.
❯ Ставим софт
Для того, чтобы собрать OpenBTS-UMTS, необходим Linux достаточно старой версии. Экстремалы могут попробовать снести все используемые тут пакеты и накатить более старые их версии, однако риск того, что после таких операций что-то перестанет работать, слишком велик. Так что будем использовать чистую систему.
Как уже было сказано, библиотеки и версии компиляторов успели измениться, поэтому сходу собрать софт не получится. Не получится и воспользоваться инструкцией от Fairwaves, всё заканчивается неудачей уже на этапе установки UmTRX. Что же теперь делать? Давайте разбираться.
На просторах был обнаружен чей-то курсач, где описывалась установка софта на более свежую (по тем меркам) ОС. На самом деле, хоть дела с ней и обстоят получше, эта инструкция тоже не совсем точная, если «в лоб» следовать тому, что там написано, сеть никогда не заработает (и позже я расскажу, почему). Истина, как это часто бывает, где-то посередине. Поэтому при установке своего софта я опирался на оба документа сразу.
Итак, для начала необходимо поставить ОС, в качестве которой выбрана Xubuntu 18.04. Выбор её обусловлен двумя причинами:
- Она упоминалась в той самой курсовой, инструкциями откуда мы будем руководствоваться.
- Мне не удалось развернуть софт на более свежих дистрибутивах.
Итак, необходимо накатить ОС на наш компьютер, после чего установить нужные обновления (обычно они встают автоматически, если поставить соответствующую галку в меню установщика). Если всё будет сделано правильно, после перезагрузки система будет готова к работе. Можно приступать к установке ПО.
❯ Собираем
Итак, открываем терминал и ставим необходимые зависимости:
sudo apt-get install git
sudo apt-get install sqlite3
Теперь переходим непосредственно к скачиванию и сборке:
git clone https://github.com/RangeNetworks/dev.git
git clone https://github.com/KonstantinZavertkin/OpenBTS-UMTS.git
Ставить надо именно из указанного репозитория — автор этого форка сумел портировать софт для того, чтобы он мог быть скомпилирован на более новой ОС.
Далее надо скачать и установить оставшиеся зависимости, для чего запускаем любезно приложенный автором скрипт:
cd ./OpenBTS-UMTS/
sudo ./install_dependences.sh
В ходе его выполнения устанавливаются нужные библиотеки и драйверы, а также скачивается и собирается необходимый для дальнейшей компиляции нашего софта ASN1C.
Теперь собираем сам OpenBTS-UMTS:
./autogen.sh
sudo ./configure
sudo make
sudo make install
sudo mkdir /var/log/OpenBTS-UMTS
И вот тут в листинге по ссылке встречается первая ошибка: предлагается, во-первых, инициализировать БД, которой нет, во-вторых, скопировать некий (тоже пока что отсутствующий) «comp128». Поэтому для начала надо собрать софт для аутентификации абонентов — sipauthserve.
Для начала собираем coredumper:
cd ~/dev
./clone.sh
cd ./libcoredumper/coredumper-1.2.1/
sudo ./configure
sudo make
sudo make install
В оригинальной статье был упомянут libcoredumper, но я проверил — он не собирается. Так что используем этот, проблем с ним замечено не было.
Теперь очередь sipauthserve:
cd ~/dev/subscriberRegistry/
./autogen.sh
./configure
sudo make
sudo make install
sudo mkdir -p /var/lib/asterisk/sqlite3dir
Теперь можно инициализировать БД и скопировать собранный comp128 (часть системы аутентификации абонента, работающая с данными на SIM):
cd /etc/OpenBTS/
sudo sqlite3 /etc/OpenBTS-UMTS/OpenBTS-UMTS.db ".read OpenBTS-UMTS.example.sql"
sudo sqlite3 -init sipauthserve.example.sql /etc/OpenBTS/sipauthserve.db ".quit"
Тут тоже имеется ошибка: SQL-файл БД службы авторизации называется sipauthserve.example.sql, а не subscriberRegistry.example.sql, как было сказано в оригинальной статье.
На этом сборка софта закончена. Подключаем к компьютеру SDR и пробуем запускать.
Если у вас уже есть USRP, то, уверен, вы хорошо знаете, что сразу после подключения к компьютеру девайс не готов к работе. Необходимо загрузить в его ОЗУ прошивку. Если в прошлых опытах она загружалась автоматически, то тут USRP нужно активировать вручную. Для этого надо скачать образы прошивок и загрузить нужный. Делается это так:
sudo uhd_images_downloader
sudo uhd_usrp_probe
Теперь можно запускать OpenBTS:
cd /OpenBTS
sudo ./OpenBTS-UMTS
Если всё сделано правильно, то на USRP загорится индикатор передачи. Казалось бы, самое время доставать телефон и пробовать подключаться. Но, как оказалось, не всё так просто…
❯ Собираем
Изначально для проверки возможности того, что ПО в принципе можно собрать, я попробовал сделать это на виртуальной машине. Но есть проблема: проброс USB-порта в ВМ не обеспечивает достаточной для работы сети скорости. Светодиод на SDR мерцал как индикатор калькулятора МК-61 при выполнении программы, а в консоли сыпались характерные предупреждения «SDR TX overflow!». Поэтому единственным выходом будет запустить всё на настоящем компьютере.
У меня нет машины со столь старой версией Linux, так что придётся его поставить. Установку, понятное дело, не описываю, ничего сложного в ней нет.
Использовавшаяся мной материнская плата ASRock N68-GS3 UCC не имеет портов USB 3.0, поэтому необходим внешний контроллер, иначе работать USRP не будет.
А вот и он. Просто так сгонять в ближайший компьютерный лабаз и купить первый попавшийся нельзя, есть риск всё оставшееся время заниматься опытами не с сетью, а с поисками драйверов для платы.
Контроллер построен на чипе VL805-Q6. В интернете удалось найти, что с Linux он работает нормально.
Когда всё было воткнуто на место, энтропия в комнате порядком возросла, а стенд принял вот такой вид. Можно запускать и пробовать.
❯ Запуск
Итак, будем считать, что софт собрался. Запустив OpenBTS, можно увидеть примерно следующее:
После того, как USRP инициализировался, откроется консоль OpenBTS:
В ней можно менять конфигурацию нашей сети.
Теперь открываем ещё один терминал и выполняем следующие команды:
cd ~/dev/subscriberRegistry/apps
sudo ./sipauthserve
Очень важно запускать это после инициализации OpenBTS, в противном случае работать служба не будет. Точнее, оно сделает вид, что запустится, никаких ошибок не вылезет, но при попытке зарегистрироваться в сети или добавить абонента вас постигнет неудача.
Если всё настроено правильно, никаких сообщений выдаваться не должно.
Теперь нужно занести в базу абонента. Для этого существует скрипт nmcli.py. В моём случае забитые в SIM-карту данные следующие:
- IMSI: 250100123456789
- Ki: 00112233445566778899AABBCCDDEEFF
- PLMN: 25010
Для добавления абонента выполняем такую команду:
cd ~/dev/subscriberRegistry/NodeManager
sudo ./nmcli.py sipauthserve subscribers create "name" imsi msisdn ki
Name здесь — имя в базе (можно любое), IMSI и Ki — данные из SIM-карты, MSISDN — желаемый телефонный номер.
Если служба работает, то после выполнения скрипта должно будет появиться примерно следующее:
Получить содержимое БД можно при помощи следующей команды:
sudo ./nmcli.py sipauthserve subscribers read
При этом, если база пустая, вернётся ошибка 404. Это нормально.
А вот вывод, если в БД кто-то есть.
❯ SIM-карты
Казалось бы, всё просто: зашей данные в симку, и в путь. Прошлые опыты с программируемыми картами показали, что никаких затруднений это не вызывает. Но всё куда сложнее, чем можно подумать.
Всё дело в том, что при подключении к сети телефон активирует режим USIM, где используется алгоритм шифрования Milenage, в то время как единственное, что поддерживает OpenBTS-UMTS, это COMP128v1. Поэтому необходимо искать симки, где поддержку USIM можно отключить (например, от Sysmocom). Если этого не сделать, то при регистрации в сети телефон будет тупить, а в консоли появится «Authentication and ciphering failure». Вывод из этого простой: карты Gialer для данных целей не подходят. В отсутствии Sysmocom можно использовать старую «мультисимку»: USIM они не поддерживают, а с тех пор, как все карты перешли на COMP128v2 и Milenage, где уязвимостей, позволяющих извлечь IMSI и Ki, пока не найдено, они фактически стали бесполезными и могут быть куплены по не самой высокой цене.
❯ Конфигурация
Итак, теперь займёмся настройкой самой БС.
Если набрать в консоли config, то откроется список параметров. Они хранятся в БД и могут быть изменены из консоли.
Интересуют нас следующие:
- UMTS.Identity.MCC. Код страны, первая половина PLMN.
- UMTS.Identity.MNC. Код сети, вторая половина PLMN.
- SubscriberRegistry.db. Путь к БД с абонентами.
- UMTS.Radio.C0. Номер канала (UARFCN), на котором работает наша БС.
- UMTS.Radio.Band. Диапазон.
Также в настройках будут встречаться упоминания GSM, но в данном билде они не задействованы.
PLMN устанавливаем тот, который записан в нашей SIM. Канал — тот, который не занят другой работающей БС. С диапазоном тоже есть неочевидный нюанс — многие телефоны не работают в режиме 3G на частоте 900 МГц, используя вместо этого 850, 1800 и 1900 МГц, поэтому с настройками по умолчанию видеть сеть они не будут.
Теперь на телефоне открываем поиск сетей и пробуем подключиться. И, если вам повезёт, телефон найдёт сеть и подхватит её. Если же это не работает, то пробуем другой диапазон или канал.
Увы, далеко не все телефоны, с какими я пробовал, смогли подключиться. Какие-то просто выдавали ошибку, какие-то долго тупили и всё равно не смогли подхватить сеть. При этом в консоли сыпалось непрерывное «UE attach request». Один из телефонов (не раз упоминавшийся ранее Galaxy M12) даже с «правильной» симкой заставлял софт писать всё то же «UL GMM Msg: AuthenticationAndCipheringFailure UE#1 URNTI=d635 stCELL_FACH». Лишь несколько устройств таки смогли найти сеть.
❯ Доступ в интернет
Теперь нужно разобраться с тем, как вывести наш телефон в сеть. Если в опытах с srsRAN у нас был специальный скрипт, то тут всё придётся проделать вручную.
Для этого нужно выполнить следующие команды:
sudo iptables -t nat -A POSTROUTING -j MASQUERADE -o eth0
sudo echo 1 > /proc/sys/net/ipv4/ip_forward
eth0 требуется заменить на то подключение, через которое машина получает доступ в интернет. На телефоне точно так же следует создать точку доступа (впрочем, если он уже хоть раз эксплуатировался с SIM-картой и выходил в интернет, она там наверняка есть).
Всё, можно выходить на просторы. Скорость, увы, достаточно печальная — в районе нескольких мегабит в секунду.
Что же до обычных вызовов, то всё не так хорошо, на Wiki проекта можно прочитать вот такой текст:
Features not supported in this release:
circuit-switched services (e.g. voice, text)
handover
Inter-RAT mobility (moving b/w a 2G and 3G network)
paging
ciphering
USIM-based authentication
Это значит, что ни звонить, ни отправлять SMS, мы не сможем. И пусть вас не смущают многочисленные упоминания SIP в процессе настройки: sipauthserve использовалась и с другими конфигурациями OpenBTS.
❯ Вот как-то так
Итак, как мы смогли выяснить, поднять сотовую сеть 3G у себя дома вполне реально, хоть и с кучей неожиданных проблем.
Ссылки
- Собранный софт
- Исследование принципов организации сети UMTS с использованием проекта OpenBTS
- Building, Installing and Running OpenBTS
- How to get 3G working on the UmTRX
- OpenBTS: UMTS
- 3G UMTS UARFCN calculator
- Setting up a 3G network using osmo-iuh and a femto/small cell
- OsmoHNBGW
Автор: Лев