Добрый день, уважаемые хабровчане!
Сегодня и в последующие дни я сделаю перевод статей о развертывании архитектуры сетей 5G для дальнейшего ее изучения. Цель этой статьи — показать, что самые передовые технологии доступны всем и каждому, и что будущее можно создавать своими руками и не ждать. Я верю, что инженерный состав в нашей стране, это талантливые люди, которые могут нивелировать технологическое отставание, которое мы упустили за прошедшие 30 лет.
Напутствие
В этом посте я расскажу о развертывании базовой сети 5G с помощью Open5GS, которая представляет собой реализацию базовой мобильной сети 5G с открытым исходным кодом. Для тестирования функций базовой сети 5G я использовал UERANSIM, симулятор 5G UE и RAN (gNodeB) с открытым исходным кодом. Все исходные коды/развертывания, связанные с этим постом, доступны на gitlab. Пожалуйста, клонируйте репозиторий. В этом посте я установил Open5GS как службу демона Linux. В следующем посте я расскажу об установке Open5GS с Kubernets и Helm Charts.
Архитектура 5G
Мобильная сеть 5-го поколения (5G) — это новый глобальный стандарт беспроводной связи после сетей 1G, 2G, 3G и 4G. 5G обеспечивает новый тип сети, предназначенный для соединения практически всех и всего, включая машины, объекты и устройства. Беспроводная технология 5G предназначена для обеспечения более высокой пиковой скорости передачи данных в несколько Гбит/с, сверхнизкой задержки, большей надежности, большой пропускной способности сети, повышенной доступности и более единообразного пользовательского интерфейса для большего числа пользователей. Более высокая производительность и повышенная эффективность расширяют возможности пользователей и объединяют новые отрасли.
Партнерский проект 3GPP определяет стандарты для 5G. 3GPP — это общий термин для ряда организаций по стандартизации, разрабатывающих протоколы для мобильной связи. Согласно 3GPP система 5G (5GS) будет состоять из трех основных компонентов
-
Пользовательское оборудование (UE)
-
Сеть радиодоступа 5G (5G-RAN)
-
Базовая сеть 5G (5GC)
UE — это устройства с поддержкой 5G (пользовательское оборудование). 5G-RAN (также известный как gNB) — это тип сетевой инфраструктуры, обычно используемый для мобильных сетей, состоящих из базовых радиостанций с большими антеннами. RAN беспроводным способом подключает пользовательское оборудование к базовой сети. Базовая сеть 5G упрощает различные сетевые функции, такие как управление сеансами, аутентификация, контроль политик, хранение данных и т. д. Доступно несколько реализаций базовой сети 5G с открытым исходным кодом. Free5GC, Open5GS — две самые популярные реализации базовой сети 5G.
Архитектура 5G Core
В отличие от предыдущих сотовых сетей, архитектура базовой сети 5G разработана с использованием виртуализации сетевых функций и программно-определяемой сети. В основном базовая сеть 5G разработана с использованием шаблона проектирования на основе микросервисов. Различные службы данных и требования 5GC (также называемые сетевыми функциями) реализованы в виде микросервисов. Эти микросервисы (сетевые функции) будут развернуты как собственные облачные приложения. Базовая система 5G состоит из следующих сетевых функций (NF). Эти функции разделены на две основные плоскости: плоскость управления и плоскость пользователя:
-
User plane Function (UPF)
-
Data network (DN), e.g. operator services, Internet access or 3rd party services
-
Core Access and Mobility Management Function (AMF)
-
Authentication Server Function (AUSF)
-
Session Management Function (SMF)
-
Network Slice Selection Function (NSSF)
-
Network Exposure Function (NEF)
-
NF Repository Function (NRF)
-
Policy Control function (PCF)
-
Unified Data Management (UDM)
-
Application Function (AF)
Взаимодействие этих сервисов (с UE и 5G-RAN) и их соответствующие интерфейсы описаны на следующем рисунке. При развертывании базовой сети 5G мы в основном развертываем все эти сервисы в облаке как собственное облачное приложение.
Open5GS
Open5GS — это реализация базовой мобильной сети 5G с открытым исходным кодом. Конечной целью этого проекта является реализация базовой сети 5G, определенной в выпуске 3GPP. В настоящее время он поддерживает выпуск 16 3GPP с предоставлением ядра 5G (AMF, SMF+PGW-c, UPF+PGW-u, PCF, UDR, UDM, сетевые функции AUSF, NRF) и сетевые функции Evolved Packet Core (MME, SGW-c, SGW-u, HSS и PCRF).
UERANSIM
UERANSIM — это реализация 5G UE и 5G RAN (gNodeB) с открытым исходным кодом. В общих чертах его можно рассматривать как мобильный телефон 5G и базовую станцию. С точки зрения UE/RAN существует 3 основных интерфейса:
-
интерфейс управления (между RAN и AMF)
-
пользовательский интерфейс (между RAN и UPF)
-
радиоинтерфейс (между UE и RAN)
UERANSIM поддерживает работу с базовыми сетями Open5GS и Free5GC 5G. Мы можем подключить UERANSIM к одной из этих сетей 5G Core и протестировать функциональность.
Развертывание ядра 5G
В этом сценарии я развернул базовую сеть 5G с Open5GS и смоделировал gNB/UE с помощью UERANSIM. Open5GS развернут на одном сервере (IP 172.31.13.16), а UERANSIM развернут на другом сервере (IP 172.31.13.37). Архитектура развертывания описана на следующем рисунке.
Ниже приведены основные шаги, которые необходимо выполнить при развертывании. Если вы настраиваете эту среду в облаке (например, AWS, gGloud), обязательно откройте все порты TCP и SCTP между серверами в локальной сети (связь gNB и AMF происходит через SCTP).
1. Install Open5GS
Open5GS может быть установлен как собственный сервис демона Linux. Также его можно развернуть с помощью Docker, Kubernetes и Helm Charts. Я развернул его как собственное сервисное приложение демона Linux. При его запуске сеть 5G работает как службы демона Linux. Ниже приведен способ установки Open5GS на server1.
# install open5gs as daemon service sudo apt update sudo apt install software-properties-common sudo add-apt-repository ppa:open5gs/latest sudo apt update sudo apt install open5gs
2. Setup Open5GS
Я развертываю 5G Core и gNB на отдельных серверах. Поэтому мне нужно настроить адрес привязки NGAP для AMF (IP-адрес работающего ядра 5G) и адрес привязки GTPU для UPF (IP-адрес работающего ядра 5G). Тогда только gNB и UE смогут подключиться к базовой сети 5G. Если вы используете стек gNB и 5G Core на одном сервере, вам не нужно вносить эти изменения. Ниже приведены конфигурации, которые я сделал. После выполнения этих настроек я перезапустил службы AMF и UPF.
# amf config file locates in /etc/open5gs/amf.yaml # ngap addr configured to 5g core server ip amf: sbi: - addr: 127.0.0.5 port: 7777 ngap: - addr: 172.31.10.16 --- # restart amf services sudo systemctl restart open5gs-amfd --- # amf logs can be found in /var/log/open5gs/amf.log sudo tail -f /var/log/open5gs/amf.log 11/07 04:17:26.737: [amf] INFO: [Removed] Number of AMF-UEs is now 0 (../src/amf/context.c:1268) 11/07 04:17:26.738: [sctp] INFO: AMF terminate...done (../src/amf/app.c:42) Open5GS daemon v2.3.6 11/07 04:17:26.762: [app] INFO: Configuration: '/etc/open5gs/amf.yaml' (../lib/app/ogs-init.c:129) 11/07 04:17:26.762: [app] INFO: File Logging: '/var/log/open5gs/amf.log' (../lib/app/ogs-init.c:132) 11/07 04:17:26.764: [sbi] INFO: nghttp2_server() [127.0.0.5]:7777 (../lib/sbi/nghttp2-server.c:144) 11/07 04:17:26.764: [amf] INFO: ngap_server() [172.31.10.16]:38412 (../src/amf/ngap-sctp.c:53) 11/07 04:17:26.764: [sctp] INFO: AMF initialize...done (../src/amf/app.c:33) 11/07 04:17:26.766: [amf] INFO: [9d83b430-3f81-41ec-9db3-4f03c19e0a68] NF registred [Heartbeat:10s] (../src/amf/nf-sm.c:198)
# upf config file locates in /etc/open5gs/upf.yaml # gtpu addr configured to 5g core server ip upf: pfcp: - addr: 127.0.0.7 gtpu: - addr: 172.31.10.16 subnet: - addr: 10.45.0.1/16 - addr: 2001:230:cafe::1/48 --- # restart upf services sudo systemctl restart open5gs-upfd --- # upf logs can be found in /var/log/open5gs/upf.log sudo tail -f /var/log/open5gs/upf.log 11/07 04:18:19.224: [app] INFO: SIGTERM received (../src/main.c:53) 11/07 04:18:19.224: [app] INFO: Open5GS daemon terminating... (../src/main.c:212) 11/07 04:18:19.225: [upf] INFO: PFCP de-associated (../src/upf/pfcp-sm.c:178) 11/07 04:18:19.225: [upf] INFO: [Removed] Number of UPF-sessions is now 0 (../src/upf/context.c:190) 11/07 04:18:19.226: [app] INFO: UPF terminate...done (../src/upf/app.c:39) Open5GS daemon v2.3.6 11/07 04:18:19.243: [app] INFO: Configuration: '/etc/open5gs/upf.yaml' (../lib/app/ogs-init.c:129) 11/07 04:18:19.243: [app] INFO: File Logging: '/var/log/open5gs/upf.log' (../lib/app/ogs-init.c:132) 11/07 04:18:19.256: [pfcp] INFO: pfcp_server() [127.0.0.7]:8805 (../lib/pfcp/path.c:30) 11/07 04:18:19.256: [gtp] INFO: gtp_server() [172.31.10.16]:2152 (../lib/gtp/path.c:30) 11/07 04:18:19.257: [app] INFO: UPF initialize...done (../src/upf/app.c:31) 11/07 04:18:22.553: [pfcp] INFO: ogs_pfcp_connect() [127.0.0.4]:8805 (../lib/pfcp/path.c:59) 11/07 04:18:22.553: [upf] WARNING: cannot handle PFCP message type[1] (../src/upf/pfcp-sm.c:139) 11/07 04:18:25.054: [pfcp] WARNING: [5341] REMOTE Request Duplicated. Discard! for step 1 type 1 peer [127.0.0.4]:8805 (../lib/pfcp/xact.c:403) 11/07 04:18:27.557: [pfcp] WARNING: [5341] REMOTE Request Duplicated. Discard! for step 1 type 1 peer [127.0.0.4]:8805 (../lib/pfcp/xact.c:403) 11/07 04:18:30.060: [upf] INFO: PFCP associated (../src/upf/pfcp-sm.c:173)
3. NAT Port Forwarding
Чтобы создать мост между 5G Core UPF и WAN (Интернет), мне нужно включить переадресацию IP и добавить правило NAT в таблицы IP. Ниже приведены перенаправления портов NAT, которые я сделал. Без этого порта переадресация подключения от 5G Core к Интернету не работала бы.
# nat port forwarding sudo sysctl -w net.ipv4.ip_forward=1 sudo iptables -t nat -A POSTROUTING -o enp0s3 -j MASQUERADE sudo systemctl stop ufw sudo iptables -I FORWARD 1 -j ACCEPT # if above setup not works try to manually create tun interface and do nat forwarding sudo ip tuntap add name ogstun mode tun sudo ip addr add 10.45.0.1/16 dev ogstun sudo ip addr add 2001:230:cafe::1/48 dev ogstun sudo ip link set ogstun up
4. Register UE Device
Далее мне нужно зарегистрировать устройство UE на 5G Core. Open5GS предоставляет приложение WebUI. Я могу зарегистрировать устройство UE через подключение к WebUI. Ниже приведен способ как сделать это.
# install nodejs sudo apt update sudo apt install curl curl -fsSL https://deb.nodesource.com/setup_14.x | sudo -E bash - sudo apt install nodejs # clone webui git clone https://github.com/open5gs/open5gs.git # run webui with npm cd webui npm run dev --host 0.0.0.0 # the web interface will start on http://localhost:3000 # webui login credentials username - admin password - 1423 # add new subscriber # the default device information can be found in open5gs config on UERANSIM IMSI: 901700000000001 Subscriber Key: 465B5CE8B199B49FAA5F0A2EE238A6BC USIM Type: OPc Operator Key: E8ED289DEBA952E4283B54E88E6183CA
WebUI запускается на порту 3000 на server1. Подключитесь к WebUI и войдите в систему с учетными данными admin/1423. Затем добавьте нового абонента с IMSI: 901700000000001 и другой информацией по умолчанию.
5. Install UERANSIM
Затем я установил UERANSIM на server2. Установка выполняется с помощью файла, доступного в репозитории URANSIM. Ниже приведен способ установки UERANSIM.
# install cmake # UERANSIM does not work with the apt version of cmake, that's why we need to install snap and the snap version of cmake: sudo apt update sudo apt upgrade sudo apt install make g++ libsctp-dev lksctp-tools iproute2 sudo snap install cmake --classic # install ueransim git clone https://github.com/aligungr/UERANSIM cd UERANSIM make
6. Setup gNB
UERANSIM состоит из двух частей gNB и UE. Файлы конфигурации gNB, относящиеся к Open5GS, находятся в URANSIM/config/open5gs-gnb.yaml. Мне нужно настроить linkIp, ngapIp, gtpIp и amfConfigs: адрес в файле конфигурации. linkIp, ngapIp, gtpIp настроены с IP-адресом server2 (IP-адрес работающего сервера UERANSIM). amfConfigs: адрес — это IP-адрес server1 (IP-адрес работающего сервера Open5GC). gNB можно запустить с помощью сценария UERANSIM/build/nr-gnb, используя файл конфигурации UERANSIM/config/open5gs-gnb.yaml.
# configure with server1 IP linkIp: 172.31.13.37 # gNB's local IP address for Radio Link Simulation (Usually same with local IP) ngapIp: 172.31.13.37 # gNB's local IP address for N2 Interface (Usually same with local IP) gtpIp: 172.31.13.37 # gNB's local IP address for N3 Interface (Usually same with local IP) # list of AMF address information # configure with server2 IP amfConfigs: - address: 172.31.10.16 port: 38412 --- # start gnb with open5gc-gnb.yaml config file ./build/nr-gnb -c config/open5gs-gnb.yaml # output UERANSIM v3.2.4 [2021-11-07 04:39:11.240] [sctp] [info] Trying to establish SCTP connection... (172.31.10.16:38412) [2021-11-07 04:39:11.243] [sctp] [info] SCTP connection established (172.31.10.16:38412) [2021-11-07 04:39:11.244] [sctp] [debug] SCTP association setup ascId[4] [2021-11-07 04:39:11.244] [ngap] [debug] Sending NG Setup Request [2021-11-07 04:39:11.245] [ngap] [debug] NG Setup Response received [2021-11-07 04:39:11.245] [ngap] [info] NG Setup procedure is successful
7. Setup UE
Файлы конфигурации UERANSIM UE, относящиеся к Open5GS, находятся в UERANSIM/config/open5gs-ue.yaml. Мне нужно настроить gnbSearchList с IP-адресом server2 (IP-адрес работающего сервера UERANSIM). UE можно запустить с помощью сценария UERANSIM/build/nr-ue, используя файл конфигурации UERANSIM/config/open5gs-ue.yaml. Еще одна вещь, на которую следует обратить внимание, это то, что open5gs-ue.yaml определяет конфигурации устройств UE. Мы использовали эти конфигурации при регистрации подписчика в ядре Open5GC 5G через WebUI.
# ue device config # IMSI number of the UE. IMSI = [MCC|MNC|MSISDN] (In total 15 digits) supi: 'imsi-901700000000001' # Mobile Country Code value of HPLMN mcc: '901' # Mobile Network Code value of HPLMN (2 or 3 digits) mnc: '70' # Permanent subscription key key: '465B5CE8B199B49FAA5F0A2EE238A6BC' # Operator code (OP or OPC) of the UE op: 'E8ED289DEBA952E4283B54E88E6183CA' # This value specifies the OP type and it can be either 'OP' or 'OPC' opType: 'OPC' # Authentication Management Field (AMF) value amf: '8000' # IMEI number of the device. It is used if no SUPI is provided imei: '356938035643803' # IMEISV number of the device. It is used if no SUPI and IMEI is provided imeiSv: '4370816125816151' # IMEISV number of the device. It is used if no SUPI and IMEI is provided imeiSv: '4370816125816151' --- # List of gNB IP addresses for Radio Link Simulation # configure with server2 IP gnbSearchList: - 172.31.13.37 --- # start gnb with open5gc-ue.yaml config file sudo ./build/nr-ue -c config/open5gs-ue.yaml # output UERANSIM v3.2.4 [2021-11-07 04:50:08.323] [nas] [info] UE switches to state [MM-DEREGISTERED/PLMN-SEARCH] [2021-11-07 04:50:08.323] [rrc] [debug] New signal detected for cell[1], total [1] cells in coverage [2021-11-07 04:50:08.323] [nas] [info] Selected plmn[901/70] [2021-11-07 04:50:08.323] [rrc] [info] Selected cell plmn[901/70] tac[1] category[SUITABLE] [2021-11-07 04:50:08.323] [nas] [info] UE switches to state [MM-DEREGISTERED/PS] [2021-11-07 04:50:08.323] [nas] [info] UE switches to state [MM-DEREGISTERED/NORMAL-SERVICE] [2021-11-07 04:50:08.323] [nas] [debug] Initial registration required due to [MM-DEREG-NORMAL-SERVICE] [2021-11-07 04:50:08.324] [nas] [debug] UAC access attempt is allowed for identity[0], category[MO_sig] [2021-11-07 04:50:08.324] [nas] [debug] Sending Initial Registration [2021-11-07 04:50:08.324] [nas] [info] UE switches to state [MM-REGISTER-INITIATED] [2021-11-07 04:50:08.324] [rrc] [debug] Sending RRC Setup Request [2021-11-07 04:50:08.325] [rrc] [info] RRC connection established [2021-11-07 04:50:08.325] [rrc] [info] UE switches to state [RRC-CONNECTED] [2021-11-07 04:50:08.325] [nas] [info] UE switches to state [CM-CONNECTED] [2021-11-07 04:50:08.330] [nas] [debug] Authentication Request received [2021-11-07 04:50:08.333] [nas] [debug] Security Mode Command received [2021-11-07 04:50:08.333] [nas] [debug] Selected integrity[2] ciphering[0] [2021-11-07 04:50:08.339] [nas] [debug] Registration accept received [2021-11-07 04:50:08.339] [nas] [info] UE switches to state [MM-REGISTERED/NORMAL-SERVICE] [2021-11-07 04:50:08.339] [nas] [debug] Sending Registration Complete [2021-11-07 04:50:08.339] [nas] [info] Initial Registration is successful [2021-11-07 04:50:08.339] [nas] [debug] Sending PDU Session Establishment Request [2021-11-07 04:50:08.339] [nas] [debug] UAC access attempt is allowed for identity[0], category[MO_sig] [2021-11-07 04:50:08.542] [nas] [debug] Configuration Update Command received [2021-11-07 04:50:08.551] [nas] [debug] PDU Session Establishment Accept received [2021-11-07 04:50:08.551] [nas] [info] PDU Session establishment is successful PSI[1] [2021-11-07 04:50:08.560] [app] [info] Connection setup for PDU session[1] is successful, TUN interface[uesimtun0, 10.45.0.5] is up.
8. Test 5G Network
При запуске UERANSIM UE он создает сеанс PDU и сетевой интерфейс TUN uesimtun0. Вы можете найти IP-адрес сеанса PDU и адрес TUN в журналах UE (интерфейс TUN [uesimtun0, 10.45.0.3]). Мы можем использовать интернет-соединение UE из другого приложения через этот интерфейс TUN. Например, если мы используем простую команду curl с интерфейсом uesimtun0 (например, curl —interface uesimtun0 «https://httpbin.org/get«), она направит пакет в Интернет через базовую сеть Open5GC 5G, как показано на следующей диаграмме.
Кроме того, UERANSIM предоставляет инструмент UERANSIM/build/nr-binder для привязки внешних приложений к интерфейсу TUN. Мы можем привязать интерфейс uesimtun0 практически к любому приложению, используя UERANSIM/build/nr-binder. Ниже приведен способ использования UERANSIM/build/nr-binder с различными приложениями. Я тестировал его с приложениями ping, curl, docker, python.
# ping command bind direcly to uesimtun0 ping -I uesimtun0 google.com # curl command bind direcly to uesimtun0 curl \ --interface uesimtun0 \ -X GET "https://httpbin.org/get" --- # bind curl command via nr-binder # nr-binder use pdu session ip ./nr-binder 10.45.0.3 curl -X GET "https://httpbin.org/get" --- # run docker container via nr-binder ./nr-binder 10.45.0.3 docker run -d -p 9091:80 kennethreitz/httpbin --- # bind python application via nr-binder # request.pyt is simple python program which send http GET request ./nr-binder 10.45.0.3 python3 request.py --- # bind shell scrip via nr-binder # httpbin.sh is simple shell script which runs httpbin as docker container ./nr-binder 10.45.0.3 ./httpbin.sh
9. Image Streaming via 5G Core
В приведенной выше настройке интерфейс UERANSIM UE TUN (uesimtun0) может быть доступен только через работающую машину UERANSIM. Это означает, что мы можем подключиться к базовой сети 5G только с работающей машины UERANSIM. В моем сценарии я хотел передавать изображения на TCP-сервер (который находится в общедоступном Интернете) от внешнего клиента (который находится за пределами сервера URANSIM) через базовую сеть 5G. Примером сценария может быть потоковая передача изображений с устройства виртуальной реальности на сервер потоковой передачи через базовую сеть 5G. Чтобы добиться этой настройки, я применил обходной путь, используя прокси-сервер TCP. Ниже приведена архитектура установки.
Служба UERANSIM работает на сервере с публичным IP 3.237.100.204. Служба потоковой передачи изображений работает на сервере с общедоступным IP-адресом 100.27.44.103. Я запустил прокси-сервер TCP на порту 7654 внутри сервера 3.237.100.204. Служба потоковой передачи изображений работает на порту 7654 на сервере 100.27.44.103. Прокси-сервер TCP перенаправляет входящие пакеты с 3.237.100.204:7654 на 100.27.44.103:7654. Я использовал следующую команду docker для запуска прокси-сервера TCP.
# tcp proxy server forward the incoming traffic of port 7654 to 100.27.44.103:7654 docker run -d -it --rm -p 7654:7654 hpello/tcp-proxy 100.27.44.103 7654
Эта команда докера добавляется в сценарий оболочки с именем tcp-proxy.sh и запускается с помощью nr-binder. Затем весь трафик прокси-сервиса TCP проходит через базовую сеть 5G.
# run tcp proxy server with nr-biner # all traffic of tcp proxy server will goes through the 5g core sudo ./nr-binder 10.45.0.13 ./tcp-proxy.sh
Ниже приведен простой сервер потоковой передачи изображений, написанный на Python. Он прослушивает порт 7654 и входящие изображения, сохраненные в вызываемом каталоге. Я запустил потоковый сервер с помощью команды python3 stream-server.py.
import socket import time s = socket.socket() host = socket.gethostname() port = 7654 s.bind((host, port)) s.listen(5) while True: c, addr = s.accept() print('Got connection from', addr) # create image file n = 'out/' + str(int(time.time())) + '.png' f = open(n,'wb') # recive image l = c.recv(1024) while (l): f.write(l) l = c.recv(1024) f.close() print('Done Receiving') c.close()
Ниже приведено клиентское приложение потоковой передачи изображений, написанное с помощью Python. Он считывает образ с диска и отправляет потоки на прокси-сервер TCP, который работает на сервере 3.237.100.204:7654. Затем прокси-сервер перенаправляет потоки изображений на сервер потоковой передачи изображений 100.27.44.103:7654 через базовую сеть 5G. Я запустил клиент потоковой передачи с помощью команды python3 stream-client.py.
import socket # client socker s = socket.socket() host = '3.237.100.204' port = 7654 s.connect((host, port)) print('Connected to server') # send image f = open('hak.png','rb') l = f.read(1024) while (l): s.send(l) l = f.read(1024) print('Sent image') # image sent close connection f.close() s.close
Reference
ссылка на оригинал статьи https://habr.com/ru/post/708738/
Добавить комментарий