文章目录
- 摘要
- 引言
- 关键技术介绍
- 5G核心网
- 核心网网元功能
- 网络切片
- OAI
- Docker
- 官方例程详解
- 整体介绍
- 具体详解
- 网络切片架构
- 部署概览与说明
- 1-4
- 1.预先准备
- 5.部署OAI 5G核心网
- 6.获取基站仿真docker镜像
- 7.部署基站仿真
- 8.通信测试
- 9.分析结果
- 10. 使用多切片的UE
- 11. 解除部署
- 11.1解除RAN部署
- 11.2解除5G CN部署
- 脚本文件解析
- docker-compose 基础解释
- docker-compose-slicing-basic-nrf.yaml
- mysql服务
- oai-nssf服务
- oai_udr服务
- oai_udm服务
- oai_ausf服务
- oai_nrf_slice12服务
- oai_nrf_slice3服务
- oai_amf服务
- oai_smf_slice1服务
- oai_smf_slice2服务
- oai_smf_slice3服务
- 三个smf的对比
- oai_spgwu_slice1服务
- oai_spgwu_slice2服务
- 两个spgwu对比
- vpp_upf_slice3服务
- VPP_MAIN_CORE与VPP_CORE_WORKER
- healthcheck
- VPP
- VPP_PLUGIN_PATH &VPP_MAIN_CORE=0 & VPP_CORE_WORKER
- REALM
- DNN
- VPP_PLUGIN_PATH
- IF_X_NWI
- oai_ext_dn服务
- networks
- docker-compose-slicing-ransim.yaml
- ueransim服务
- oai-gnb服务
- oai-nr-ue1服务
- gnbsim服务
- 实验过程
- 实验设备介绍
- 实验部署流程
- Vmware安装
- Ubuntu安装
- VMware tool工具安装
- Ubuntu 中文输入法设置
- 安装docker
- 安装docker-compose
- 下载镜像
- docker hub设置
- 下载核心网镜像
- 下载核心网代码
- 创建存储日志的文件夹
- 启动网络切片核心网
- 下载与仿真基站镜像
- 接入仿真基站容器
- ue到核心网通信测试
- 保证运行日志
- 停止部署
- 实验调试过程
- 实验结论分析与总结
- 结论
- 参考文献
- 附录1
- docker-compose-slicing-basic-nrf.yaml
- docker-compose-slicing-ransim.yaml
摘要
本文主要根据OpenAirInterface(OAI)官方的提供的5G独立组网网络切片例程,对其进行详细的剖析并进行部署,首先在引言部分对文章整体进行介绍,在关键技术部分对实验用到的关键技术与官方例程进行详解,在实验过程部分详细介绍部署的流程,主要在一台Windows机器上安装Vmware应用程序,在Vmware上安装Ubuntu18.04 Linux机器,然后下载一系列支持环境与部署代码,包括Docker、docker-compose等等,再进行例程的部署,在结论部分将对整个实验进行总结。
关键词:5G 网络切片 OAI Docker 仿真
引言
先不讲
关键技术介绍
5G核心网
先不讲
核心网网元功能
具体见 3GPP 23.501的大体介绍与 29.5xx的详细介绍
NRF(网络存储功能)用来进行NF登记、管理、状态检测,实现所有NF的自动化管理,每个NF启动时,必须要到NRF进行注册登记才能提供服务,登记信息包括NF类型、地址、服务列表等
网络切片
先不讲,在一个物理网络中虚拟出多个端到端互相隔离的网络用于支持不同的应用场景
OAI
先不讲,一个通信仿真平台,支持对5G核心网的仿真,只需要一个电脑,你就可以仿真出一个核心网
Docker
先不讲,虚拟化技术,对比虚拟机更加轻量级、快速部署
官方例程详解
整体介绍
官方例程首先贴出了部署网络切片的架构图,以及阅读例程、部署例程的时间,部署需要的电脑配置,部署的流程表,使用到的镜像与其版本,本例程涉及到的5G网络切片的特征,OAI 5G网络切片现在的支持情况。然后是部署的详细11个步骤。
本详解约等于对官方例程的中文翻译,然后注释上本人在阅读例程中的个人理解,其中斜体为本人理解。
具体详解
网络切片架构
该架构中核心网网元有公用部分与专用部分,主要是不同UE会使用到不同的UPF(用户面功能)。切片分为三个S-NSSAI(单网络切片选择辅助信息),使用三个不同的ue-gnb组接入相同的AMF(接入管理功能),通过NSSF(网络切片选择功能)根据不同的SST(切片/服务类型)与SD(切片区分)来接入不同的切片。既有使用单独NRF也有使用公用NRF,展现了不同的切片组合类型。
部署概览与说明
阅读时间:30 min
复现时间:1.5 h
推荐资源:6GB RAM 4CPU
注意:如果读者有兴趣部署具有更多日志的调试器/开发人员核心网络环境,请按照本教程进行操作。
目录
- 先决条件
- 构建容器映像或检索容器映像
- 配置主机
- 配置OAI 5G核心网功能
- 部署OAI 5G核心网
- 获取 ransim docker 镜像
- 执行 ransim 场景
- 交通测试
- 分析方案结果
- 具有多个 S-NSSAI 的 UE
- 取消部署网络功能
构建的镜像及标签如下表,当然也可以从docker-hub拉取镜像:
在本教程中,我们将探讨OAI 5G核心网的切片功能。在这里,我们将验证 :
- 基于S-NSSAI的UPF选择
- 基于 S-NSSAI 的 SMF 选择
- 基于S-NSSAI的NRF选择(在NSSF的帮助下)
- 基于 S-NSSAI 的 AMF 选择(在 NSSF 的帮助下 - 下一个版本,2022 年3月)
- 单UE多切片
网络切片在 PLMN 中定义,它包含 5G 核心网和 5G RAN 组件。网络切片被标识为单网络切片选择辅助信息 (S-NSSAI)。S-NSSAI由切片/服务类型(SST)和切片差异化器(SD)组成。SST 是一个必填字段,它根据功能和服务定义预期的切片行为。而SD是一个可选字段,可用于区分多个切片。
目前,3GPP允许NSSAI中最多八个S-NSSAI在UE和网络之间发送信令消息,这意味着单个UE一次最多可以由八个网络切片提供服务。SST 长度为 8 位;因此,它可以提供 2^8= 256 个 SST 值,其中有标准化 SST 的保留值 O 到 127(例如 SST 2 = URLCC、SST 3 = MIoT、SST 4 = V2X 等)。
当前OAI 5G 网络切片的状态:
- NSSF: NSSF 目前支持在 PDU 会话建立请求期间进行切片选择。当 AMF 未在本地配置 NRF 信息时,在 NSSF 的帮助下,它会根据提供的 S-NSSAI 发现合适的 NRF。
- AMF :AMF 从相应 NRF 提供的 NF 实例列表(SMF 实例)中选择第一个可用的 SMF。
- SMF:SMF 可以同时关联多个 UPF如上图中的2和3。UPF是根据S-NSSAI和DNN选择的。
如上图所示,配置了 3 个 S-NSSAI(可以用颜色区分),如下:
- 切片 1: [SST=128,SD=128] => NRF1, SMF1, UPF1, GNB1, UE1
- 切片2: [SST=1] => NRF1, SMF2, UPF2, GNB2, UE2
- 切片3: [SST=130,SD=130] => NRF2, SMF3, VPP-UPF3, GNB3, UE3
注:这里我们使用了标准化的 SST 值 (2,3,4),因为 rf-simulator仅支持 SST 值 1,2,3,4。此外,它仅用于数字参考,并不反映标准的SST行为,例如URLCC,MIoT,V2X等
在这里,AMF,NSSF,UDM,UDR,AUSF对所有切片都是通用的。切片 1 和 2 中的 SMF 和 UPF 具有相同的 NRF,因此两个 SMF 都可以发现这两个 UPF。您可以在日志中验证两个 SMF 是否已成功关联到切片 2 和 3 中的两个 UPF。在这里,在单一(NSI)NRF下注册的SMF / UPF的数量是运营商网络规划的一部分。
1-4
步骤 1 到 4 类似于前面的教程,例如最小核心网或基础核心网,请按照以这些骤部署OAI 5G核心网组件。
1.预先准备
创建一个文件夹,您可以在其中存储本教程的所有结果文件,然后将它们与我们提供的结果文件进行比较,我们建议创建完全相同的文件夹,以免事后中断命令流。
这是1-4步中不同于mini-CN与basic-CN中的部分
docker-compose-host $: mkdir -p /tmp/oai/mini-gnbsim
docker-compose-host $: chmod 777 /tmp/oai/mini-gnbsim
创建了该文件夹后续会手动将日志等存储在这里
5.部署OAI 5G核心网
我们部署了带有附加组件oai-nssf的5G核心版本。我们将使用docker-compose来部署5G核心网,如下:
docker-compose-host $: docker-compose -f docker-compose-slicing-basic-nrf.yaml up -d
docker-compose-host $: docker-compose -f docker-compose-slicing-basic-nrf.yaml up -d mysql
Creating network "demo-oai-public-net" with driver "bridge"
Creating network "oai-public-access" with the default driver
Creating network "oai-public-core" with the default driver
Creating mysql ... done
**注意:**如果这是第一次,或者您计划运行实验很长时间:不要抓包。 而出于 CI 目的,我们将捕获数据包,并且不会长时间运行它,因此 PCAP 文件不会太大。
我们使用复杂的过滤器在docker 网络中抓包 - >更小的的PCAP文件。
docker-compose-host $: nohup sudo tshark -i demo-oai -f '(not host 192.168.70.145 and not host 192.168.70.154) or (host 192.168.70.145 and icmp)' -w /tmp/oai/slicing-with-nssf/slicing-with-nssf.pcap > /tmp/oai/slicing-with-nssf/slicing-with-nssf.log 2>&1 &
这是一个Linux命令,用于在后台运行tshark命令,将demo-oai接口上的数据包捕获并写入到/tmp/oai/slicing-with-nssf/slicing-with-nssf.pcap文件中。具体来说,-i选项指定了要捕获的接口,-f选项指定了过滤规则,只捕获不是192.168.70.145和192.168.70.154主机的数据包,或者目的地址是192.168.70.145且协议是ICMP的数据包。>操作符将标准输出重定向到/tmp/oai/slicing-with-nssf/slicing-with-nssf.log文件中,2>&1表示将标准错误输出重定向到标准输出,&操作符将命令放到后台运行。nohup命令用于在退出终端或注销时仍然保持命令运行。
docker-compose-host $: sudo chmod 666 /tmp/oai/slicing-with-nssf/slicing-with-nssf.*
确保所有容器都健康:
docker-compose-host $: docker-compose -f docker-compose-slicing-basic-nrf.yaml ps -a
Name Command State Ports
-----------------------------------------------------------------------------------------------
mysql docker-entrypoint.sh mysqld Up (healthy) 3306/tcp, 33060/tcp
oai-amf /bin/bash /openair-amf/bin ... Up (healthy) 38412/sctp, 80/tcp, 9090/tcp
oai-ausf /bin/bash /openair-ausf/bi ... Up (healthy) 80/tcp
oai-ext-dn /bin/bash -c apt update; ... Up (healthy)
oai-nrf-slice12 /bin/bash /openair-nrf/bin ... Up (healthy) 80/tcp, 9090/tcp
oai-nrf-slice3 /bin/bash /openair-nrf/bin ... Up (healthy) 80/tcp, 9090/tcp
oai-nssf /bin/bash /openair-nssf/bi ... Up (healthy) 80/tcp, 8080/tcp
oai-smf-slice1 /bin/bash /openair-smf/bin ... Up (healthy) 80/tcp, 8805/udp, 9090/tcp
oai-smf-slice2 /bin/bash /openair-smf/bin ... Up (healthy) 80/tcp, 8805/udp, 9090/tcp
oai-smf-slice3 /bin/bash /openair-smf/bin ... Up (healthy) 80/tcp, 8805/udp, 9090/tcp
oai-spgwu-slice1 /openair-spgwu-tiny/bin/en ... Up (healthy) 2152/udp, 8805/udp
oai-spgwu-slice2 /openair-spgwu-tiny/bin/en ... Up (healthy) 2152/udp, 8805/udp
oai-udm /bin/bash /openair-udm/bin ... Up (healthy) 80/tcp
oai-udr /bin/bash /openair-udr/bin ... Up (healthy) 80/tcp
vpp-upf-slice3 /openair-upf/bin/entrypoin ... Up (healthy) 2152/udp, 8085/udp
6.获取基站仿真docker镜像
我们使用 3 种不同的 ran 模拟器:ueransim、rfsimulator 和gnbsim 用于切片 2、3 和 4。它们中的每一个都有自己的一组功能,可以根据需要使用。不同的 ran 模拟器用法在这里模拟了现实的部署场景,其中运营商可以在网络中部署多供应商设备。
可以从官方仓库中提取 docker 镜像,如下所示 :
$ docker pull rohankharade/gnbsim:latest
$ docker pull rohankharade/ueransim:latest
$ docker pull oaisoftwarealliance/oai-gnb:develop
$ docker pull oaisoftwarealliance/oai-nr-ue:develop
并重新标记它们,以便教程的 docker-compose 文件正常工作:
$ docker image tag rohankharade/gnbsim:latest gnbsim:latest
$ docker image tag rohankharade/ueransim:latest ueransim:latest
7.部署基站仿真
使用如下docker-compose部署切片1的仿真基站:
docker-compose-host $: docker-compose -f docker-compose-slicing-ransim.yaml up -d ueransim
Creating ueransim ... done
等待5-10s后部署切片2的仿真基站:
docker-compose-host $: docker-compose -f docker-compose-slicing-ransim.yaml up -d oai-gnb oai-nr-ue1
Creating rfsim5g-oai-gnb ... done
Creating rfsim5g-oai-nr-ue1 ... done
等待5-10s后部署切片3的仿真基站:
docker-compose-host $: docker-compose -f docker-compose-slicing-ransim.yaml up -d gnbsim
Creating gnbsim ... done
等待5-10s,确认所有的仿真基站服务都健康:
docker-compose-host $: docker-compose -f docker-compose-slicing-ransim.yaml ps -a
Name Command State Ports
--------------------------------------------------------------------------
gnbsim /gnbsim/bin/entrypoint.sh ... Up (healthy)
rfsim5g-oai-gnb /opt/oai-gnb/bin/entrypoin ... Up (healthy)
rfsim5g-oai-nr-ue1 /opt/oai-nr-ue/bin/entrypo ... Up (healthy)
ueransim /ueransim/bin/entrypoint.sh Up (healthy)
成功部署后,我们可以在 AMF 验证所有 gnb 和 UE 是否已成功注册到网络。
docker-compose-host $: docker logs oai-amf
[2021-12-13T20:47:20.265472] [AMF] [amf_app] [info ] |----------------------------------------------------------------------------------------------------------------|
[2021-12-13T20:47:20.265497] [AMF] [amf_app] [info ] |----------------------------------------------------gNBs' information-------------------------------------------|
[2021-12-13T20:47:20.265503] [AMF] [amf_app] [info ] | Index | Status | Global ID | gNB Name | PLMN |
[2021-12-13T20:47:20.265522] [AMF] [amf_app] [info ] | 1 | Connected | 0x1 |UERANSIM-gnb-208-95-1 | 208, 95 |
[2021-12-13T20:47:20.265530] [AMF] [amf_app] [info ] | 2 | Connected | 0x1400 | | 208, 95 |
[2021-12-13T20:47:20.265537] [AMF] [amf_app] [info ] | 3 | Connected | 0xe000 | gnb-rfsim | 208, 95 |
[2021-12-13T20:47:20.265543] [AMF] [amf_app] [info ] |----------------------------------------------------------------------------------------------------------------|
[2021-12-13T20:47:20.265548] [AMF] [amf_app] [info ]
[2021-12-13T20:47:20.265553] [AMF] [amf_app] [info ] |----------------------------------------------------------------------------------------------------------------|
[2021-12-13T20:47:20.265558] [AMF] [amf_app] [info ] |----------------------------------------------------UEs' information--------------------------------------------|
[2021-12-13T20:47:20.265564] [AMF] [amf_app] [info ] | Index | 5GMM state | IMSI | GUTI | RAN UE NGAP ID | AMF UE ID | PLMN |Cell ID|
[2021-12-13T20:47:20.265951] [AMF] [amf_app] [info ] | 1| 5GMM-REGISTERED| 208950000000035| | 1| 2| 208, 95 | 256|
[2021-12-13T20:47:20.265967] [AMF] [amf_app] [info ] | 2| 5GMM-REGISTERED| 208950000000036| | -1441334349| 3| 208, 95 |14680064|
[2021-12-13T20:47:20.265976] [AMF] [amf_app] [info ] | 3| 5GMM-REGISTERED| 208950000000037| | -372062044| 4| 208, 95 |14680064|
8.通信测试
进行oai-ext-dn到UEs节点之间的通信测试
docker-compose-host $: docker logs gnbsim 2>&1 | tail -10
docker-compose-host $: docker logs oai-amf 2>&1 | tail -20
docker-compose-host $: docker exec oai-ext-dn ping -c 4 12.1.1.2
PING 12.1.1.2 (12.1.1.2) 56(84) bytes of data.
64 bytes from 12.1.1.2: icmp_seq=2 ttl=63 time=0.346 ms
64 bytes from 12.1.1.2: icmp_seq=3 ttl=63 time=0.286 ms
64 bytes from 12.1.1.2: icmp_seq=4 ttl=63 time=0.267 ms
--- 12.1.1.2 ping statistics ---
4 packets transmitted, 3 received, 25% packet loss, time 3059ms
rtt min/avg/max/mdev = 0.267/0.299/0.346/0.039 ms
docker-compose-host $: docker exec oai-ext-dn ping -c 4 12.2.1.2
PING 12.2.1.2 (12.2.1.2) 56(84) bytes of data.
64 bytes from 12.2.1.2: icmp_seq=1 ttl=63 time=1.00 ms
64 bytes from 12.2.1.2: icmp_seq=2 ttl=63 time=0.644 ms
64 bytes from 12.2.1.2: icmp_seq=3 ttl=63 time=0.504 ms
64 bytes from 12.2.1.2: icmp_seq=4 ttl=63 time=0.390 ms
--- 12.2.1.2 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3039ms
rtt min/avg/max/mdev = 0.390/0.635/1.004/0.232 ms
docker-compose-host $: docker exec oai-ext-dn ping -c 4 12.1.1.129
PING 12.1.1.129 (12.1.1.129) 56(84) bytes of data.
64 bytes from 12.1.1.129: icmp_seq=1 ttl=63 time=40.0 ms
64 bytes from 12.1.1.129: icmp_seq=2 ttl=63 time=39.5 ms
64 bytes from 12.1.1.129: icmp_seq=3 ttl=63 time=11.2 ms
64 bytes from 12.1.1.129: icmp_seq=4 ttl=63 time=11.2 ms
--- 12.1.1.129 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3003ms
rtt min/avg/max/mdev = 11.206/25.511/40.071/14.292 ms
docker logs gnbsim 2>&1 | tail -10
:这是一个Docker命令,用于查看名为gnbsim的Docker容器的日志。具体来说,这个命令会将容器的标准错误输出和标准输出合并起来,然后输出最后10行日志。其中,2>&1表示将标准错误输出重定向到标准输出,tail -10表示只显示最后10行日志。
这里就是分别在oai-ext-dn容器中ping仿真UE的Ip
9.分析结果
docker-compose-host $: docker logs oai-amf > /tmp/oai/slicing-with-nssf/amf.log 2>&1
docker-compose-host $: docker logs oai-ausf > /tmp/oai/slicing-with-nssf/ausf.log 2>&1
docker-compose-host $: docker logs oai-nssf > /tmp/oai/slicing-with-nssf/nssf.log 2>&1
docker-compose-host $: docker logs oai-udm > /tmp/oai/slicing-with-nssf/udm.log 2>&1
docker-compose-host $: docker logs oai-udr > /tmp/oai/slicing-with-nssf/udr.log 2>&1
docker-compose-host $: docker logs oai-nrf-slice12 > /tmp/oai/slicing-with-nssf/nrf-slice12.log 2>&1
docker-compose-host $: docker logs oai-nrf-slice3 > /tmp/oai/slicing-with-nssf/nrf-slice3.log 2>&1
docker-compose-host $: docker logs oai-smf-slice1 > /tmp/oai/slicing-with-nssf/smf-slice1.log 2>&1
docker-compose-host $: docker logs oai-smf-slice2 > /tmp/oai/slicing-with-nssf/smf-slice2.log 2>&1
docker-compose-host $: docker logs oai-smf-slice3 > /tmp/oai/slicing-with-nssf/smf-slice3.log 2>&1
docker-compose-host $: docker logs oai-spgwu-slice1 > /tmp/oai/slicing-with-nssf/spgwu-slice1.log 2>&1
docker-compose-host $: docker logs oai-spgwu-slice2 > /tmp/oai/slicing-with-nssf/spgwu-slice2.log 2>&1
docker-compose-host $: docker logs vpp-upf-slice3 > /tmp/oai/slicing-with-nssf/vpp-upf-slice3.log 2>&1
docker-compose-host $: docker logs gnbsim > /tmp/oai/slicing-with-nssf/gnbsim.log 2>&1
docker-compose-host $: docker logs rfsim5g-oai-gnb > /tmp/oai/slicing-with-nssf/rfsim5g-oai-gnb.log 2>&1
docker-compose-host $: docker logs rfsim5g-oai-nr-ue1 > /tmp/oai/slicing-with-nssf/rfsim5g-oai-nr-ue1.log 2>&1
docker-compose-host $: docker logs ueransim > /tmp/oai/slicing-with-nssf/ueransim.log 2>&1
这是一个Docker命令,用于将名为oai-udm的Docker容器的日志输出到/tmp/oai/slicing-with-nssf/udm.log文件中
容器对应IP:
官方对比抓包文件与日志文件:下载地址
10. 使用多切片的UE
OAI 5G CN还支持具有多个切片的UE。但是经过验证,基站仿真软件不支持一次具有多个切片的UE。
11. 解除部署
11.1解除RAN部署
docker-compose-host $: docker-compose -f docker-compose-slicing-ransim.yaml down -t 0
Stopping ueransim ... done
Stopping rfsim5g-oai-nr-ue1 ... done
Stopping rfsim5g-oai-gnb ... done
Removing ueransim ... done
Removing gnbsim ... done
Removing rfsim5g-oai-nr-ue1 ... done
Removing rfsim5g-oai-gnb ... done
Network demo-oai-public-net is external, skipping
Network oai-public-access is external, skipping
11.2解除5G CN部署
docker-compose-host $: docker-compose -f docker-compose-slicing-basic-nrf.yaml down -t 0
Stopping oai-spgwu-slice1 ... done
Stopping oai-smf-slice3 ... done
Stopping oai-smf-slice1 ... done
Stopping oai-smf-slice2 ... done
Stopping oai-amf ... done
Stopping oai-ausf ... done
Stopping oai-udm ... done
Stopping oai-udr ... done
Stopping vpp-upf-slice3 ... done
Stopping oai-spgwu-slice2 ... done
Stopping oai-nrf-slice12 ... done
Stopping mysql ... done
Stopping oai-nssf ... done
Stopping oai-ext-dn ... done
Stopping oai-nrf-slice3 ... done
Removing oai-spgwu-slice1 ... done
Removing oai-smf-slice3 ... done
Removing oai-smf-slice1 ... done
Removing oai-smf-slice2 ... done
Removing oai-amf ... done
Removing oai-ausf ... done
Removing oai-udm ... done
Removing oai-udr ... done
Removing vpp-upf-slice3 ... done
Removing oai-spgwu-slice2 ... done
Removing oai-nrf-slice12 ... done
Removing mysql ... done
Removing oai-nssf ... done
Removing oai-ext-dn ... done
Removing oai-nrf-slice3 ... done
Removing network demo-oai-public-net
Removing network oai-public-access
Removing network oai-public-core
-t 0
: 此选项指定停止容器的超时值,将其设置为零表示在删除容器和网络之前不会等待任何正在运行的进程停止
脚本文件解析
docker-compose 基础解释
以下面一段为例:
version: '3.8'
services:
mysql:
container_name: mysql
image: mysql:8.0
volumes:
- ./database/oai_db2.sql:/docker-entrypoint-initdb.d/oai_db.sql
- ./healthscripts/mysql-healthcheck2.sh:/tmp/mysql-healthcheck.sh
environment:
- TZ=Europe/Paris
- MYSQL_DATABASE=oai_db
- MYSQL_USER=test
- MYSQL_PASSWORD=test
- MYSQL_ROOT_PASSWORD=linux
healthcheck:
test: /bin/bash -c "/tmp/mysql-healthcheck.sh"
interval: 10s
timeout: 5s
retries: 30
networks:
public_net:
ipv4_address: 192.168.70.131
oai-nssf:
container_name: "oai-nssf"
image: oaisoftwarealliance/oai-nssf:v1.5.0
environment:
- INSTANCE=0
- TZ=Europe/Paris
- PID_DIRECTORY=/var/run
- NSSF_NAME=oai-nssf
- NSSF_FQDN=nssf.oai-5gcn.eur
- SBI_IF_NAME=eth0
- SBI_PORT=80
- SBI_API_VERSION=v1
- SBI_PORT_HTTP1=80
- SBI_PORT_HTTP2=8080
- NSSF_SLICE_CONFIG=/openair-nssf/etc/nssf_slice_config.yaml
cap_add:
- NET_ADMIN
- SYS_ADMIN
cap_drop:
- ALL
privileged: true
volumes:
- ./nssf_slice_config.yaml:/openair-nssf/etc/nssf_slice_config.yaml
networks:
public_net:
ipv4_address: 192.168.70.132
这是一个Docker Compose文件,用于定义和运行多个Docker容器。其中:
-
version: '3.8'
:指定Docker Compose文件的版本。 -
services:
:定义了两个服务,mysql
和oai-nssf
。 -
mysql:
:定义了一个MySQL服务。-
container_name: mysql
:指定容器的名称。 -
image: mysql:8.0
:使用的MySQL镜像版本。 -
volumes:
:指定容器与主机之间共享的文件或目录,前者是主机的文件,后者是容器内的文件。在容器第一次启动的时候,它会将容器内的映射路径下的文件复制到宿主机上保存。 一旦我们在宿主机上修改了这些文件,容器运行时就以宿主机上的文件为准。 -
environment:
:设置容器内的环境变量。 -
healthcheck:
:定义容器的健康检查。 -
test: /bin/bash -c "/tmp/mysql-healthcheck.sh"
:设置健康检查的命令为/bin/bash -c "/tmp/mysql-healthcheck.sh"
。 -
interval: 10s
:设置健康检查的间隔时间为10秒。 -
timeout: 5s
:设置健康检查的超时时间为5秒。 -
.
retries: 30
:设置健康检查失败后的重试次数为30次。 -
networks:
:指定容器所在的网络。
-
-
oai-nssf:
:定义了一个oai-nssf服务。cap_add:
:添加容器的Linux capabilities。cap_drop:
:删除容器的Linux capabilities。privileged: true
:启用容器的特权模式。networks:
:指定容器所在的网络。
-
depend _on:
:此容器启动需要依赖的容器 -
Capabilities 机制是在 Linux 内核 2.2 之后引入的,原理很简单,就是将之前与超级用户 root(UID=0)关联的特权细分为不同的功能组,Capabilites 作为线程(Linux 并不真正区分进程和线程)的属性存在,每个功能组都可以独立启用和禁用。其本质上就是将内核调用分门别类,具有相似功能的内核调用被分到同一组中。这样一来,权限检查的过程就变成了:在执行特权操作时,如果线程的有效身份不是 root,就去检查其是否具有该特权操作所对应的 capabilities,并以此为依据,决定是否可以执行特权操作。
networks:
public_net: #定义了网络的名称,名为 "public_net"。
driver: bridge #设置使用 Bridge 驱动程序,它是默认的网络驱动程序
name: demo-oai-public-net #设置网络的名称为 "demo-oai-public-net"
ipam: #使用 IP 地址管理(IPAM),指定 IPv4 子网。在这里,使用子网 192.168.70.0/24
config:
- subnet: 192.168.70.0/24
driver_opts: #定义驱动选项而不是使用默认值。将桥接网络命名为 "demo-oai"
com.docker.network.bridge.name: "demo-oai"
docker-compose-slicing-basic-nrf.yaml
完整代码见附录1
mysql服务
mysql:
container_name: mysql
image: mysql:8.0
volumes:
- ./database/oai_db2.sql:/docker-entrypoint-initdb.d/oai_db.sql
- ./healthscripts/mysql-healthcheck2.sh:/tmp/mysql-healthcheck.sh
environment:
- TZ=Europe/Paris
- MYSQL_DATABASE=oai_db
- MYSQL_USER=test
- MYSQL_PASSWORD=test
- MYSQL_ROOT_PASSWORD=linux
healthcheck:
test: /bin/bash -c "/tmp/mysql-healthcheck.sh"
interval: 10s
timeout: 5s
retries: 30
networks:
public_net:
ipv4_address: 192.168.70.131
mysql:
: 配置 MySQL 数据库容器的服务名称。container_name: mysql
: 指定容器的名称为mysql
。image: mysql:8.0
: 指定使用mysql
镜像的版本为8.0
。volumes:
: 配置数据卷,将本地的./database/oai_db2.sql
映射到容器内的/docker-entrypoint-initdb.d/oai_db.sql
,并将本地的./healthscripts/mysql-healthcheck2.sh
映射到容器内的/tmp/mysql-healthcheck.sh
。environment:
: 配置环境变量,包括容器的时区TZ
,MySQL 数据库的名称MYSQL_DATABASE
,用户名MYSQL_USER
,用户密码MYSQL_PASSWORD
和 root 用户密码MYSQL_ROOT_PASSWORD
。healthcheck:
: 配置容器的健康检查。test: /bin/bash -c "/tmp/mysql-healthcheck.sh"
: 指定容器健康检查的命令为在容器内执行/tmp/mysql-healthcheck.sh
脚本。interval: 10s
: 指定健康检查间隔为10s
。timeout: 5s
: 指定健康检查超时时间为5s
。retries: 30
: 指定容器健康检查失败时的重试次数为30
次。
networks:
: 配置容器所属的网络,指定 IP 地址为192.168.70.131
,该网络名称为public_net
。
oai-nssf服务
oai_nssf:
container_name: "oai-nssf" # 设置容器名称为 "oai-nssf"
image: oaisoftwarealliance/oai-nssf:develop # 使用 oaisoftwarealliance/oai-nssf:develop 镜像来创建容器
environment: # 配置容器运行时的环境变量
- INSTANCE=0 # 设置容器实例编号为 0
- TZ=Europe/Paris # 设置时区为欧洲巴黎时区
- PID_DIRECTORY=/var/run # 设置进程 ID 文件存放路径为 /var/run
- NSSF_NAME=oai-nssf # 设置 nssf 的名称为 oai-nssf
- NSSF_FQDN=nssf.oai-5gcn.eur # 设置 nssf 的 FQDN 为 nssf.oai-5gcn.eur
- SBI_IF_NAME=eth0 # 设置 SBI 网络接口的名称为 eth0
- SBI_PORT=80 # 设置 SBI 的端口号为 80
- SBI_API_VERSION=v1 # 设置 SBI 的 API 版本为 v1
- SBI_PORT_HTTP1=80 # 设置 HTTP1 的端口号为 80
- SBI_PORT_HTTP2=8080 # 设置 HTTP2 的端口号为 8080
- NSSF_SLICE_CONFIG=/openair-nssf/etc/nssf_slice_config.yaml # 设置 nssf 切片配置文件的路径为 /openair-nssf/etc/nssf_slice_config.yaml
cap_add: # 为容器添加额外的 Linux capabilities 权限
- NET_ADMIN # 允许容器修改网络配置
- SYS_ADMIN # 允许容器进行系统级的操作
cap_drop: # 删除容器的部分 Linux capabilities 权限
- ALL # 删除所有的 capabilities
privileged: true # 允许容器获取特权权限
volumes: # 将容器内部的文件目录挂载到宿主机上的文件目录中
- ./nssf_slice_config.yaml:/openair-nssf/etc/nssf_slice_config.yaml # 将当前目录下的 nssf_slice_config.yaml 文件挂载到容器的 /openair-nssf/etc/ 目录下
networks: # 配置容器连接的网络
public_net: # 设置网络的名称为 public_net
ipv4_address: 192.168.70.132 # 设置容器的 IPv4 地址为 192.168.70.132
oai_udr服务
oai_udr:
container_name: oai-udr
image: oaisoftwarealliance/oai-udr:develop
environment:
- TZ=Europe/Paris
- INSTANCE=0
- PID_DIRECTORY=/var/run
- UDR_INTERFACE_NAME_FOR_NUDR=eth0
- UDR_INTERFACE_PORT_FOR_NUDR=80
- UDR_INTERFACE_HTTP2_PORT_FOR_NUDR=8080
- UDR_API_VERSION=v1
- MYSQL_IPV4_ADDRESS=192.168.70.131
- MYSQL_USER=test
- MYSQL_PASS=test
- MYSQL_DB=oai_db
- WAIT_MYSQL=120
depends_on:
- mysql
networks:
public_net:
ipv4_address: 192.168.70.133
oai_udr:
:配置 UDR 容器的服务名称。container_name: oai-udr
:指定容器的名称为oai-udr
。image: oaisoftwarealliance/oai-udr:develop
:指定使用oaisoftwarealliance/oai-udr
镜像的develop
分支版本。environment:
:配置环境变量,包括时区TZ
、容器的编号INSTANCE
、进程 ID 目录PID_DIRECTORY
、向 NUDR 发送数据包的 UDR 接口名称UDR_INTERFACE_NAME_FOR_NUDR
、UDR 接口端口UDR_INTERFACE_PORT_FOR_NUDR
、UDR 的 HTTP2 端口UDR_INTERFACE_HTTP2_PORT_FOR_NUDR
、UDR 的 API 版本UDR_API_VERSION
、MySQL 数据库的 IP 地址MYSQL_IPV4_ADDRESS
、MySQL 数据库的用户名MYSQL_USER
、MySQL 数据库的密码MYSQL_PASS
、MySQL 数据库的名称MYSQL_DB
和等待 MySQL 数据库启动的时间WAIT_MYSQL
。depends_on:
:指定依赖项,本容器依赖于mysql
容器。networks:
:配置容器所属的网络,指定 IP 地址为192.168.70.133
,该网络名称为public_net
。
oai_udm服务
oai_udm:
# 设置容器名称
container_name: oai-udm
# 指定使用的镜像名称和版本
image: oaisoftwarealliance/oai-udm:develop
# 设置容器的环境变量
environment:
# 设置时区为欧洲巴黎
- TZ=Europe/Paris
# 设置实例编号为0
- INSTANCE=0
# 设置PID目录为/var/run
- PID_DIRECTORY=/var/run
# 设置UDM的名称为OAI_UDM
- UDM_NAME=OAI_UDM
# 设置UDM与SBI之间通信的接口名称为eth0
- SBI_IF_NAME=eth0
# 设置UDM与SBI之间通信的端口为80
- SBI_PORT=80
# 设置UDM的版本为v1
- UDM_VERSION_NB=v1
# 设置是否使用全限定域名的DNS解析方式为yes
- USE_FQDN_DNS=yes
# 设置UDR的IP地址为192.168.70.133
- UDR_IP_ADDRESS=192.168.70.133
# 设置UDR的端口为80
- UDR_PORT=80
# 设置UDR的版本为v1
- UDR_VERSION_NB=v1
# 设置UDR的全限定域名为oai_udr
- UDR_FQDN=oai_udr
# 设置依赖的服务为oai_udr
depends_on:
- oai_udr
# 设置网络配置,使用公共网络,IP地址为192.168.70.134
networks:
public_net:
ipv4_address: 192.168.70.134
oai_ausf服务
oai_ausf: # 定义容器名称
container_name: oai-ausf # 容器名称
image: oaisoftwarealliance/oai-ausf:develop # 使用的镜像名称和标签
environment: # 容器运行环境变量
- TZ=Europe/Paris # 设置时区
- INSTANCE_ID=0 # 定义实例ID
- PID_DIR=/var/run # 定义PID文件存储位置
- AUSF_NAME=OAI_AUSF # 定义AUSF的名称
- SBI_IF_NAME=eth0 # 定义用于SBI接口的网络接口名称
- SBI_PORT=80 # 定义SBI接口的端口号
- USE_FQDN_DNS=yes # 是否使用FQDN作为DNS的查询方式
- UDM_IP_ADDRESS=192.168.70.134 # UDM的IP地址
- UDM_PORT=80 # UDM的端口号
- UDM_VERSION_NB=v1 # UDM的版本号
- UDM_FQDN=oai_udm # 定义UDM的FQDN
depends_on: # 定义容器启动顺序和依赖关系
- oai_udm
networks: # 定义容器所属的网络
public_net:
ipv4_address: 192.168.70.135 # 容器的IPv4地址
oai_nrf_slice12服务
oai_nrf_slice12: # 创建一个名为 oai_nrf_slice12 的服务
container_name: oai-nrf-slice12 # 为容器设置一个名称
image: oaisoftwarealliance/oai-nrf:develop # 使用的容器镜像
environment: # 容器运行环境变量
- NRF_INTERFACE_NAME_FOR_SBI=eth0 # SBI 接口名称为 eth0
- NRF_INTERFACE_PORT_FOR_SBI=80 # SBI 接口端口为 80
- NRF_INTERFACE_HTTP2_PORT_FOR_SBI=8080 # SBI HTTP2 端口为 8080
- NRF_API_VERSION=v1 # 使用的 NRF API 版本为 v1
- INSTANCE=0 # 当前实例 ID 为 0
- PID_DIRECTORY=/var/run # 进程 ID 文件的存储目录为 /var/run
networks: # 配置容器连接的网络
public_net: # 容器连接的网络名为 public_net
ipv4_address: 192.168.70.136 # 容器分配的 IPv4 地址为 192.168.70.136
oai_nrf_slice3服务
oai_nrf_slice3: # 定义容器名称为oai_nrf_slice3
container_name: oai-nrf-slice3 # 指定Docker容器的名称为oai-nrf-slice3
image: oaisoftwarealliance/oai-nrf:develop # 使用的Docker镜像为oaisoftwarealliance/oai-nrf:develop
environment: # 设置Docker容器的环境变量
- NRF_INTERFACE_NAME_FOR_SBI=eth0 # NRF接口名为eth0
- NRF_INTERFACE_PORT_FOR_SBI=80 # NRF接口端口为80
- NRF_INTERFACE_HTTP2_PORT_FOR_SBI=8080 # NRF HTTP2端口为8080
- NRF_API_VERSION=v1 # NRF API版本为v1
- INSTANCE=0 # 实例ID为0
- PID_DIRECTORY=/var/run # PID目录为/var/run
networks: # 设置容器所属的网络
public_net: # 网络名为public_net
ipv4_address: 192.168.70.137 # 容器的IP地址为192.168.70.137
oai_amf服务
oai_amf:
container_name: oai-amf # Docker 容器名称
image: oaisoftwarealliance/oai-amf:develop # 使用的镜像
environment: # 设置的环境变量
- TZ=Europe/Paris # 时区
- INSTANCE=0 # 实例 ID
- PID_DIRECTORY=/var/run # 进程 ID 存储路径
- MCC=208 # 移动国家代码
- MNC=95 # 移动网络代码
- REGION_ID=128 # 区域 ID
- AMF_SET_ID=1 # AMF 集 ID
- SERVED_GUAMI_MCC_0=208 # 为UE提供服务的 GUAMI 中的 MCC 0
- SERVED_GUAMI_MNC_0=95 # 为UE提供服务的 GUAMI 中的 MNC 0
- SERVED_GUAMI_REGION_ID_0=128 # 为UE提供服务的 GUAMI 中的 Region ID 0
- SERVED_GUAMI_AMF_SET_ID_0=1 # 为UE提供服务的 GUAMI 中的 AMF Set ID 0
- SERVED_GUAMI_MCC_1=460 # 为UE提供服务的 GUAMI 中的 MCC 1
- SERVED_GUAMI_MNC_1=11 # 为UE提供服务的 GUAMI 中的 MNC 1
- SERVED_GUAMI_REGION_ID_1=10 # 为UE提供服务的 GUAMI 中的 Region ID 1
- SERVED_GUAMI_AMF_SET_ID_1=1 # 为UE提供服务的 GUAMI 中的 AMF Set ID 1
- PLMN_SUPPORT_MCC=208 # PLMN 支持的 MCC
- PLMN_SUPPORT_MNC=95 # PLMN 支持的 MNC
- PLMN_SUPPORT_TAC=0xa000 # PLMN 支持的 TAC
- SST_0=128 # SST 0
- SD_0=128 # SD 0
- SST_1=1 # SST 1
- SD_1=0xFFFFFF # SD 1
- SST_2=130 # SST 2
- SD_2=130 # SD 2
- AMF_INTERFACE_NAME_FOR_NGAP=eth0 # AMF 接口名称(用于 NGAP)
- AMF_INTERFACE_NAME_FOR_N11=eth0 # AMF 接口名称(用于 N11)
# SMF配置
- SMF_INSTANCE_ID_0=1 # SMF 实例 ID 0
- SMF_FQDN_0=oai_smf_slice1 # SMF Fully Qualified Domain Name (FQDN) 0
- SMF_IPV4_ADDR_0=0.0.0.0 # SMF IPv4 地址 0
- SMF_HTTP_VERSION_0=v1 # SMF 使用的 HTTP 版本 0
- SELECTED_0=true # 是否选择 SMF 0
- SMF_INSTANCE_ID_1=2 # SMF 实例 ID 1
- SMF_FQDN_1: oai_smf_slice2 # SMF的完全限定域名
- SMF_IPV4_ADDR_1: 0.0.0.0 # SMF的IPv4地址
- SMF_HTTP_VERSION_1: v1 # 使用的HTTP版本
- SELECTED_1: false # 是否选中此SMF
# MySQL配置
- MYSQL_SERVER: 192.168.70.131 # MySQL服务器地址
- MYSQL_USER: root # MySQL用户名
- MYSQL_PASS: linux # MySQL密码
- MYSQL_DB: oai_db # 数据库名称
# Operator Key
- OPERATOR_KEY: 63bfa50ee6523365ff14c1f45f88737d # 操作员密钥
# NRF配置
- NRF_IPV4_ADDRESS: 0.0.0.0 # NRF的IPv4地址
- NRF_PORT: 80 # NRF的端口号
- EXTERNAL_NRF: no # 是否使用外部NRF
- NF_REGISTRATION: no # 是否启用NF注册
- SMF_SELECTION: yes # 是否使用SMF选择
- USE_FQDN_DNS: yes # 是否使用FQDN DNS解析
- NRF_API_VERSION: v1 # 使用的NRF API版本
- NRF_FQDN: oai_nrf_slice12 # NRF的完全限定域名
# AUSF配置
- AUSF_IPV4_ADDRESS: 192.168.70.135 # AUSF的IPv4地址
- AUSF_PORT: 80 # AUSF的端口号
- AUSF_API_VERSION: v1 # 使用的AUSF API版本
- AUSF_FQDN: oai_ausf # AUSF的完全限定域名
- EXTERNAL_AUSF: yes # 是否使用外部AUSF
# UDM配置
- UDM_IPV4_ADDRESS: 192.168.70.134 # UDM的IPv4地址
- UDM_PORT: 80 # UDM的端口号
- UDM_API_VERSION: v2 # 使用的UDM API版本
- UDM_FQDN: oai_udm # UDM的完全限定域名
# NSSF配置
- NRF_SELECTION: yes # 是否使用NRF选择
- EXTERNAL_NSSF: yes # 是否使用外部NSSF
- NSSF_IPV4_ADDRESS: 192.168.70.132 # NSSF的IPv4地址
- NSSF_PORT: 80 # NSSF的端口号
- NSSF_API_VERSION: v1 # 使用的NSSF API版本
- NSSF_FQDN: oai-nssf # NSSF的完全限定域名
# 加密和完整性保护算法
- INT_ALGO_LIST: ["NIA1" , "NIA2"] # 使用的完整性保护算法
- CIPH_ALGO_LIST: ["NEA1" , "NEA2"] # 使用的加密算法
# 是否使用HTTP/2
- USE_HTTP2: no # 是否使用HTTP/2
# 依赖服务
depends_on:
- mysql # 依赖的MySQL服务
- oai_nrf
- vpp_upf_slice3
- oai_ausf
networks:
public_net:
ipv4_address: 192.168.70.138
oai_smf_slice1服务
oai_smf_slice1: # 容器名称
container_name: oai-smf-slice1 # 容器名称
image: oaisoftwarealliance/oai-smf:develop # 容器所使用的镜像
environment: # 容器的环境变量
- TZ=Europe/Paris # 时区
- INSTANCE=0 # 实例编号
- PID_DIRECTORY=/var/run # PID文件的存储目录
- SMF_INTERFACE_NAME_FOR_N4=eth0 # 用于N4接口的网络接口名称
- SMF_INTERFACE_NAME_FOR_SBI=eth0 # 用于SBI接口的网络接口名称
- SMF_INTERFACE_PORT_FOR_SBI=80 # SBI接口使用的端口号
- SMF_INTERFACE_HTTP2_PORT_FOR_SBI=8080 # SBI接口使用的HTTP2端口号
- SMF_API_VERSION=v1 # 使用的SMF API版本号
- DEFAULT_DNS_IPV4_ADDRESS=172.21.3.100 # 默认DNS服务器的IPv4地址
- DEFAULT_DNS_SEC_IPV4_ADDRESS=8.8.8.8 # 默认DNS服务器的备用IPv4地址
- AMF_IPV4_ADDRESS=192.168.70.138 # AMF的IPv4地址
- AMF_PORT=80 # AMF的端口号
- AMF_API_VERSION=v1 # 使用的AMF API版本号
- AMF_FQDN=oai_amf # AMF的FQDN
- UDM_IPV4_ADDRESS=192.168.70.134 # UDM的IPv4地址
- UDM_PORT=80 # UDM的端口号
- UDM_API_VERSION=v2 # 使用的UDM API版本号
- UDM_FQDN=oai_udm # UDM的FQDN
- UPF_IPV4_ADDRESS=127.0.0.1 # UPF的IPv4地址
- UPF_FQDN_0=localhost # UPF的FQDN
- NRF_IPV4_ADDRESS=192.168.70.136 # NRF的IPv4地址
- NRF_PORT=80 # NRF的端口号
- NRF_API_VERSION=v1 # 使用的NRF API版本号
- NRF_FQDN=oai_nrf_slice12 # NRF的FQDN
- REGISTER_NRF=yes # 是否向NRF注册
- DISCOVER_UPF=yes # 是否自动发现UPF
- DISCOVER_PCF=no # 是否自动发现PCF
- USE_LOCAL_SUBSCRIPTION_INFO=yes # 是否使用本地订阅信息
- USE_LOCAL_PCC_RULES=yes # 是否使用本地PCC规则
- USE_FQDN_DNS=yes # 是否使用FQDN格式的DNS查询
- DNN_NI0=default # DNN的网络标识符
- TYPE0=IPv4 # DNN的地址类型
- DNN_RANGE0=12.2.1.2 - 12.2.1.128 # DNN的地址范围
- NSSAI_SST0=128 #定义网络切片标识符
- NSSAI_SD0=128
- SESSION_AMBR_UL0=50Mbps ##定义最大上下行带宽,限制了接入此网络UE的最大速率
- SESSION_AMBR_DL0=100Mbps
depends_on:
- oai_amf
- oai_nrf_slice12
networks:
public_net:
ipv4_address: 192.168.70.139
oai_smf_slice2服务
oai_smf_slice2:
container_name: oai-smf-slice2
image: oaisoftwarealliance/oai-smf:develop
environment:
- TZ=Europe/Paris
- INSTANCE=0
- PID_DIRECTORY=/var/run
- SMF_INTERFACE_NAME_FOR_N4=eth0
- SMF_INTERFACE_NAME_FOR_SBI=eth0
- SMF_INTERFACE_PORT_FOR_SBI=80
- SMF_INTERFACE_HTTP2_PORT_FOR_SBI=8080
- SMF_API_VERSION=v1
- DEFAULT_DNS_IPV4_ADDRESS=172.21.3.100
- DEFAULT_DNS_SEC_IPV4_ADDRESS=8.8.8.8
- AMF_IPV4_ADDRESS=192.168.70.138
- AMF_PORT=80
- AMF_API_VERSION=v1
- AMF_FQDN=oai_amf
- UDM_IPV4_ADDRESS=192.168.70.134
- UDM_PORT=80
- UDM_API_VERSION=v2
- UDM_FQDN=localhost
- UPF_IPV4_ADDRESS=0.0.0.0
- UPF_FQDN_0=localhost
- NRF_IPV4_ADDRESS=192.168.70.136
- NRF_PORT=80
- NRF_API_VERSION=v1
- NRF_FQDN=oai_nrf_slice12
- REGISTER_NRF=yes
- DISCOVER_UPF=yes
- DISCOVER_PCF=no
- USE_LOCAL_SUBSCRIPTION_INFO=yes
- USE_LOCAL_PCC_RULES=yes
- USE_FQDN_DNS=yes
- DNN_NI0=oai
- TYPE0=IPv4
- DNN_RANGE0=12.1.1.129 - 12.1.1.224
- NSSAI_SST0=1
- SESSION_AMBR_UL0=200Mbps
- SESSION_AMBR_DL0=400Mbps
depends_on:
- oai_amf
- oai_nrf_slice12
networks:
public_net:
ipv4_address: 192.168.70.140
与切片1差不多
oai_smf_slice3服务
与切片1差不多
oai_smf_slice3:
container_name: oai-smf-slice3
image: oaisoftwarealliance/oai-smf:develop
environment:
- TZ=Europe/Paris
- INSTANCE=0
- PID_DIRECTORY=/var/run
- SMF_INTERFACE_NAME_FOR_N4=eth0
- SMF_INTERFACE_NAME_FOR_SBI=eth0
- SMF_INTERFACE_PORT_FOR_SBI=80
- SMF_INTERFACE_HTTP2_PORT_FOR_SBI=8080
- SMF_API_VERSION=v1
- DEFAULT_DNS_IPV4_ADDRESS=172.21.3.100
- DEFAULT_DNS_SEC_IPV4_ADDRESS=8.8.8.8
- AMF_IPV4_ADDRESS=192.168.70.138
- AMF_PORT=80
- AMF_API_VERSION=v1
- AMF_FQDN=oai_amf
- UDM_IPV4_ADDRESS=192.168.70.134
- UDM_PORT=80
- UDM_API_VERSION=v2
- UDM_FQDN=localhost
- UPF_IPV4_ADDRESS=0.0.0.0
- UPF_FQDN_0=localhost
- NRF_IPV4_ADDRESS=192.168.70.137
- NRF_PORT=80
- NRF_API_VERSION=v1
- NRF_FQDN=oai_nrf_slice3
- REGISTER_NRF=yes
- DISCOVER_UPF=yes
- DISCOVER_PCF=no
- USE_LOCAL_SUBSCRIPTION_INFO=yes
- USE_LOCAL_PCC_RULES=yes
- USE_FQDN_DNS=yes
- DNN_NI0=oai.ipv4
- TYPE0=IPv4
- DNN_RANGE0=12.1.1.2 - 12.1.1.128
- NSSAI_SST0=130
- NSSAI_SD0=130
- SESSION_AMBR_UL0=100Mbps
- SESSION_AMBR_DL0=200Mbps
depends_on:
- oai_amf
- oai_nrf_slice3
extra_hosts:
- "vpp-upf.node.5gcn.mnc95.mcc208.3gppnetwork.org:192.168.70.201"
networks:
public_net:
ipv4_address: 192.168.70.141
三个smf的对比
项目 | slice1 | slice2 | slice3 | 注释 |
---|---|---|---|---|
container_name | oai_smf_slice1 | oai_smf_slice2 | oai-smf-slice3 | 容器的名称不同的网元运行在不同的容器中需要不同的容器名 |
UDM_FQDN | oai_udm | localhost | localhost | 用于标识所连接的 UDM(User Data Management)服务器的完全限定域名。UDM 是 5G 核心网中的一个网元,负责管理用户数据的存储和检索,因此在配置文件中需要设置其 FQDN(Fully Qualified Domain Name)以便与 smf 建立连接。UDM_FQDN 的值应该与实际配置中所使用的 UDM 服务器的 FQDN 相对应。 UDM_FQDN=localhost表示SMF和UDM运行在同一个主机上,即SMF将请求发送到本地主机上的UDM. 本机只有1个udm其内涵其实一样 |
UPF_IPV4_ADDRESS | 127.0.0.1 | 0.0.0.0 | 0.0.0.0 | 当SMF网元的UPF_IPV4_ADDRESS设置为0.0.0.0时,表示该SMF网元未指定特定的UPF网元,因此它将使用SBI接口从其他SMF网元获取相关信息,并动态选择适当的UPF网元来处理流量。这种配置适用于具有多个UPF网元的大型核心网部署,以实现流量负载均衡和冗余。 当UPF_IPV4_ADDRESS设置为127.0.0.1时,表示UPF运行在同一台机器上,且UPF使用本地回环接口作为其IP地址。这种配置通常用于单机测试环境,因为UPF和SMF运行在同一台机器上,可以直接通过本地回环接口通信,而不需要经过网络。 |
NRF_IPV4_ADDRESS | 192.168.70.136 | 192.168.70.136 | 192.168.70.137 | |
NRF_FQDN | oai_nrf_slice12 | oai_nrf_slice12 | oai_nrf_slice3 | |
DNN_NI0 | default | oai | oai.ipv4 | 用于指定默认数据网络名称(Data Network Name,DNN),以便在分配给UE的EPS session中使用。当DNN_NI0参数设置为"default"时,UE将连接到默认数据网络,并且smf网元将在接收到来自UE的第一个附加请求时为其分配一个默认的EPS session。DNN_NI0 = oai表示使用名为"oai"的数据网络作为默认数据网络。这意味着,如果UE在接入网络时没有指定所需的数据网络,则将自动使用"oai"数据网络。 |
DNN_RANGE0 | 12.2.1.2 - 12.2.1.128 | 12.1.1.129 - 12.1.1.224 | 12.1.1.2 - 12.1.1.128 | |
NSSAI_SST0 | 128 | 1 | 130 | |
NSSAI_SD0 | 128 | 无 | 130 | |
SESSION_AMBR_UL0 | 50Mbps | 200Mbps | 100Mbps | |
SESSION_AMBR_DL0 | 100Mbps | 400Mbps | 200Mbps | |
depends_on | oai_nrf_slice12 | oai_nrf_slice12 | oai_nrf_slice3 | |
extra_hosts | 无 | 无 | “vpp-upf.node.5gcn.mnc95.mcc208.3gppnetwork.org:192.168.70.201” | |
ipv4_address | 192.168.70.139 | 192.168.70.140 | 192.168.70.141 |
oai_spgwu_slice1服务
oai_spgwu_slice1: # 容器的名称
container_name: oai-spgwu-slice1 # 容器运行时的名称
image: oaisoftwarealliance/oai-spgwu-tiny:develop # 容器使用的镜像
environment: # 容器环境变量
- TZ=Europe/Paris # 设置时区
- PID_DIRECTORY=/var/run # 设置运行时进程 ID 存储路径
- SGW_INTERFACE_NAME_FOR_S1U_S12_S4_UP=eth0 # 设置与 eNodeB 和 SGW 之间通信的接口名称
- SGW_INTERFACE_NAME_FOR_SX=eth0 # 设置与其他核心网元素之间通信的接口名称
- PGW_INTERFACE_NAME_FOR_SGI=eth0 # 设置 SGW 和 PGW 之间通信的接口名称
- NETWORK_UE_NAT_OPTION=yes # 是否使用 NAT 隐藏 UE 的 IP 地址
- NETWORK_UE_IP=12.2.1.0/24 # UE IP 地址
- BYPASS_UL_PFCP_RULES=no # 是否绕过 UPF 以进行 PFCP 规则处理
- MCC=208 # 移动国家码
- MNC=95 # 移动网络码
- MNC03=095 # 3 位移动网络码
- TAC=40960 # 跟踪区域代码
- GW_ID=1 # 网关 ID
- REALM=openairinterface.org # 设定领域名称,通常是机构或组织名称
- ENABLE_5G_FEATURES=yes # 是否启用 5G 功能
- REGISTER_NRF=yes # 是否向 NRF 注册 UPF
- USE_FQDN_NRF=yes # 是否使用 NRF 的完全限定域名
- UPF_FQDN_5G=oai_spgwu_slice1 # UPF 的 FQDN
- NRF_IPV4_ADDRESS=192.168.70.136 # NRF 的 IP 地址
- NRF_PORT=80 # NRF 的端口号
- NRF_API_VERSION=v1 # NRF 的 API 版本
- NRF_FQDN=oai_nrf_slice12 # NRF 的 FQDN
- NSSAI_SST_0=128 # NSSAI 中的 SST
- NSSAI_SD_0=128 # NSSAI 中的 SD
- DNN_0=default # 默认数据网络名称
depends_on:
- oai_nrf_slice12
- oai_smf_slice1
cap_add:
- NET_ADMIN
- SYS_ADMIN
cap_drop:
- ALL
privileged: true
networks:
public_net:
ipv4_address: 192.168.70.142
oai_spgwu_slice2服务
与切片1相似
oai_spgwu_slice2:
container_name: oai-spgwu-slice2
image: oaisoftwarealliance/oai-spgwu-tiny:develop
environment:
- TZ=Europe/Paris
- PID_DIRECTORY=/var/run
- SGW_INTERFACE_NAME_FOR_S1U_S12_S4_UP=eth0
- SGW_INTERFACE_NAME_FOR_SX=eth0
- PGW_INTERFACE_NAME_FOR_SGI=eth0
- NETWORK_UE_NAT_OPTION=yes
- NETWORK_UE_IP=12.1.1.0/24
- BYPASS_UL_PFCP_RULES=no
- MCC=208
- MNC=95
- MNC03=095
- TAC=40960
- GW_ID=1
- REALM=openairinterface.org
- ENABLE_5G_FEATURES=yes
- REGISTER_NRF=yes
- USE_FQDN_NRF=yes
- UPF_FQDN_5G=oai_spgwu_slice2
- NRF_IPV4_ADDRESS=192.168.70.136
- NRF_PORT=80
- NRF_API_VERSION=v1
- NRF_FQDN=oai_nrf_slice12
- NSSAI_SST_0=1
- DNN_0=oai
depends_on:
- oai_nrf_slice12
cap_add:
- NET_ADMIN
- SYS_ADMIN
cap_drop:
- ALL
privileged: true
networks:
public_net:
ipv4_address: 192.168.70.143
两个spgwu对比
项目 | slice1 | slice2 | slice3 | 注释 |
---|---|---|---|---|
NETWORK_UE_IP | 12.2.1.0/24 | 12.1.1.0/24 | 通过指定NETWORK_UE_IP参数,SPGWU就知道了UE的IP地址所在的网络段,从而可以将数据包正确地转发到UE | |
UPF_FQDN_5G | oai_spgwu_slice1 | oai_spgwu_slice2 | ||
NSSAI_SST_0 | 128 | 1 | ||
NSSAI_SD_0 | 128 | 无 | ||
DNN_0 | default | oai | ||
depends_on | oai_smf_slice1 | 无 |
vpp_upf_slice3服务
vpp_upf_slice3:
image: oaisoftwarealliance/oai-upf-vpp:develop # 使用oai-upf-vpp:develop的Docker映像来创建容器
privileged: true # 给予容器足够的权限
container_name: vpp-upf-slice3 # 容器的名称
environment: # 容器的环境变量列表
- IF_1_IP=192.168.70.201 # 网卡1的IP地址
- IF_1_TYPE=N4 # 网卡1类型为N4
- IF_2_IP=192.168.72.201 # 网卡2的IP地址
- IF_2_TYPE=N3 # 网卡2类型为N3
- IF_2_NWI=access.oai.org # 网卡2的网络接口名称为access.oai.org
- IF_3_IP=192.168.73.201 # 网卡3的IP地址
- IF_3_TYPE=N6 # 网卡3类型为N6
- IF_3_IP_REMOTE=192.168.73.145 # EXT-DN IP Address
- IF_3_NWI=internet.oai.org # 网卡3的网络接口名称为internet.oai.org
- NAME=VPP-UPF # 容器名称
- MNC=95 # 移动网络代码
- MCC=208 # 移动国家代码
- REALM=3gppnetwork.org # realm信息
- VPP_MAIN_CORE=0 # VPP的主要核心数量
- VPP_CORE_WORKER=1 # VPP的工作核心数量
- VPP_PLUGIN_PATH=/usr/lib/x86_64-linux-gnu/vpp_plugins/ # VPP插件所在的路径
- SNSSAI_SD=130 # 切片/服务类型
- SNSSAI_SST=130 # 切片区分代码
- DNN=oai.ipv4 # 默认移动网络名称
- REGISTER_NRF=yes # 是否注册NRF
- NRF_IP_ADDR=192.168.70.137 # NRF的IP地址
- NRF_PORT=8080 # NRF的端口
- HTTP_VERSION=2 # 使用HTTP协议的版本
depends_on:
- oai_nrf_slice3 # 依赖于oai_nrf_slice3容器
healthcheck:
test: /bin/bash -c "pgrep vpp" # 健康检查命令
interval: 10s # 检查间隔时间
timeout: 5s # 超时时间
retries: 5 # 重试次数
networks: # 容器的网络连接配置
public_net: # 容器连接的公共网络
ipv4_address: 192.168.70.144 # IPv4地址
public_net_access: # 容器连接的公共网络中的访问网络
ipv4_address: 192.168.72.144 # IPv4地址
public_net_core:
ipv4_address: 192.168.73.144
VPP_MAIN_CORE与VPP_CORE_WORKER
- 在OAI核心网中,UPF(User Plane Function)是负责处理用户面数据流的关键网元。VPP_MAIN_CORE是UPF的一个参数,它指定了UPF所使用的处理用户面数据流的主要核心的编号。
- VPP(Vector Packet Processing)是一个开源软件包,可以在多个平台上高效地处理数据包,包括网络功能虚拟化(NFV)环境中的数据包。在OAI核心网中,VPP被用作UPF的数据平面处理引擎。
- VPP_MAIN_CORE参数的意义是指定UPF所使用的主要VPP核心的编号。在多核处理器上,VPP可以使用多个核心来处理数据包,而VPP_MAIN_CORE则指定了UPF所使用的其中一个核心。这个参数的设置可以影响UPF的性能和资源利用率。通常情况下,VPP_MAIN_CORE的值应该与UPF所在服务器的核心数量相匹配,以确保UPF能够充分利用服务器资源,并提供最佳的性能和吞吐量。 VPP_MAIN_CORE=0表示使用的是第一个核心。
- VPP_CORE_WORKER参数的意义是指定UPF使用的VPP核心数量,也就是VPP工作者线程数。在多核处理器上,VPP可以使用多个核心来处理数据包,而VPP_CORE_WORKER则指定了UPF使用的VPP核心数通常情况下,VPP_CORE_WORKER的值应该与UPF所在服务器的核心数量相匹配,以确保UPF能够充分利用服务器资源,并提供最佳的性能和吞吐量。需要注意的是,VPP_CORE_WORKER的值应该小于或等于UPF所在服务器的核心数量,否则会出现资源浪费的情况。如果VPP_CORE_WORKER设置为1,则UPF将使用单个VPP核心来处理数据包。如果设置为大于1的值,则UPF将使用多个VPP核心来处理数据包,以提高处理速度和吞吐量。在实际应用中,应该根据服务器的实际情况和系统的性能要求来设置VPP_CORE_WORKER参数。
- VPP_CORE_WORKER参数用于指定VPP-upf网元的工作线程数目。VPP-upf网元需要处理大量的网络数据流量,因此需要使用多个工作线程来处理数据。VPP_CORE_WORKER参数的值应该为一个整数,表示工作线程的数目。
healthcheck
test: /bin/bash -c "pgrep vpp"
-
具体而言,pgrep命令用于查找正在运行的进程,并输出进程的ID号。而"/bin/bash -c"则是用于执行一个命令的标准方式。
-
因此,这个命令的含义是在upf网元上执行一个bash shell,并在该shell中运行pgrep vpp命令,以查找是否有VPP进程正在运行。如果该命令返回了VPP进程的ID号,则说明VPP正在运行,否则说明VPP没有运行或者运行异常。这个命令通常会被用于检查VPP软件是否健康地运行在upf网元上。
VPP
VPP(Vector Packet Processing)是一个高性能的数据包处理软件,它在数据中心、边缘网关和SDN等场景中广泛应用。由于VPP是一种强大的软件,它可能会与其他软件或系统产生冲突,导致一些问题。
以下是一些可能导致VPP互相冲突的因素:
-
网络接口冲突:VPP需要与网络接口进行交互,但如果有其他软件或系统也在使用相同的网络接口,就可能导致冲突。
-
CPU资源竞争:VPP需要大量的CPU资源来处理网络数据包,但如果有其他应用程序也在竞争相同的CPU资源,就可能会导致性能问题。
-
内存泄漏:VPP可能会发生内存泄漏的情况,导致系统的内存资源被消耗殆尽,从而导致其他应用程序无法正常运行。
-
配置文件冲突:如果有多个VPP实例正在运行,它们可能会使用相同的配置文件,从而导致冲突。
为避免这些冲突,可以采取以下措施:
-
分配独立的网络接口:为每个应用程序分配独立的网络接口,以避免VPP与其他应用程序产生冲突。
-
管理CPU资源:通过对CPU资源进行管理,避免VPP与其他应用程序产生资源竞争。
-
定期检查内存使用情况:定期检查VPP的内存使用情况,避免出现内存泄漏的情况。
-
使用不同的配置文件:为每个VPP实例使用不同的配置文件,以避免配置文件之间产生冲突。
VPP_PLUGIN_PATH &VPP_MAIN_CORE=0 & VPP_CORE_WORKER
-
不同的VPP可以使用相同的VPP_PLUGIN_PATH,因为VPP_PLUGIN_PATH是用来指定VPP插件的路径。VPP插件是在独立的共享对象中实现的,所以不同的VPP实例可以使用相同的VPP插件。当不同的VPP实例使用相同的VPP插件路径时,它们将在同一目录下查找VPP插件。但是,不同的VPP实例可能需要不同版本的VPP插件,这时可以通过在不同的目录中放置不同版本的插件来解决。
-
VPP_MAIN_CORE是VPP(Vector Packet Processing)网络数据平面处理引擎的主要执行核心。在VPP中,可以使用多个CPU核心来执行不同的任务,从而提高性能。要设置VPP_MAIN_CORE的多核处理,你可以通过以下步骤:
- 打开VPP配置文件(通常为/etc/vpp/startup.conf)。
- 找到“cpu-core”选项并设置它为一个包含所有要用于VPP的CPU核心列表的逗号分隔字符串。 例如,如果你要使用CPU核心0和1来运行VPP,则可以将“cpu-core”设置为“0,1”。
- 保存并关闭配置文件。
-
请注意,VPP_MAIN_CORE应始终设置为单个CPU核心,因为它负责控制VPP进程的整个生命周期。但是,你可以将其他任务委派给其他CPU核心来提高性能。
-
如果你要在VPP中使用4个工作线程,则可以将“core-workers”设置为“4”。 当VPP启动时,它会自动分配指定数量的工作线程,并将数据包分配给这些线程以进行处理。请注意,此设置取决于系统硬件和网络负载等因素,应该进行测试以确定最佳设置。
REALM
-
REALM是UPF的一个参数,它指定了UPF所属的领域(Realm)。
-
在通信网络中,领域是指一个或多个网络设备(如路由器、交换机、网关等)和/或网络服务的集合,这些设备和服务彼此相连,并且受到特定的安全策略和管理规则的约束。UPF所属的领域(Realm)决定了UPF对用户数据的访问权限以及UPF与其他网络设备和服务之间的通信方式。
-
REALM参数的值是一个字符串,用于指定UPF所属的领域。在OAI核心网中,UPF可以属于多个领域,每个领域都有一个唯一的REALM参数值。当UPF接收到用户数据时,它会根据REALM参数的值来确定用户的访问权限,以及将数据转发到哪些其他网络设备和服务。
-
需要注意的是,UPF所属的领域必须与其他网络设备和服务的领域相匹配,以确保UPF能够正常工作并提供正确的服务。在实际应用中,应该根据网络拓扑、安全策略和管理规则来设置REALM参数的值
-
REALM=3gppnetwork.org是一种常见的UPF REALM参数设置,它表明UPF所属的领域是3GPP网络。3GPP是第三代合作伙伴计划(3rd Generation Partnership Project)的缩写,是一个全球性的标准化组织,负责制定移动通信技术的标准。3GPP网络是基于3GPP标准的移动通信网络,包括2G、3G、4G和5G等多个移动通信技术。
-
除了3gppnetwork.org之外,REALM参数还可以设置为其他的值,具体取决于UPF所属的领域或运营商的要求。
-
下面是一些常见的REALM参数取值:
-
REALM=ims.mnc001.mcc001.3gppnetwork.org:表示UPF所属的领域是IMS(IP Multimedia Subsystem)领域,运营商的MCC(Mobile Country Code)为001,MNC(Mobile Network Code)为001。
-
REALM=epc.mnc001.mcc001.3gppnetwork.org:表示UPF所属的领域是EPC(Evolved Packet Core)领域,运营商的MCC为001,MNC为001。
-
REALM=example.com:表示UPF所属的领域是一个自定义的领域,其名称为example.com。
DNN
-
DNN指定了数据网络名称(Data Network Name),也就是UPF要为其提供数据传输服务的网络的名称。
-
除了默认值default之外,DNN参数还可以设置为其他的值,具体取决于要连接的数据网络的名称。
-
下面是一些常见的DNN参数取值:
-
DNN=internet:表示要连接到的数据网络的名称是internet。
-
DNN=private_network:表示要连接到的数据网络的名称是private_network。
-
DNN=vpn_network:表示要连接到的数据网络的名称是vpn_network。
VPP_PLUGIN_PATH
VPP_PLUGIN_PATH参数的意义是指定UPF所使用的VPP插件的路径。VPP插件是一些预编译的共享对象文件,可以提供特定的功能或服务,如IPSec加密、流量统计、负载均衡等。VPP插件可以通过VPP_PLUGIN_PATH参数来指定其所在的路径。
UPF使用的VPP插件取决于UPF的配置和需要提供的功能。例如,如果UPF需要提供IPSec加密服务,则需要加载IPSec插件。如果UPF需要进行流量统计,则需要加载流量统计插件。
需要注意的是,如果UPF所使用的VPP插件不存在于VPP_PLUGIN_PATH指定的路径中,UPF将无法正常工作。因此,在实际应用中,应该根据UPF的需求来设置VPP_PLUGIN_PATH参数,并确保所需的VPP插件已经安装并位于VPP_PLUGIN_PATH指定的路径中。
IF_X_NWI
-
IF_2_NWI是UPF的一个参数,它指定了UPF连接到的下行网络接口(Network Interface)的标识符。
-
IF_2_NWI=access.oai.org是一种常见的UPF IF_2_NWI参数设置,它表明UPF连接到的下行网络接口是access.oai.org。access.oai.org是一个虚拟的网络接口标识符,通常用于表示UPF连接到的下行网络接口是一个外部网络接口,如互联网接口或公共移动通信网络接口。
-
在OAI核心网中,UPF连接到的下行网络接口的标识符必须与其他网络设备和服务的标识符相匹配,以确保UPF能够正常工作并提供正确的服务。在实际应用中,应该根据网络拓扑、安全策略和管理规则来设置IF_2_NWI参数的值。如果UPF连接到的下行网络接口是一个外部网络接口,那么IF_2_NWI=access.oai.org可能是一个合适的选择。
除了access.oai.org之外,在OAI核心网中,IF_2_NWI参数还可以设置为其他的值,具体取决于UPF连接的下行网络接口的类型和标识符。
下面是一些常见的IF_2_NWI参数取值:
-
IF_2_NWI=eth0:表示UPF连接到的下行网络接口是一个以太网接口,其标识符为eth0。
-
IF_2_NWI=enp2s0:表示UPF连接到的下行网络接口是一个以太网接口,其标识符为enp2s0。
-
IF_2_NWI=eth0.100:表示UPF连接到的下行网络接口是一个以太网接口的子接口,其标识符为eth0.100。
-
IF_2_NWI=wlan0:表示UPF连接到的下行网络接口是一个无线网络接口,其标识符为wlan0。
-
IF_2_NWI=ppp0:表示UPF连接到的下行网络接口是一个PPP接口,其标识符为ppp0。
在实际应用中,应该根据UPF连接的下行网络接口的实际情况来选择合适的IF_2_NWI参数取值。
oai_ext_dn服务
oai_ext_dn: # 定义容器名称
image: oaisoftwarealliance/trf-gen-cn5g:latest # 容器镜像名称及版本号
privileged: true # 分配特权级
init: true # 初始化
container_name: oai-ext-dn # 容器名称
entrypoint: /bin/bash -c \ # 进入容器后执行的命令
"iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE;"\ # 在nat表中添加POSTROUTING规则
"ip route add 12.2.1.2/32 via 192.168.70.142 dev eth0;"\ # 添加路由表规则,将12.2.1.2/32路由到192.168.70.142,使用eth0
"ip route add 12.1.1.129/32 via 192.168.70.143 dev eth0;"\ # 添加路由表规则,将12.1.1.129/32路由到192.168.70.143,使用eth0
"ip route add 12.1.1.2/32 via 192.168.73.201 dev eth1; ip route; sleep infinity" # 添加路由表规则,将12.1.1.2/32路由到192.168.73.201,使用eth1,输出路由表并休眠
command: ["/bin/bash", "-c", "trap : SIGTERM SIGINT; sleep infinity & wait"] # 容器启动后执行的命令,使用trap命令捕获SIGTERM和SIGINT信号,然后休眠
healthcheck: # 容器健康检查配置
test: /bin/bash -c "iptables -L -t nat | grep MASQUERADE" # 检查iptables是否包含MASQUERADE规则
interval: 10s # 每10秒运行一次健康检查
timeout: 5s # 健康检查超时时间为5秒
retries: 10 # 健康检查失败后最多重试10次
networks: # 容器网络配置
public_net: # 容器所在网络名称
ipv4_address: 192.168.70.145 # 容器IP地址
public_net_core: # 容器所在网络名称
ipv4_address: 192.168.73.145 # 容器IP地址
networks
# 定义三个网络,分别为 public_net、public_net_access、public_net_core
networks:
public_net:
driver: bridge
name: demo-oai-public-net
ipam:
config:
- subnet: 192.168.70.0/24
driver_opts:
com.docker.network.bridge.name: "demo-oai"
public_net_access:
name: oai-public-access
ipam:
config:
- subnet: 192.168.72.0/24
driver_opts:
com.docker.network.bridge.name: "cn5g-access"
public_net_core:
name: oai-public-core
ipam:
config:
- subnet: 192.168.73.0/24
driver_opts:
com.docker.network.bridge.name: "cn5g-core"
docker-compose-slicing-ransim.yaml
ueransim服务
ueransim:
container_name: ueransim # 容器名称
image: ueransim:latest # 使用的镜像名称和版本
privileged: true # 是否开启特权模式
environment: # 环境变量配置
# GNB配置参数
- MCC=208 # 移动国家代码
- MNC=95 # 移动网络代码
- NCI=0x000000010 # 信令电文CI字段,基站识别标识
- TAC=0xa000 # 针对GSM和UMTS的跟踪区代码(TAC)
- LINK_IP=192.168.70.152 # UE和eNodeB之间链路的IP地址
- NGAP_IP=192.168.70.152 # N1口的IP地址,即gNB与AMF之间的IP地址
- GTP_IP=192.168.70.152 # N2口的IP地址,即gNB与UPF之间的IP地址
- NGAP_PEER_IP=192.168.70.138 # AMF的IP地址
- SST=128 # gNB支持的服务类型
- SD=128 # gNB支持的服务数据
- SST_0=128 # 针对NSSAI 0的服务类型
- SD_0=128 # 针对NSSAI 0的服务数据
- SST_1=1 # 针对NSSAI 1的服务类型
- SD_1=0 # 针对NSSAI 1的服务数据
- SST_2=131 # 针对NSSAI 2的服务类型
- SD_2=131 # 针对NSSAI 2的服务数据
- IGNORE_STREAM_IDS=true # 忽略NGAP中的流ID,仅用于测试目的
# UE配置参数
- NUMBER_OF_UE=1 # UE数量
- IMSI=208950000000035 # 国际移动用户标识
- KEY=0C0A34601D4F07677303652C0462535B # 鉴别和加密算法使用的密钥
- OP=63bfa50ee6523365ff14c1f45f88737d # 运营者私有算法(OP)值
- OP_TYPE=OPC # 运营者私有算法类型
- AMF_VALUE=8000 # AMF的值
- IMEI=356938035643803 # 国际移动设备身份
- IMEI_SV=0035609204079514 # 手机软件版本号
- GNB_IP_ADDRESS=192.168.70.152 # gNB的IP地址
- PDU_TYPE=IPv4 # 用户面协议数据单元类型
- APN=default # 接入点名称
- SST_R=128 # UE请求的N-SSAI服务类型
- SD_R=128 # UE请求的N-SSAI服务数据
- SST_C=128
- SD_C=128
- SST_D=128
- SD_D=128
networks:
public_net:
ipv4_address: 192.168.70.152
healthcheck:
test: /bin/bash -c "ifconfig uesimtun0"
interval: 10s
timeout: 5s
retries: 5
oai-gnb服务
oai-gnb:
image: oaisoftwarealliance/oai-gnb:develop # GN对应的Docker镜像
privileged: true # Docker容器以特权模式运行,允许容器内进程获得更多特权
container_name: rfsim5g-oai-gnb # Docker容器的名称
environment: # 定义容器内环境变量
RFSIMULATOR: server # 信道仿真器的类型,这里为Server
USE_SA_TDD_MONO: 'yes' # 使用单工作时段TDD模式
GNB_NAME: gnb-rfsim # gNB的名称
TAC: 40960 # 本地区域码
MCC: '208' # 移动国家代码
MNC: '95' # 移动网络代码
MNC_LENGTH: 2 # 移动网络代码的长度
NSSAI_SST: 1 # 希望连接的服务类型
AMF_IP_ADDRESS: 192.168.70.138 # AMF的IP地址
GNB_NGA_IF_NAME: eth0 # NGA接口名称
GNB_NGA_IP_ADDRESS: 192.168.70.153 # NGA接口IP地址
GNB_NGU_IF_NAME: eth0 # NGU接口名称
GNB_NGU_IP_ADDRESS: 192.168.70.153 # NGU接口IP地址
SDR_ADDRS: serial=XXXXXXX # 软件定义无线电(SDR)的串行端口地址
USE_ADDITIONAL_OPTIONS: --sa -E --rfsim --log_config.global_log_options level,nocolor,time # 附加选项,用于运行gNB程序
networks: # 容器连接的网络配置
public_net: # 容器连接的公共网络
ipv4_address: 192.168.70.153 # gNB IP地址
healthcheck: # 容器的健康检查配置
test: /bin/bash -c "pgrep nr-softmodem" # 检查nr-softmodem进程是否在运行
interval: 10s # 检查间隔时间
timeout: 5s # 检查超时时间
retries: 5 # 检查失败后的重试次数
oai-nr-ue1服务
oai-nr-ue1:
image: oaisoftwarealliance/oai-nr-ue:develop # 使用的 Docker 镜像
privileged: true # 是否特权模式,true 代表是
container_name: rfsim5g-oai-nr-ue1 # 容器名称
environment:
RFSIMULATOR: 192.168.70.153 # RF模拟器的IP地址
FULL_IMSI: '208950000000036' # UE的IMSI码
FULL_KEY: '0C0A34601D4F07677303652C0462535B' # UE的密钥
OPC: '63bfa50ee6523365ff14c1f45f88737d' # UE的OPC码
DNN: oai # UE的数据网络名称
NSSAI_SST: 1 # 请求N-SSAI的SST(用于网络切片)
USE_ADDITIONAL_OPTIONS: -E --sa --rfsim -r 106 --numerology 1 -C 3619200000 --nokrnmod --log_config.global_log_options level,nocolor,time # UE的附加选项
depends_on:
- oai-gnb # 依赖于 oai-gnb 容器
networks:
public_net:
ipv4_address: 192.168.70.154 # UE的IP地址
healthcheck:
test: /bin/bash -c "pgrep nr-uesoftmodem" # 容器健康检查的命令
interval: 10s # 容器健康检查的间隔时间
timeout: 5s # 容器健康检查的超时时间
retries: 5 # 容器健康检查的重试次数
gnbsim服务
gnbsim:
container_name: gnbsim # 容器名称
image: gnbsim:latest # 容器镜像
privileged: true # 特权模式
environment: # 环境变量
- MCC=208 # 移动国家码
- MNC=95 # 移动网络码
- GNBID=5 # 基站ID
- TAC=0x00a000 # 跟踪区域码
- SST=130 # 安全分区
- SD=000082 # 服务域
- PagingDRX=v32 # 页面DRX值
- RANUENGAPID=0 # RAN UE NGAP ID
- IMEISV=35609204079514 # 终端设备识别码
- MSIN=0000000037 # 移动用户识别码
- RoutingIndicator=1234 # 路由指示器
- ProtectionScheme=null # 保护方案
- KEY=0C0A34601D4F07677303652C0462535B # 鉴权密钥
- OPc=63bfa50ee6523365ff14c1f45f88737d # OPc
- DNN=oai.ipv4 # 数据网络名称
- URL=http://www.asnt.org:8080/ # URL
- NRCellID=1 # NR小区ID
- USE_FQDN=no # 是否使用全限定域名
- NGAPPeerAddr=192.168.70.138 # NGAP Peer地址
- GTPuLocalAddr=192.168.72.156 # GTPu本地地址
- GTPuIFname=eth0 # GTPu接口名称
networks: # 网络配置
public_net: # 公共网络
ipv4_address: 192.168.70.156 # IPv4地址
public_net_access: # 公共网络访问
ipv4_address: 192.168.72.156 # IPv4地址
healthcheck: # 健康检查
test: /bin/bash -c "ip address show dev gtp-gnb"
interval: 10s # 每10秒检查一次
timeout: 5s # 超时时间为5秒
retries: 5 # 重试次数为5次
networks: # 网络配置
public_net: # 公共网络
external: # 使用外部定义的网络
name: demo-oai-public-net
public_net_access: # 公共网络访问
external: # 使用外部定义的网络
name: oai-public-access
实验过程
实验设备介绍
硬件:
Window10系统主机一台: 32GB RAM 4CPU (RAM其实不需要这么多, 我的CPU是4CPU*4核)
软件:
VMware Workstation 16 Pro (version:16.2.3 build-19376536)
Ubuntu (version:18.04.4)
其中tshark与wireshark是用来抓包的,开始不一定需要安装
实验部署流程
本部署流程复现了OAI例程
Vmware安装
略
Ubuntu安装
- 下载Ubuntu18.04.4LTS 下载链接
-
新建Ubuntu虚拟机
根据自己的环境选择核心的安装位置
根据机器实际情况选择合适的CPU数量与核心数:
最好不要少于官方推荐数量
为虚拟机分配合适的RAM:
最好不要少于官方推荐值
选择合适的虚拟机存储空间大小:
由于之前20G用了一段时间就没有内存了。我选择了40G。不过可以选择20G即使没有内存也可以再扩展。
点击自定义硬件,选择Ubuntu 18.04.4.iso镜像文件用于安装操作系统:
-
开启创建的Ubuntu并进行安装
什么都不安装,节约安装时间
设置合适的用户名和密码:
等待吧:
安装完成
VMware tool工具安装
安装此工具可以让你自由的再Window是与Ubuntu中拖拽文件与复制粘贴
#删除之前的vmtools
sudo apt-get autoremove open-vm-tools
#安装,所有步骤都按enter保持默认设置
sudo apt-get install open-vm-tools
sudo apt-get install open-vm-tools-desktop
Ubuntu 中文输入法设置
打开设置
点击地域与语言
点击Manage Install Language
点击Install/Remove Language
找到 Chinese(simplified)点击勾勾 然后点击apply
然后会下载一会
点击输入源(source)下面的+
点击汉语
点击想要的输入法,点击添加
可以看到任务栏出现的图标
安装docker
1. 卸载旧版本Docker
#卸载旧版本docker
sudo apt-get remove docker docker-engine docker-ce docker.io
#清空旧版docker占用的内存
sudo apt-get remove --auto-remove docker
#更新系统源
sudo apt-get update
2.配置安装环境
sudo apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common
3. 添加阿里云的docker GPG密钥
curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
4. 添加阿里镜像源
sudo add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
#更新
sudo apt-get update
5. 查看有哪些版本
apt-cache madison docker-ce
6. 安装最新版/指定版本
#安装最新版
sudo apt-get install -y docker-ce
#安装5:19.03.6~3-0~ubuntu-bionic版
sudo apt-get install -y docker-ce=5:19.03.6~3-0~ubuntu-bionic
7. 重启Docker
sudo service docker restart
#或者
sudo systemctl restart docker
8. 查看Docke版本
sudo docker version
9. 运行hello-world验证docker-ce是否安装成功
sudo docker run hello-world
安装docker-compose
- 下载指定版本docker-compose二进制文件
#国外
sudo curl -L "https://github.com/docker/compose/releases/download/1.27.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
#国内
curl -L https://get.daocloud.io/docker/compose/releases/download/1.27.4/docker-compose-`uname -s`-`uname -m` > docker-compose
- 添加可执行权限
sudo chmod +x /usr/local/bin/docker-compose
- 将二进制文件移到用户目录下
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
- 验证版本
docker-compose version
-如果安装错误可卸载重装
sudo rm /usr/local/bin/docker-compose
下载镜像
从docker hub上下载所需版本的镜像,分为两个步骤:设置从docker hub下载环境 ,下载镜像
docker hub设置
- 将当前用户加入docker用户组
oai-network-slicing@oainetworkslicing-virtual-machine:~$ sudo usermod -aG docker ${USER}
- 登录docker hub
oai-network-slicing@oainetworkslicing-virtual-machine:~$ sudo docker login
- 下载完成后可以推出docker hub登录
docker logout
下载核心网镜像
注意:此步骤不是必须的,因为即使不下载镜像,在使用docker-compose启动时会自动下载缺少的镜像
- 下载所需环境镜像
$ docker pull ubuntu:bionic
$ docker pull mysql:8.0
- 根据如下网络切片对应表格下载对应images
#!/bin/bash
sudo docker pull oaisoftwarealliance/oai-amf:v1.5.0
sudo docker pull oaisoftwarealliance/oai-nrf:v1.5.0
sudo docker pull oaisoftwarealliance/oai-spgwu-tiny:v1.5.0
sudo docker pull oaisoftwarealliance/oai-smf:v1.5.0
sudo docker pull oaisoftwarealliance/oai-udr:v1.5.0
sudo docker pull oaisoftwarealliance/oai-udm:v1.5.0
sudo docker pull oaisoftwarealliance/oai-ausf:v1.5.0
sudo docker pull oaisoftwarealliance/oai-nssf:v1.5.0
sudo docker pull oaisoftwarealliance/oai-upf-vpp:v1.5.0
下载核心网代码
- 下载核心网代码
git clone --branch v1.5.0 https://gitlab.eurecom.fr/oai/cn5g/oai-cn5g-fed.git
-进行一些检测与同步
oai-network-slicing@oainetworkslicing-virtual-machine:~$ cd oai-cn5g-fed/
oai-network-slicing@oainetworkslicing-virtual-machine:~/oai-cn5g-fed$ git checkout -f v1.5.0
oai-network-slicing@oainetworkslicing-virtual-machine:~/oai-cn5g-fed$ ./scripts/syncComponents.sh
---------------------------------------------------------
OAI-NRF component branch : master
OAI-AMF component branch : master
OAI-SMF component branch : master
OAI-SPGW-U component branch : master
OAI-AUSF component branch : master
OAI-UDM component branch : master
OAI-UDR component branch : master
OAI-UPF-VPP component branch : master
OAI-NSSF component branch : master
OAI-NEF component branch : master
OAI-PCF component branch : master
---------------------------------------------------------
git submodule deinit --all --force
git submodule init
git submodule update --init --recursive
创建存储日志的文件夹
mkdir -p /tmp/oai/slicing-with-nssf
chmod 777 /tmp/oai/slicing-with-nssf
启动网络切片核心网
#进入指定文件夹
cd oai-cn5g-fed/
cd docker-compose/
#启动核心网
sudo docker-compose -f docker-compose-slicing-basic-nrf.yaml up -d
我手动下载了部分镜像,如下图所示,未下载的部分镜像在使用docker-compose启动时自动进行了下载
#查看容器状态
docker ps
下载与仿真基站镜像
- 下载镜像
sudo docker pull rohankharade/gnbsim:latest
sudo docker pull rohankharade/ueransim:latest
sudo docker pull oaisoftwarealliance/oai-gnb:develop
sudo docker pull oaisoftwarealliance/oai-nr-ue:develop
- re-gat镜像
sudo docker image tag rohankharade/gnbsim:latest gnbsim:latest
sudo docker image tag rohankharade/ueransim:latest ueransim:latest
- 查看镜像
接入仿真基站容器
- 接入ueransim
sudo docker-compose -f docker-compose-slicing-ransim.yaml up -d ueransim
- 接入oai仿真基站
sudo docker-compose -f docker-compose-slicing-ransim.yaml up -d oai-gnb oai-nr-ue1
- 接入gnb-sim
sudo docker-compose -f docker-compose-slicing-ransim.yaml up -d gnbsim
- 查看容器状态:
- 在amf日志中查看接入状况
sudo docker logs oai-amf
ue到核心网通信测试
- 查看日志信息
查看gnbsim的信息
docker logs gnbsim 2>&1 | tail -10
#查看amf信息获取接入状态
sudo docker logs oai-amf 2>&1 | tail -20
- ping测试
sudo docker exec oai-ext-dn ping -c 4 12.1.1.2
sudo docker exec oai-ext-dn ping -c 4 12.1.1.129
保证运行日志
sudo docker logs oai-amf > /tmp/oai/slicing-with-nssf/amf.log 2>&1
sudo docker logs oai-ausf > /tmp/oai/slicing-with-nssf/ausf.log 2>&1
sudo docker logs oai-nssf > /tmp/oai/slicing-with-nssf/nssf.log 2>&1
sudo docker logs oai-udm > /tmp/oai/slicing-with-nssf/udm.log 2>&1
sudo docker logs oai-udr > /tmp/oai/slicing-with-nssf/udr.log 2>&1
sudo docker logs oai-nrf-slice12 > /tmp/oai/slicing-with-nssf/nrf-slice12.log 2>&1
sudo docker logs oai-nrf-slice3 > /tmp/oai/slicing-with-nssf/nrf-slice3.log 2>&1
sudo docker logs oai-smf-slice1 > /tmp/oai/slicing-with-nssf/smf-slice1.log 2>&1
sudo docker logs oai-smf-slice2 > /tmp/oai/slicing-with-nssf/smf-slice2.log 2>&1
sudo docker logs oai-smf-slice3 > /tmp/oai/slicing-with-nssf/smf-slice3.log 2>&1
sudo docker logs oai-spgwu-slice1 > /tmp/oai/slicing-with-nssf/spgwu-slice1.log 2>&1
sudo docker logs oai-spgwu-slice2 > /tmp/oai/slicing-with-nssf/spgwu-slice2.log 2>&1
sudo docker logs vpp-upf-slice3 > /tmp/oai/slicing-with-nssf/vpp-upf-slice3.log 2>&1
sudo docker logs gnbsim > /tmp/oai/slicing-with-nssf/gnbsim.log 2>&1
sudo docker logs rfsim5g-oai-gnb > /tmp/oai/slicing-with-nssf/rfsim5g-oai-gnb.log 2>&1
sudo docker logs rfsim5g-oai-nr-ue1 > /tmp/oai/slicing-with-nssf/rfsim5g-oai-nr-ue1.log 2>&1
sudo docker logs ueransim > /tmp/oai/slicing-with-nssf/ueransim.log 2>&1
停止部署
- 停止部署基站
sudo docker-compose -f docker-compose-slicing-ransim.yaml down -t 0
- 停止部署核心网
sudo docker-compose -f docker-compose-slicing-basic-nrf.yaml down -t 0
实验调试过程
无
实验结论分析与总结
成功部署了官方例程
结论
成功部署了官方例程
参考文献
参考文献1:OAISA5G网络切片部署官方文件:oai-cn5g-fed/docs/DEPLOY_SA5G_SLICING.md
参考文献2:OAI 基础核心网部署:oai-cn5g-fed/docs/DEPLOY_SA5G_BASIC_DEPLOYMENT.md
参考文献3:Ubuntu 18.04.4 LTS 下载地址
附录1
docker-compose-slicing-basic-nrf.yaml
version: '3.8'
services:
mysql:
container_name: mysql
image: mysql:8.0
volumes:
- ./database/oai_db2.sql:/docker-entrypoint-initdb.d/oai_db.sql
- ./healthscripts/mysql-healthcheck2.sh:/tmp/mysql-healthcheck.sh
environment:
- TZ=Europe/Paris
- MYSQL_DATABASE=oai_db
- MYSQL_USER=test
- MYSQL_PASSWORD=test
- MYSQL_ROOT_PASSWORD=linux
healthcheck:
test: /bin/bash -c "/tmp/mysql-healthcheck.sh"
interval: 10s
timeout: 5s
retries: 30
networks:
public_net:
ipv4_address: 192.168.70.131
oai-nssf:
container_name: "oai-nssf"
image: oaisoftwarealliance/oai-nssf:v1.5.0
environment:
- INSTANCE=0
- TZ=Europe/Paris
- PID_DIRECTORY=/var/run
- NSSF_NAME=oai-nssf
- NSSF_FQDN=nssf.oai-5gcn.eur
- SBI_IF_NAME=eth0
- SBI_PORT=80
- SBI_API_VERSION=v1
- SBI_PORT_HTTP1=80
- SBI_PORT_HTTP2=8080
- NSSF_SLICE_CONFIG=/openair-nssf/etc/nssf_slice_config.yaml
cap_add:
- NET_ADMIN
- SYS_ADMIN
cap_drop:
- ALL
privileged: true
volumes:
- ./nssf_slice_config.yaml:/openair-nssf/etc/nssf_slice_config.yaml
networks:
public_net:
ipv4_address: 192.168.70.132
oai_udr:
container_name: oai-udr
image: oaisoftwarealliance/oai-udr:v1.5.0
environment:
- TZ=Europe/Paris
- INSTANCE=0
- PID_DIRECTORY=/var/run
- UDR_INTERFACE_NAME_FOR_NUDR=eth0
- UDR_INTERFACE_PORT_FOR_NUDR=80
- UDR_INTERFACE_HTTP2_PORT_FOR_NUDR=8080
- UDR_API_VERSION=v1
- MYSQL_IPV4_ADDRESS=192.168.70.131
- MYSQL_USER=test
- MYSQL_PASS=test
- MYSQL_DB=oai_db
- WAIT_MYSQL=120
depends_on:
- mysql
networks:
public_net:
ipv4_address: 192.168.70.133
oai_udm:
container_name: oai-udm
image: oaisoftwarealliance/oai-udm:v1.5.0
environment:
- TZ=Europe/Paris
- INSTANCE=0
- PID_DIRECTORY=/var/run
- UDM_NAME=OAI_UDM
- SBI_IF_NAME=eth0
- SBI_PORT=80
- UDM_VERSION_NB=v1
- USE_FQDN_DNS=yes
- UDR_IP_ADDRESS=192.168.70.133
- UDR_PORT=80
- UDR_VERSION_NB=v1
- UDR_FQDN=oai_udr
depends_on:
- oai_udr
networks:
public_net:
ipv4_address: 192.168.70.134
oai_ausf:
container_name: oai-ausf
image: oaisoftwarealliance/oai-ausf:v1.5.0
environment:
- TZ=Europe/Paris
- INSTANCE_ID=0
- PID_DIR=/var/run
- AUSF_NAME=OAI_AUSF
- SBI_IF_NAME=eth0
- SBI_PORT=80
- USE_FQDN_DNS=yes
- UDM_IP_ADDRESS=192.168.70.134
- UDM_PORT=80
- UDM_VERSION_NB=v1
- UDM_FQDN=oai_udm
depends_on:
- oai_udm
networks:
public_net:
ipv4_address: 192.168.70.135
oai_nrf_slice12:
container_name: oai-nrf-slice12
image: oaisoftwarealliance/oai-nrf:v1.5.0
environment:
- NRF_INTERFACE_NAME_FOR_SBI=eth0
- NRF_INTERFACE_PORT_FOR_SBI=80
- NRF_INTERFACE_HTTP2_PORT_FOR_SBI=8080
- NRF_API_VERSION=v1
- INSTANCE=0
- PID_DIRECTORY=/var/run
networks:
public_net:
ipv4_address: 192.168.70.136
oai_nrf_slice3:
container_name: oai-nrf-slice3
image: oaisoftwarealliance/oai-nrf:v1.5.0
environment:
- NRF_INTERFACE_NAME_FOR_SBI=eth0
- NRF_INTERFACE_PORT_FOR_SBI=80
- NRF_INTERFACE_HTTP2_PORT_FOR_SBI=8080
- NRF_API_VERSION=v1
- INSTANCE=0
- PID_DIRECTORY=/var/run
networks:
public_net:
ipv4_address: 192.168.70.137
oai_amf:
container_name: oai-amf
image: oaisoftwarealliance/oai-amf:v1.5.0
environment:
- TZ=Europe/paris
- INSTANCE=0
- PID_DIRECTORY=/var/run
- MCC=208
- MNC=95
- REGION_ID=128
- AMF_SET_ID=1
- SERVED_GUAMI_MCC_0=208
- SERVED_GUAMI_MNC_0=95
- SERVED_GUAMI_REGION_ID_0=128
- SERVED_GUAMI_AMF_SET_ID_0=1
- SERVED_GUAMI_MCC_1=460
- SERVED_GUAMI_MNC_1=11
- SERVED_GUAMI_REGION_ID_1=10
- SERVED_GUAMI_AMF_SET_ID_1=1
- PLMN_SUPPORT_MCC=208
- PLMN_SUPPORT_MNC=95
- PLMN_SUPPORT_TAC=0xa000
- SST_0=128
- SD_0=128
- SST_1=1
- SD_1=0xFFFFFF
- SST_2=130
- SD_2=130
- AMF_INTERFACE_NAME_FOR_NGAP=eth0
- AMF_INTERFACE_NAME_FOR_N11=eth0
- SMF_INSTANCE_ID_0=1
- SMF_FQDN_0=oai_smf_slice1
- SMF_IPV4_ADDR_0=0.0.0.0
- SMF_HTTP_VERSION_0=v1
- SELECTED_0=true
- SMF_INSTANCE_ID_1=2
- SMF_FQDN_1=oai_smf_slice2
- SMF_IPV4_ADDR_1=0.0.0.0
- SMF_HTTP_VERSION_1=v1
- SELECTED_1=false
- MYSQL_SERVER=192.168.70.131
- MYSQL_USER=root
- MYSQL_PASS=linux
- MYSQL_DB=oai_db
- OPERATOR_KEY=63bfa50ee6523365ff14c1f45f88737d
- NRF_IPV4_ADDRESS=0.0.0.0
- NRF_PORT=80
- EXTERNAL_NRF=no
- NF_REGISTRATION=no
- SMF_SELECTION=yes
- USE_FQDN_DNS=yes
- EXTERNAL_AUSF=yes
- NRF_API_VERSION=v1
- NRF_FQDN=oai_nrf_slice12
- AUSF_IPV4_ADDRESS=192.168.70.135
- AUSF_PORT=80
- AUSF_API_VERSION=v1
- AUSF_FQDN=oai_ausf
- UDM_IPV4_ADDRESS=192.168.70.134
- UDM_PORT=80
- UDM_API_VERSION=v2
- UDM_FQDN=oai_udm
- NRF_SELECTION=yes
- EXTERNAL_NSSF=yes
- NSSF_IPV4_ADDRESS=192.168.70.132
- NSSF_PORT=80
- NSSF_API_VERSION=v1
- NSSF_FQDN=oai-nssf
- USE_HTTP2=no
- INT_ALGO_LIST=["NIA1" , "NIA2"]
- CIPH_ALGO_LIST=["NEA1" , "NEA2"]
depends_on:
- mysql
- oai_nrf_slice12
- vpp_upf_slice3
- oai_ausf
networks:
public_net:
ipv4_address: 192.168.70.138
oai_smf_slice1:
container_name: oai-smf-slice1
image: oaisoftwarealliance/oai-smf:v1.5.0
environment:
- TZ=Europe/Paris
- INSTANCE=0
- PID_DIRECTORY=/var/run
- SMF_INTERFACE_NAME_FOR_N4=eth0
- SMF_INTERFACE_NAME_FOR_SBI=eth0
- SMF_INTERFACE_PORT_FOR_SBI=80
- SMF_INTERFACE_HTTP2_PORT_FOR_SBI=8080
- SMF_API_VERSION=v1
- DEFAULT_DNS_IPV4_ADDRESS=172.21.3.100
- DEFAULT_DNS_SEC_IPV4_ADDRESS=8.8.8.8
- AMF_IPV4_ADDRESS=192.168.70.138
- AMF_PORT=80
- AMF_API_VERSION=v1
- AMF_FQDN=oai_amf
- UDM_IPV4_ADDRESS=192.168.70.134
- UDM_PORT=80
- UDM_API_VERSION=v2
- UDM_FQDN=oai_udm
- UPF_IPV4_ADDRESS=127.0.0.1
- UPF_FQDN_0=localhost
- NRF_IPV4_ADDRESS=192.168.70.136
- NRF_PORT=80
- NRF_API_VERSION=v1
- NRF_FQDN=oai_nrf_slice12
- REGISTER_NRF=yes
- DISCOVER_UPF=yes
- DISCOVER_PCF=no
- USE_LOCAL_SUBSCRIPTION_INFO=yes
- USE_LOCAL_PCC_RULES=yes
- USE_FQDN_DNS=yes
- DNN_NI0=default
- TYPE0=IPv4
- DNN_RANGE0=12.2.1.2 - 12.2.1.128
- NSSAI_SST0=128
- NSSAI_SD0=128
- SESSION_AMBR_UL0=50Mbps
- SESSION_AMBR_DL0=100Mbps
depends_on:
- oai_amf
- oai_nrf_slice12
networks:
public_net:
ipv4_address: 192.168.70.139
oai_smf_slice2:
container_name: oai-smf-slice2
image: oaisoftwarealliance/oai-smf:v1.5.0
environment:
- TZ=Europe/Paris
- INSTANCE=0
- PID_DIRECTORY=/var/run
- SMF_INTERFACE_NAME_FOR_N4=eth0
- SMF_INTERFACE_NAME_FOR_SBI=eth0
- SMF_INTERFACE_PORT_FOR_SBI=80
- SMF_INTERFACE_HTTP2_PORT_FOR_SBI=8080
- SMF_API_VERSION=v1
- DEFAULT_DNS_IPV4_ADDRESS=172.21.3.100
- DEFAULT_DNS_SEC_IPV4_ADDRESS=8.8.8.8
- AMF_IPV4_ADDRESS=192.168.70.138
- AMF_PORT=80
- AMF_API_VERSION=v1
- AMF_FQDN=oai_amf
- UDM_IPV4_ADDRESS=192.168.70.134
- UDM_PORT=80
- UDM_API_VERSION=v2
- UDM_FQDN=localhost
- UPF_IPV4_ADDRESS=0.0.0.0
- UPF_FQDN_0=localhost
- NRF_IPV4_ADDRESS=192.168.70.136
- NRF_PORT=80
- NRF_API_VERSION=v1
- NRF_FQDN=oai_nrf_slice12
- REGISTER_NRF=yes
- DISCOVER_UPF=yes
- DISCOVER_PCF=no
- USE_LOCAL_SUBSCRIPTION_INFO=yes
- USE_LOCAL_PCC_RULES=yes
- USE_FQDN_DNS=yes
- DNN_NI0=oai
- TYPE0=IPv4
- DNN_RANGE0=12.1.1.129 - 12.1.1.224
- NSSAI_SST0=1
- SESSION_AMBR_UL0=200Mbps
- SESSION_AMBR_DL0=400Mbps
depends_on:
- oai_amf
- oai_nrf_slice12
networks:
public_net:
ipv4_address: 192.168.70.140
oai_smf_slice3:
container_name: oai-smf-slice3
image: oaisoftwarealliance/oai-smf:v1.5.0
environment:
- TZ=Europe/Paris
- INSTANCE=0
- PID_DIRECTORY=/var/run
- SMF_INTERFACE_NAME_FOR_N4=eth0
- SMF_INTERFACE_NAME_FOR_SBI=eth0
- SMF_INTERFACE_PORT_FOR_SBI=80
- SMF_INTERFACE_HTTP2_PORT_FOR_SBI=8080
- SMF_API_VERSION=v1
- DEFAULT_DNS_IPV4_ADDRESS=172.21.3.100
- DEFAULT_DNS_SEC_IPV4_ADDRESS=8.8.8.8
- AMF_IPV4_ADDRESS=192.168.70.138
- AMF_PORT=80
- AMF_API_VERSION=v1
- AMF_FQDN=oai_amf
- UDM_IPV4_ADDRESS=192.168.70.134
- UDM_PORT=80
- UDM_API_VERSION=v2
- UDM_FQDN=localhost
- UPF_IPV4_ADDRESS=0.0.0.0
- UPF_FQDN_0=localhost
- NRF_IPV4_ADDRESS=192.168.70.137
- NRF_PORT=80
- NRF_API_VERSION=v1
- NRF_FQDN=oai_nrf_slice3
- USE_NETWORK_INSTANCE=yes
- REGISTER_NRF=yes
- DISCOVER_UPF=yes
- DISCOVER_PCF=no
- USE_LOCAL_SUBSCRIPTION_INFO=yes
- USE_LOCAL_PCC_RULES=yes
- USE_FQDN_DNS=yes
- DNN_NI0=oai.ipv4
- TYPE0=IPv4
- DNN_RANGE0=12.1.1.2 - 12.1.1.128
- NSSAI_SST0=130
- NSSAI_SD0=130
- SESSION_AMBR_UL0=100Mbps
- SESSION_AMBR_DL0=200Mbps
depends_on:
- oai_amf
- oai_nrf_slice3
extra_hosts:
- "vpp-upf.node.5gcn.mnc95.mcc208.3gppnetwork.org:192.168.70.201"
networks:
public_net:
ipv4_address: 192.168.70.141
oai_spgwu_slice1:
container_name: oai-spgwu-slice1
image: oaisoftwarealliance/oai-spgwu-tiny:v1.5.0
environment:
- TZ=Europe/Paris
- PID_DIRECTORY=/var/run
- SGW_INTERFACE_NAME_FOR_S1U_S12_S4_UP=eth0
- SGW_INTERFACE_NAME_FOR_SX=eth0
- PGW_INTERFACE_NAME_FOR_SGI=eth0
- NETWORK_UE_NAT_OPTION=yes
- NETWORK_UE_IP=12.2.1.0/24
- BYPASS_UL_PFCP_RULES=no
- MCC=208
- MNC=95
- MNC03=095
- TAC=40960
- GW_ID=1
- REALM=openairinterface.org
- ENABLE_5G_FEATURES=yes
- REGISTER_NRF=yes
- USE_FQDN_NRF=yes
- UPF_FQDN_5G=oai_spgwu_slice1
- NRF_IPV4_ADDRESS=192.168.70.136
- NRF_PORT=80
- NRF_API_VERSION=v1
- NRF_FQDN=oai_nrf_slice12
- NSSAI_SST_0=128
- NSSAI_SD_0=128
- DNN_0=default
depends_on:
- oai_nrf_slice12
- oai_smf_slice1
cap_add:
- NET_ADMIN
- SYS_ADMIN
cap_drop:
- ALL
privileged: true
networks:
public_net:
ipv4_address: 192.168.70.142
oai_spgwu_slice2:
container_name: oai-spgwu-slice2
image: oaisoftwarealliance/oai-spgwu-tiny:v1.5.0
environment:
- TZ=Europe/Paris
- PID_DIRECTORY=/var/run
- SGW_INTERFACE_NAME_FOR_S1U_S12_S4_UP=eth0
- SGW_INTERFACE_NAME_FOR_SX=eth0
- PGW_INTERFACE_NAME_FOR_SGI=eth0
- NETWORK_UE_NAT_OPTION=yes
- NETWORK_UE_IP=12.1.1.0/24
- BYPASS_UL_PFCP_RULES=no
- MCC=208
- MNC=95
- MNC03=095
- TAC=40960
- GW_ID=1
- REALM=openairinterface.org
- ENABLE_5G_FEATURES=yes
- REGISTER_NRF=yes
- USE_FQDN_NRF=yes
- UPF_FQDN_5G=oai_spgwu_slice2
- NRF_IPV4_ADDRESS=192.168.70.136
- NRF_PORT=80
- NRF_API_VERSION=v1
- NRF_FQDN=oai_nrf_slice12
- NSSAI_SST_0=1
- DNN_0=oai
depends_on:
- oai_nrf_slice12
cap_add:
- NET_ADMIN
- SYS_ADMIN
cap_drop:
- ALL
privileged: true
networks:
public_net:
ipv4_address: 192.168.70.143
vpp_upf_slice3:
image: oaisoftwarealliance/oai-upf-vpp:v1.5.0
privileged: true
container_name: vpp-upf-slice3
environment:
- IF_1_IP=192.168.70.201
- IF_1_TYPE=N4
- IF_2_IP=192.168.72.201
- IF_2_TYPE=N3
- IF_2_NWI=access.oai.org
- IF_3_IP=192.168.73.201
- IF_3_TYPE=N6
- IF_3_IP_REMOTE=192.168.73.145 # EXT-DN IP Address
- IF_3_NWI=internet.oai.org
- NAME=VPP-UPF
- MNC=95
- MCC=208
- REALM=3gppnetwork.org
- VPP_MAIN_CORE=0
- VPP_CORE_WORKER=1
# - VPP_PLUGIN_PATH=/usr/lib64/vpp_plugins/ # RHEL7
- VPP_PLUGIN_PATH=/usr/lib/x86_64-linux-gnu/vpp_plugins/
- SNSSAI_SD=130
- SNSSAI_SST=130
- DNN=oai.ipv4
- REGISTER_NRF=yes
- NRF_IP_ADDR=192.168.70.137
- NRF_PORT=8080
- HTTP_VERSION=2
depends_on:
- oai_nrf_slice3
healthcheck:
test: /bin/bash -c "pgrep vpp"
interval: 10s
timeout: 5s
retries: 5
networks:
public_net:
ipv4_address: 192.168.70.144
public_net_access:
ipv4_address: 192.168.72.144
public_net_core:
ipv4_address: 192.168.73.144
oai_ext_dn:
image: oaisoftwarealliance/trf-gen-cn5g:latest
privileged: true
init: true
container_name: oai-ext-dn
entrypoint: /bin/bash -c \
"iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE;"\
"ip route add 12.2.1.2/32 via 192.168.70.142 dev eth0;"\
"ip route add 12.1.1.129/32 via 192.168.70.143 dev eth0;"\
"ip route add 12.1.1.2/32 via 192.168.73.201 dev eth1; ip route; sleep infinity"
command: ["/bin/bash", "-c", "trap : SIGTERM SIGINT; sleep infinity & wait"]
healthcheck:
test: /bin/bash -c "iptables -L -t nat | grep MASQUERADE"
interval: 10s
timeout: 5s
retries: 10
networks:
public_net:
ipv4_address: 192.168.70.145
public_net_core:
ipv4_address: 192.168.73.145
networks:
public_net:
driver: bridge
name: demo-oai-public-net
ipam:
config:
- subnet: 192.168.70.0/24
driver_opts:
com.docker.network.bridge.name: "demo-oai"
public_net_access:
name: oai-public-access
ipam:
config:
- subnet: 192.168.72.0/24
driver_opts:
com.docker.network.bridge.name: "cn5g-access"
public_net_core:
name: oai-public-core
ipam:
config:
- subnet: 192.168.73.0/24
driver_opts:
com.docker.network.bridge.name: "cn5g-core"
docker-compose-slicing-ransim.yaml
version: '3.8'
services:
ueransim:
container_name: ueransim
image: ueransim:latest
privileged: true
environment:
# GNB Congig Parameters
- MCC=208
- MNC=95
- NCI=0x000000010
- TAC=0xa000
- LINK_IP=192.168.70.152
- NGAP_IP=192.168.70.152
- GTP_IP=192.168.70.152
- NGAP_PEER_IP=192.168.70.138
- SST=128
- SD=128
- SST_0=128
- SD_0=128
- SST_1=1
- SD_1=0
- SST_2=131
- SD_2=131
- IGNORE_STREAM_IDS=true
# UE Config Parameters
- NUMBER_OF_UE=1
- IMSI=208950000000035
- KEY=0C0A34601D4F07677303652C0462535B
- OP=63bfa50ee6523365ff14c1f45f88737d
- OP_TYPE=OPC
- AMF_VALUE=8000
- IMEI=356938035643803
- IMEI_SV=0035609204079514
- GNB_IP_ADDRESS=192.168.70.152
- PDU_TYPE=IPv4
- APN=default
- SST_R=128 #Requested N-SSAI
- SD_R=128
- SST_C=128
- SD_C=128
- SST_D=128
- SD_D=128
networks:
public_net:
ipv4_address: 192.168.70.152
healthcheck:
test: /bin/bash -c "ifconfig uesimtun0"
interval: 10s
timeout: 5s
retries: 5
oai-gnb:
image: oaisoftwarealliance/oai-gnb:develop
privileged: true
container_name: rfsim5g-oai-gnb
environment:
RFSIMULATOR: server
USE_SA_TDD_MONO: 'yes'
GNB_NAME: gnb-rfsim
TAC: 40960
MCC: '208'
MNC: '95'
MNC_LENGTH: 2
NSSAI_SST: 1
AMF_IP_ADDRESS: 192.168.70.138
GNB_NGA_IF_NAME: eth0
GNB_NGA_IP_ADDRESS: 192.168.70.153
GNB_NGU_IF_NAME: eth0
GNB_NGU_IP_ADDRESS: 192.168.70.153
SDR_ADDRS: serial=XXXXXXX
USE_ADDITIONAL_OPTIONS: --sa -E --rfsim --log_config.global_log_options level,nocolor,time
networks:
public_net:
ipv4_address: 192.168.70.153
healthcheck:
test: /bin/bash -c "pgrep nr-softmodem"
interval: 10s
timeout: 5s
retries: 5
oai-nr-ue1:
image: oaisoftwarealliance/oai-nr-ue:develop
privileged: true
container_name: rfsim5g-oai-nr-ue1
environment:
RFSIMULATOR: 192.168.70.153
FULL_IMSI: '208950000000036'
FULL_KEY: '0C0A34601D4F07677303652C0462535B'
OPC: '63bfa50ee6523365ff14c1f45f88737d'
DNN: oai
NSSAI_SST: 1
USE_ADDITIONAL_OPTIONS: -E --sa --rfsim -r 106 --numerology 1 -C 3619200000 --nokrnmod --log_config.global_log_options level,nocolor,time
depends_on:
- oai-gnb
networks:
public_net:
ipv4_address: 192.168.70.154
healthcheck:
test: /bin/bash -c "pgrep nr-uesoftmodem"
interval: 10s
timeout: 5s
retries: 5
# oai-nr-ue2:
# image: oai-nr-ue:develop
# privileged: true
# container_name: rfsim5g-oai-nr-ue2
# environment:
# RFSIMULATOR: 192.168.70.153
# FULL_IMSI: '208950000000037'
# FULL_KEY: '0C0A34601D4F07677303652C0462535B'
# OPC: '63bfa50ee6523365ff14c1f45f88737d'
# DNN: oai
# NSSAI_SST: 1
# NSSAI_SD: 0
# USE_ADDITIONAL_OPTIONS: -E --sa --rfsim -r 106 --numerology 1 -C 3619200000 --nokrnmod
# depends_on:
# - oai-gnb
# networks:
# public_net:
# ipv4_address: 192.168.70.155
# healthcheck:
# test: /bin/bash -c "pgrep nr-uesoftmodem"
# interval: 10s
# timeout: 5s
# retries: 5
gnbsim:
container_name: gnbsim
image: gnbsim:latest
privileged: true
environment:
- MCC=208
- MNC=95
- GNBID=5
- TAC=0x00a000
- SST=130
- SD=000082
- PagingDRX=v32
- RANUENGAPID=0
- IMEISV=35609204079514
- MSIN=0000000037
- RoutingIndicator=1234
- ProtectionScheme=null
- KEY=0C0A34601D4F07677303652C0462535B
- OPc=63bfa50ee6523365ff14c1f45f88737d
- DNN=oai.ipv4
- URL=http://www.asnt.org:8080/
- NRCellID=1
- USE_FQDN=no
- NGAPPeerAddr=192.168.70.138
- GTPuLocalAddr=192.168.72.156
- GTPuIFname=eth0
networks:
public_net:
ipv4_address: 192.168.70.156
public_net_access:
ipv4_address: 192.168.72.156
healthcheck:
test: /bin/bash -c "ip address show dev gtp-gnb"
interval: 10s
timeout: 5s
retries: 5
networks:
public_net:
external:
name: demo-oai-public-net
public_net_access:
external:
name: oai-public-access