5G核心网部署及测试手册

在THU做的free5gc和分布式核心网,夹杂linux开发

Free5GC核心网部署与接入测试手册

写在开篇 建议养成备份(例如git工具)的好习惯。本文包含Linux开发基础内容、free5gc核心网

考虑到版权问题,本文章如需要转载请进行声明。

起初使用VMware虚拟机装的Ubuntu桌面版系统,但是实际工程需要板载Linux系统(但是学习初期直接上手,容易因为不熟悉操作而出现诸如网卡连不了网,没声音,拼音输入法等软硬件不适配类似的各种问题)可以先基于虚拟机进行学习,入门后再基于板载Linux系统开发核心网。

5G核心网介绍

参考 【5G】5G 核心网(5GC)基本架构_5g核心网架构-CSDN博客

核心网具体结构

5G 核心网是支持 5G 移动通信的核心基础设施,在 5G 通信中负责实现数据处理、控制、管理、路由和连接等功能。5G 核心网的架构采用了基于服务的设计 (Service-based Architecture, SBA),支持网络切片、NFV、软件定义网络 (Software-Defined Networking, SDN) 等先进技术,提供更高的灵活性和可扩展性。

5G网络架构与接口

5G核心网网元功能

  • AMF (Access and Mobility Management Function) 接入与移动性管理功能,主要负责:

    • 接入控制、用户移动性管理
    • 会话管理和用户身份管理
    • 处理UE与网络的接入请求
    • 管理用户接入状态及移动性支持
  • SMF (Session Management Function)

    会话管理功能,负责:

    • 会话的建立、修改和释放
    • 数据流管理(路由、QoS保证、IP分配)
  • UPF (User Plane Function) 用户面功能,负责:

    • 转发用户数据流
    • 与SMF协作管理数据路径、路由和转发
  • NSSF (Network Slice Selection Function) 网络切片选择功能,负责:

    • 根据业务需求动态选择网络切片
    • 管理不同业务场景的切片资源
  • PCF (Policy Control Function) 策略控制功能,负责:

    • 制定网络策略(QoS、计费、流量管理、安全性)
    • 为AMF/SMF/UPF提供策略决策服务
  • UDM (Unified Data Management) 统一数据管理功能,负责:

    • 存储用户订阅信息(SUPI)、服务配置、认证信息
    • 与AUSF/AMF等网元协作提供数据服务

5G网络组成

  • 架构组成:5GC(核心网) + RAN(无线接入网) + UE(用户设备)
  • 核心网功能:服务管理、数据传输、安全性
  • RAN功能:无线连接、数据传输与控制信号传递
  • UE角色:用户交互终端,通过RAN与核心网通信

无线接入网与核心网接口

主要接口及功能:

  • N1接口

    • 连接:UE ↔ AMF
    • 功能:信令传递(UE接入管理、认证)
  • N2接口

    • 连接:AMF ↔ SMF
    • 功能:会话管理协作(处理用户会话任务)
  • N3接口

    • 连接:无线接入网 ↔ UPF
    • 功能:用户数据传输(数据面主要路径)
  • N4接口

    • 连接:SMF ↔ UPF
    • 功能:用户数据路径选择与管理(SMF控制UPF流量)
  • N6接口

    • 连接:UPF ↔ 数据网络(DN)
    • 功能:用户数据外发至互联网/外部网络

linux开发基本配置与指令

一、常用指令

1.基本指令部分

复制 Ctrl+Shift+C

粘贴 Ctrl+Shift+V

更新包列表

1
sudo apt update

查网卡ip

1
2
Ifconfig
# 记得提前安装ifconfig网络工具 sudo apt install net-tools

或者

1
 ip a

显示当前路径

1
pwd

进入文件夹

1
2
3
cd <文件夹名>
# 例如 cd free5gc-compose
# 或者进入多个内嵌文件夹如 cd ~/free5gc-compose/config

查询网站ip地址

1
nslookup baidu.com

查各网元运行情况、地址

1
2
docker-compose ps
或看全部网元:  docker ps -a

停止容器网元运行

1
docker-compose down

启动容器网元并后台挂机

1
docker-compose up -d

查看运行日志(以amf为例,可换成smf、upf等)

1
docker logs <id> 

例如:docker logs amf

查找单个网元信息(例如amf)

1
docker inspect amf

进入容器进行交互

1
docker exec -it <容器ID或容器名(如amf)> sh

或者docker exec -it <容器ID或容器名(如amf)> bash

按照格式查找所有网元的ip地址(没有启动或者出错就不显示)

1
docker inspect -f '{{.Name}} - {{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $(docker ps -aq)

查询所有网元mac地址

1
docker inspect -f '{{.Name}} - {{range .NetworkSettings.Networks}}{{.MacAddress}}{{end}}' $(docker ps -aq)

我的地址(每个人的都不同,根据实际情况可以修改): /home/wxy/free5gc-compose/config/amfcfg.yaml

查看端口情况

1
etstat -tuln | grep 38412

看防火墙设置

1
sudo iptables -L

看网桥

1
brctl show

查看网桥连接的ip地址

1
brctl showmacs <网桥名>

看路由

1
ip route show

添加网桥

1
sudo brctl addif <bridge> <网卡名>

Linux启动wireshark抓包——需要安装linux的wireshark然后启动: sudo wireshark

2.网络空间测试

一般是用docker inspect amf或者docker logs amf来对amf、smf、upf之类的进行测试,

也可以进入网络空间进行进一步测试例如:

1
docker exec -it upf bash

不过最好是利用pid方法进入网络空间进行ifconfig或者ping操作

1
2
3
ps aux | grep upf #获取进程(可以得到各种进程id)
pgrep -f upf #获取pid:
sudo nsenter -t <pid> -n #进入网络空间

其余指令还有kill之类的可以终止进程。

除此之外有的时候ping网站可能会遇到name resolution的报错,可以换成ip地址,指令如下,以百度为例:

1
nslookup baidu.com

不过ping命令有的时候会被网页阻拦,用curl命令比较合适,例如:

1
curl www.baidu.com

3.启动环境部分

启动核心网和ueransim环境分以下三步,根据实际情况可以更改代码:

启动核心网环境

1
2
cd ~/free5gc-compose
sudo docker-compose up -d

启动UERANSIM的gnb

1
2
cd ~/UERANSIM/build
./nr-gnb -c ../config/free5gc-gnb.yaml

启动ue

1
2
cd ~/UERANSIM/build
sudo ./nr-ue -c ../config/free5gc-ue.yaml

虚拟网卡测试方法

1
2
ping www.baidu.com -I uesimtun0
# 或者 curl www.baidu.com -I uesimtun0

二、虚拟机Linux设置vpn方法

途径1.主机共享vpn

参考:VMware Ubuntu虚拟机 使用主机VPN 配置(简单、可行)-CSDN博客

(图片资源没保存,所以只有文字了)

一定要记得开篇说的资源备份啊呜呜呜

打开虚拟网络编辑器,可以看到虚拟机开启的NAT模式是VMnet8

主机windows+R输入cmd打开命令行输入ipconfig ,得到VMnet8的ip:192.168.154.1。之后查询vpn端口,以clash为例,右上角记下vpn的端口,之后允许局域网记得打开。

在虚拟机的设置中打开proxy代理,选择manual,

虚拟机网络地址与VPN Port需要根据本机确定,左边四个填VMnet4的ip,右边四个填vpn的端口即可。

问题1:如果我的vpn没有用clash,不知道vpn端口怎么办?

参考:在windows中如何查看代理的地址和端口_怎么查看自己电脑的代理地址-CSDN博客

Windows+R输入control打开主机的控制面板,点击「网络和Internet」,

在「internet选项」中点击「连接」的「局域网设置」

启用代理服务器,不用打勾,保持默认就行,右下角端口即为vpn端口。

问题2:为什么我的vpn它通不了外网?

一般而言,如果浏览器可以打开谷歌就证明梯子没问题。那么问题就出在——实际命令行终端走代理需要进一步配置端口

已知代理端口(例如7890),之后就set一下http、https两个协议走这个端口,类似于

1
set http_proxy=http://127.0.0.1:7890 & set https_proxy=http://127.0.0.1:7890

但是具体还是得看具体的设备,这种事情可以问一下ai。

途径2.linux里下载Clash

csdn里有相关内容,请自行搜索,配置起来较麻烦,

Linux下Clash翻墙完整使用指南 | Clash中文教程网

这个教程写的不是很清楚,可以拓展一下。

三、主机与虚拟机共享剪贴板

参考:主机和VMware虚拟机间共享剪贴板方法_vmware workstation 中启用了剪贴板共享功能-CSDN博客

为啥主机复制过去虚拟机粘贴不了?有的时候可以复制粘贴有的时候不能?一般来说,先设置虚拟机,需要保证客户机隔离里面是启用复制粘贴的(默认启用)

如果这个时候还不行,可以需要安装虚拟机增强工具包open-vm-toolsopen-vm-tools-desktop,安装命令:

1
2
sudo apt-get install open-vm-tools
sudo apt-get install open-vm-tools-desktop

然后重启系统:

1
sudo reboot

四、虚拟机关机与挂起

虚拟机关机就是不再占用资源,但是再次开启需要重启;挂起就是虚拟机保存挂起的状态,打开不需要重启。

最重要的事情是记得自己虚拟机的路径.

问题1:关机后找不到虚拟机咋办

点击扫描虚拟机,找到.vmx文件打开就行。

五、虚拟机分盘扩容操作

有的时候给虚拟机分盘内存太小,当盘快满的时候会弹出警告,一定要提前采取措施来分盘,否则会启动不了虚拟机。

1
lsblk #检查磁盘情况
1
df -h	#检查磁盘占用情况

可以看到我主要的盘sda3占用了53%。

分盘主要是两个操作

  • 划出内存

    编辑虚拟机设置-硬盘-拓展,然后选择扩展后的硬盘空间

  • 分配空间

    考虑两种方法可以,有一个是类似于windows的图形化分盘,下载并启动gparted,这个方法在VMware虚拟机扩容磁盘,有很详细图文_虚拟机硬盘空间-CSDN博客有提及。

    1
    2
    3
    
    sudo apt-get update
    sudo apt install gparted
    sudo gparted
    

    在图形界面中可以选择 /dev/sda3 分区,然后调整它的大小。

    或者利用fdisk(推荐),输入命令:

    1
    
    sudo fdisk /dev/sda
    

    再输入p得到分区列表预览:

    fdisk 中执行命令汇总如下

    • 输入 p 显示当前的分区列表,记下 /dev/sda3 的起始位置(例如 1054720)。

    • 输入 d 删除 /dev/sda3,并确保输入分区号(3)。注意,这不会删除数据,分区号只是从分区表中移除。

    • 输入 n 创建新分区,选择 3 为分区号,使用 1054720为起始扇区(与之前一致),并设置结束扇区为新的磁盘容量(可以选择最大可用空间)。

    • 输入 w 保存更改并退出 fdisk

      可能遇见这种情况,但是如果默认系统是linux一般用不上:输入 t 设置分区类型,选择 83(Linux 文件系统)。

    问题1:虚拟机退出后再启动会卡在初始页面

    类似于这样,进不去虚拟机,一直卡在这个地方:

    因为没注意虚拟机盘满了,卡在初始界面进不去,所以要在盘快满的时候提前分盘

    VMware卡在命令行/dev/sda3 clean… 界面不动的解决办法:

    参考https://blog.csdn.net/SunshineLiy/article/details/134372529

    显示分区已满,需要找到这个分区一些没用的文件删掉,先进去虚拟机能分盘再说。

    进入 grub 模式,重启虚拟机,在显示到这个界面的时候

    快速按下 Shift 不要松,直到出现grub界面(这一步需要反应快一些,多试几遍就可以,如果操作正确的话,grub界面很快就会出来,如果按Shift三秒没有出现,大概率是操作错误了。此方法如果进不去,也可以参考网上也有其他进入grub的方法)

    进入ubuntu(高级模式),选择第一个advanced

    之后选择第二个

    选择root

    选择root后会弹出两行提示,直接回车就可以

    输入以下指令看到磁盘使用情况

    1
    
     df -h
    

    sda3确实100%满了,所以我们需要在命令行来清理一些文件。

    查看根目录下所有文件和目录的磁盘使用情况

    1
    
    du -sh /*
    

    找到自己占用空间较多的文件目录

    1
    
    rm -f /文件名/ 
    

    删除那些暂时没有用的大文件,reboot 重启。然后赶紧增加空间!!!

六、Ubuntu桌面相关问题

1.桌面字标大小

调整分辨率缩放就行。缩放到200%左右比较合适,在setting里面设置。有的时候会有桌面越来越小的bug,在设置里面改就可以。

2.桌面卡死

输入以下命令重启桌面等一会就行:

1
sudo restart lightdm

七、虚拟机没网设置网络图标消失

如果只是网络连接处显示问号,可以在终端输入:

1
sudo vim /var/lib/NetworkManager/NetworkManager.state

保证这里是true。重启虚拟机,检查情况。如果还没有反应可以重启主机,再排查

参考彻底解决VM ubuntu在虚拟机找不到网卡无法上网的问题 - 知乎

还是不行在setting里面找network关了重开,而如果第一行开启按钮没有显示的话可能需要用以下方式:

1
2
3
sudo service NetworkManager stop
sudo rm /var/lib/NetworkManager/NetworkManager.state
sudo service NetworkManager start

最后的办法是还原默认设置后再看看有没有,没有的话再进行上一步输入命令。

Free5gc部署、UERANSIM安装

主要参考:Free5gc+UERANSIM模拟5G网络环境搭建及基本使用 - FreeBuf网络安全行业门户

此处采用docker容器化部署,其他独立化部署可以看教程,根据实际情况同时参考教程和本文档。

考虑实际情况,建议这里采用镜像源代理的方式,暂且不用vpn

一、Free5gc部署

准备工作

使用命令:

1
uname -a

此命令用于确认安装的虚拟机内核版本,要求的内核版本为5.0.0-23-generic或5.4.0及之后的版本,

若当前虚拟机内核版本不符合要求,则需要更换内核,使用以下命令安装5.0.0-23-generic的内核,注意用sudo是管理员权限的操作,需要输入密码,为了安全,密码一般是不显示的但是可以输入,并不是bug,输入后按回车。

1
2
sudo apt install 'linux-image-5.0.0-23-generic' 
sudo apt install 'linux-headers-5.0.0-23-generic

安装完成后,需要重启虚拟机,并在启动时连按shift键,进入grub引导页,更换启动的Linux内核。

之后安装基本组件:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
sudo apt install git-all 
sudo apt-get install curl 
sudo apt install make 
sudo apt -y install gcc 
sudo apt -y install g++ 
sudo apt -y install autoconf 
sudo apt -y install libtool 
sudo apt -y install pkg-config 
sudo apt -y install libmnl-dev 
sudo apt -y install libyaml-dev

如果人为设置了vpn就不用按照教程里替换源了。之后安装go语言环境,注意安装go语言环境时必须为普通用户安装,否则会导致后续安装出现问题。输入命令:

1
go

以确认是否存在其他版本的go,若存在,则通过以下命令删除

1
sudo rm -rf /usr/local/go

之后安装最新版本的go:

1
2
3
cd ~ 
wget https://dl.google.com/go/go1.20.4.linux-amd64.tar.gz 
sudo tar -C /usr/local -zxvf go1.20.4.linux-amd64.tar.gz

安装完成后,需要通过以下命令配置环境变量(此过程按回车不会有输出)

1
2
3
4
5
mkdir -p ~/go/{bin,pkg,src} 
echo 'export GOPATH=$HOME/go' >> ~/.bashrc 
echo 'export GOROOT=/usr/local/go' >> ~/.bashrc 
echo 'export PATH=$PATH:$GOPATH/bin:$GOROOT/bin' >> ~/.bashrc 
source ~/.bashrc

之后输入命令:

1
go

#有版本号等输出就行。安装成功,再补充安装以下模块,该模块为free5gc独立部署的日志模块,容器化部署也可以安装:

1
#go get -u github.com/sirupsen/logrus

通过官方安装脚本安装docker,

1
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun

安装完成后,运行命令docker –version验证。之后需要安装docker-compose,通过以下命令完成:

1
sudo curl -L "https://github.com/docker/compose/releases/download/1.28.5/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

重启docker服务即可完成docker的部署:

1
systemctl restart docker

完成后,需要将当前普通用户加入docker用户组,docker用户组在上述安装时自动创建,无需手动创建:

1
2
sudo gpasswd -a $USER docker #将当前普通用户加入docker用户组 
newgrp docker #更新docker用户组

此步目的在于防止后续free5gc容器化部署时,到make base步骤,出现permission denied。

更换镜像源

这是很重要的一步,原理是部分镜像源起到类似代理的作用。在网上搜索最新docker镜像源,参考

国内能用的Docker镜像源【2025最新持续更新】_docker 镜像-CSDN博客

国内仍然可用docker镜像源汇总,长期维护,定期更新(2025年3月21日)_docker 国内镜像源-CSDN博客

Docker换源加速(更换镜像源)详细教程(2025.3最新可用镜像,全网最详细) - 知乎

然后输入类似于

1
sudo nano /etc/docker/daemon.json

来创造或修改配置文件,在里面写入代理网站,但是下面这个是一开始的,现在被ban掉了好多,不推荐,

1
2
3
4
5
6
7
8
{
  "registry-mirrors": [
    "https://hub-mirror.c.163.com",
    "https://mirror.baidubce.com",
    "https://docker.mirrors.ustc.edu.cn",
    "https://mirror.ccs.tencentyun.com"
  ]
}

推荐这些,或者去我给的参考链接找最新存活的:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
{
  "registry-mirrors": [
    "https://docker-0.unsee.tech",
    "https://docker-cf.registry.cyou",
    "https://docker.1panel.live",   
    "https://docker.xuanyuan.me",
    "https://1ms.run",
    "https://hub.fast360.xyz",
    "https://hub.littlediary.cn"
  ]
}

然后保存离开,输入以下命令清除缓存、重启docker

1
2
sudo systemctl daemon-reload
sudo systemctl restart docker

然后可以查看docker源是否更改:

1
docker info | grep -A 1 "Registry Mirrors"

最后可以尝试验证:

1
docker pull hello-world

拉取成功即可以。

继续安装其他组件

安装cmake:

1
 sudo snap install cmake –classic

安装mongodb

1
2
3
sudo apt -y update 
sudo apt -y install mongodb wget git 
sudo systemctl start mongodb

此时可能会报错Package 'mongodb' has no installation candidate,有可能因为ubuntu没更新找不到安装包,可以试试导入mongodb的公钥,运行以下命令:

1
wget -qO - https://www.mongodb.org/static/pgp/server-6.0.asc | sudo gpg --dearmor -o /usr/share/keyrings/mongodb-archive-keyring.gpg

并添加其到apt,

1
echo "deb [signed-by=/usr/share/keyrings/mongodb-archive-keyring.gpg] https://repo.mongodb.org/apt/ubuntu jammy/mongodb-org/6.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-6.0.list

更新包列表:

1
sudo apt-get update

安装mongodb:

1
sudo apt-get install mongodb-org

之后可以选择性安装yarn**(独立化部署的话则是必须)**

1
2
3
curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add -
echo "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list
sudo apt update && sudo apt install yarn

构建GTP5G模块

注意构建GTP5G模块时,需要用普通用户构建,否则后续使用时会出错

1
2
3
cd~
git clone https://github.com/free5gc/gtp5g.git
cd gtp5g

编译

1
2
make 
sudo make install

此时可能会遇到报错,如果是类似于warning: the compiler differs from the one used to build the kernel等,原因是找不到那几个编译器。

需要安装:

1
2
sudo apt update
sudo apt install gcc-12

然后重新编译:

1
2
3
make clean
make
sudo make install

容器化部署free5gc模拟核心网

首先,通过git clone下载项目代码(注意这里和教程文章的不太一样,教程里面那个链接好像用不了):

1
2
3
cd ~ 
git clone https://github.com/free5gc/free5gc-compose.git
cd free5gc-compose

如果有vpn就不用按照文章里说的改代理

编译代码:

1
2
3
cd ~/free5gc-compose 
make base
docker-compose build

其中docker-compose build一步可能报版本错误,原因在于上面安装docker、docker-compose时可能安装了较低版本的docker、docker-compose,此时可以选择重装docker、docker-compose或者修改docker-compose.yaml文件中第一行版本号3.8为当前版本,建议优先选择重装docker、docker-compose,以回避未知错误,可以通过命令docker –version命令查询当前版本。(不过如果是按教程里的话一般没问题)


交叉编译

交叉编译指利用不同的平台进行处理,并把安装或编译好的东西转移到所需平台。这种思想不仅仅用于以下案例,可以用到很多地方。

如果不按照刚才说法设置镜像代理的话,编译过程中也有可能遇到golang bullseye报错,

=> ERROR [internal] load metadata for docker.io/library/golang: 21.5s ------ > [internal] load metadata for docker.io/library/golang:1.21.8-bullseye

如果实在不打算使用镜像源,可以利用交叉编译主机windows挂梯子下载docker desktop软件,下载好后在上面搜索golang,选1.24.0-bullseye(我用的1.23.6-bullseye,这俩都行),点击pull,即可把包下载到电脑里。

然后在主机打开命令行,输入

1
docker images

,可以看到包已经下载到了主机里,然后输入命令:

1
docker save -o E:\go\golang_1.24.0-bullseye.tar golang:1.24.0-bullseye

可以把包保存到电脑路径里

从主机把压缩包拷贝到虚拟机:

在虚拟机输入

1
2
cd ~/free5gc-compose/base
vim Dockerfile

进入配置文件,

输入I,进入修改,把版本号改成所用版本(1.24.0之类的),然后Esc,输入命令:wq(带冒号)即可保存退出。

然后虚拟机终端输入:

1
sudo docker load < /home/golang_1.24.0-bullseye

之后重复原本步骤编译就可以。


至此,free5gc容器化部署完成

二、安装UERANSIM

1
2
cd ~ 
git clone https://github.com/aligungr/UERANSIM

然后:

1
2
3
4
5
6
7
sudo apt update 
sudo apt upgrade 
sudo apt install make 
sudo apt install g++ 
sudo apt install libsctp-dev 
sudo apt install lksctp-tools 
sudo apt install iproute2

编译代码:

1
2
cd ~/UERANSIM 
make

编译完成就安装成功了。

三、启动free5gc和ueransim环境

Free5gc,启动

1
2
cd ~/free5gc-compose 
docker-compose up -d

之后

1
ifconfig

这是查看网卡地址,启动free5gc后,会在本地虚拟化出一系列的网卡,这一步需要关注的是原先虚拟机自带的网卡,通常这类网卡的ip地址均处于192.168.*.*网段,网卡名类似ens33,eth0之类,可以以此特征区分出来

接下来需要查看并记录amf网元的ip地址:

1
docker inspect amf

找到上面记录有"IPAddress": 的一行,后面记录的即是amf的ip地址

记录下这两个ip地址后,就可以完成UERANSIM中gnb的配置了,通过修改free5gc-gnb.yaml配置文件完成这一步操作:

1
2
cd ~/UERANSIM/config/ 
vim free5gc-gnb.yaml

输入I进行修改模式,需要修改其中的ngapIpgtpIp本机ip

修改其中的amfconfig一项下的addressamf的ip,然后Esc,再输入 :wq

表示保存并退出,类似还有 :q :qa :exit :^X之类的。

每次重启机器后,amf地址可能改变,注意更改。

至此,UERANSIM的基站配置完成,接下来需要在free5gc中注册UERANSIM的UE部分:

访问地址 http://localhost:5000/可进入到free5gc的webui处,登录:

用户名:admin 密码:free5gc

之后通过free5gc的webui新增一个ue的注册信息(否则会报错说无法注册),此处配置的UE信息原则上需要和~/UERANSIM/config/free5gc-ue.yaml中的信息一致,但由于此处UERANSIM的代码作者已经设置好,所以实际上无需做任何更改,直接拉到最下面点create就ok

之后启动UERANSIM模拟设备

1
2
cd ~/UERANSIM/build#启动一个shell,执行启动gnb的流程
./nr-gnb -c ../config/free5gc-gnb.yaml#通过nr-gnb程序,指定使用的gnb配置文件,启动模拟基站

另起一个shell,执行启动UE的流程

1
2
cd ~/UERANSIM/build #通过nr-ue程序,指定使用的ue配置文件,启动模拟用户设备
sudo ./nr-ue -c ../config/free5gc-ue.yaml #此处因为需要虚拟出一张ue的网卡,所以需要root权限执行

启动的两个shell不可关闭,可以后台执行,但建议前台执行方便实时查看状态信息。启动完成后,执行ifconfig可以看到多了一张名为uesimtun0的网卡;另外,在free5gcwebui处,查看REALTIME STATUS可以看到有一个UE处于连接状态,此时即证明UERANSIM的环境启动成功:

之后测试一下

1
ping www.baidu.com -I uesimtun0

能通就ok,在free5gc官网也可以看到connect信息。


核心网的基站层测试

一、以基站配置测试ueransim软件层

修改PLMN值,IP不变,进行测试、注册

先改文件里PLMN的mcc、mnc分别为001、01,按照自己的目录(我的涉及/home/wxy/free5gc-compose/config/amfcfg.yaml、gnbcfg.yaml、smfcfg.yaml、uecfg.yaml,/home/wxy/UERANSIM/config/free5gc-gnb.yaml、free5gc-ue.yaml,包括修改ue里supi的前五位为00101

还有nrfcfg文件的mcc、mnc

改完save,然后关闭docker

1
docker-compose down

再重新跑核心网流程wireshark抓包查看闪退原因

启动核心网环境

1
2
cd ~/free5gc-compose
sudo docker-compose up -d

启动UERANSIM的gnb

1
2
cd ~/UERANSIM/build
./nr-gnb -c ../config/free5gc-gnb.yaml

启动ue

1
2
cd ~/UERANSIM/build
sudo ./nr-ue -c ../config/free5gc-ue.yaml

并重新create,修改mcc、mnc、id后注册

然后根据一般ueransim测试流程启动,查询有无报错,并用uesimtun0来ping一下百度。

虚拟网卡测试

1
ping www.baidu.com -I uesimtun0

之后需要修改ip: 分别在docker-compose文件里面添加upf的ip、设置amf的ip,还有network的范围

地址范围subnet要可以覆盖,改为192.168.0.0/16

由于n3iwue、free5gc-n3iwf两部分此时用不到,可以把这两段代码分别注释掉。我们要修改amf为192.168.2.198,smf内的upf与N3口192.168.8.198

在amfcfg将ngapip改为基站的192.168.2.198

smfcfg的upf ip改为基站upf 192.168.8.198

以及upfcfg的N3 ip为192.168.8.198

改完保存,把docker给down掉关闭,然后重复一般测试流程,成功标志为

1
ping baidu.com -I uesimtun0

可以收到包。

问题1:遇到ue、gnb成功连接且核心网成功配置但是不通网

这个问题比较随机,因为每个人虚拟机、或者linux子系统的默认配置不同。诊断方法可以考虑进入upf的网络空间进行调整;或者docker logs amf那几个看一下日志;或根据路由、配合抓包进行诊断。具体命令在本文档第二部分。

查询UERANSIM内的UE和GNB有没有建立PDU连接:

如图可见二者连接正常,说明ue与gnb连接正常。之后可以分别查看一下amf、upf有没有正常启动、报错,用以下命令检查日志:

1
docker logs amf
1
docker logs upf

如果没有报错,排查gnb通过N3口连接upf:

1
ping 192.168.8.198 -I uesimtun0

还是通的话,可以进入upf的网络空间,看upf联网如何,

利用pid方法进入网络空间进行ifconfig或者ping操作

1
pgrep -f upf #获取pid:
1
sudo nsenter -t <pid> -n #进入网络空间

之后,在里面输入:

1
ifconfig

查找网络工具,若有upfgtp或者eth0就可以,之后输入ping命令

1
ping 8.8.8.8

如果有包收发,那就证明upf可以上网,所以整个网络连接没有问题。

问题出在哪里?IP 转发 和 NAT 配置

我们需要启用 IPv4 数据包转发功能(将接收到的 IP 数据包从一个网络接口转发到另一个网络接口),以及开启NAT模式(数据包离开当前网络时进行源地址转换),并允许转发的数据包通过防火墙。ICMP

docker-compose文件的upf部分的command修改添加以下代码

1
2
3
4
5
6
7
8
command: 
      - /bin/bash
      - -c
      - |
        sysctl -w net.ipv4.ip_forward=1
        iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
        iptables -I FORWARD 1 -j ACCEPT
        ./upf -c /free5gc/config/upfcfg.yaml

修改后save,然后把ueransim关掉,docker给down掉,重新跑一遍启动流程,之后测试

1
ping www.baidu.com -I uesimtun0

跑通成功。

二、连接实体基站进行测试

用SSH来连接基站,需要下载ssh工具

1
2
sudo apt update
sudo apt install openssh-client

启动基站流程:

分别打开三个终端shell

在第一个shell输入

1
ssh root@192.168.2.246

输入密码,然后输入

1
cd /root/yzmm/rel/GNB/phy/bin ./run.sh

挂在后台,别关闭。

在第二个shell输入

1
ssh root@192.168.2.246

输入密码,然后输入

1
cd /root/yzmm/rel/GNB/cu/cu/nr_hl_cu/build ./run.sh

在第三个shell输入

1
ssh root@192.168.2.246

1
cd /root/yzmm/rel/GNB/du/ran/DU/build/intel/du_bin/bin ./run.sh

需要关掉ueransim,防止ip干扰冲突。

然后添加端口映射38412,此处对amf修改无严格要求。

添加upf网口2152:2152 /udp,经测试ue无法注册信号,产生mac相关报错,原因可能是free5gc默认和ueransim的对齐导致一些文件配置有问题。于是采用修改的核心网,工程文件来源于师兄distributed-core-network-control-plane

写在结尾

特别鸣谢:两位师兄和两位老师

后期工作:

  • 梳理流程思路,抓包分析

  • 深入理解代码、规范、抓包工具;实体基站和软件ueransim的不同

  • 步进调试环境搭建、分布式核心网改进

本文只涉及基础的Free5GC内容,由于传统核心网的集中性、易受攻击的问题,可以采取分布式架构进行优化,下篇文章阐述何为分布式核心网、市场空间、技术路线等。

使用 Hugo 构建
主题 StackJimmy 设计