1. 部署前先弄清的问题:为什么选Open5GS与Ubuntu 22.04组合
最近帮朋友在实验室搭一套5G核心网,前前后后折腾了一周,踩了一堆网上教程不会告诉你的坑。趁着记忆还热乎,把整个部署过程、验证链路和常见问题整理成这篇笔记,给打算做Open5GS部署验证、边缘计算实验或者接入网联调的朋友一个可以直接照做的参考。
这里先把目标说清楚:我们要在Ubuntu 22.04上部署一套基于Open5GS的5G SA核心网,覆盖AMF、SMF、UPF、AUSF、UDM、NRF、PCF、NSSF这些网元,然后用UERANSIM模拟一个基站和一个终端,把“终端开机→注册→建立PDU会话→拿到IP→ Ping通”这条最核心的链路打通。这套环境既可以用来做协议流程学习、功能验证,也能作为后续开发调试的最小可运行底座。
1.1 Open5GS是整个通信系统里的哪一块
5G网络按功能切开,大致可以分成三块:终端(UE)、接入网(gNB)、核心网(5GC)。终端就是手机、CPE、工业模组这类设备,接入网负责把终端接入无线空口,而核心网负责认证、移动性管理、会话管理、数据转发、计费策略等“大脑”功能。Open5GS做的就是最后这一块,它是一个用C语言实现的开源5G核心网项目,支持5G SA架构,同时也兼容4G LTE的EPC网元。
对刚入门的朋友,我建议把5G核心网当成一家公司来看:AMF是前台接待,所有终端的注册请求先到它这里;AUSF和UDM是行政人事部门,负责验证“你确实是本公司员工”;SMF是业务调度中心,负责给用户分配IP、建立数据通道;UPF则是物流仓库,真正的用户流量都从它这里进出。这样再看网上那些英文缩写,就不容易晕了。
1.2 为什么我坚持用Ubuntu 22.04而不是其他版本
Open5GS官方文档其实没有把系统版本写死,但实际部署下来你会发现,Ubuntu 22.04 LTS是目前省心程度最高的选择。原因有三个。
一是依赖库的版本匹配度好。Open5GS需要MongoDB做用户订阅数据存储,需要libssl、libyaml等开发库,22.04源里的版本都够新,不会像老版本系统那样动不动遇到依赖冲突。二是Open5GS官方提供了针对Ubuntu的二进制包仓库和PPA源,安装、升级都能用apt管理,出问题的概率低很多。三是网络功能配置在22.04上更顺手,尤其是内核的TUN/TAP驱动、网络命名空间、IP转发这些和5G用户面强相关的机制,兼容性表现得非常稳定。
我见过有人用CentOS去装,编译出来的版本没问题,但后续想用官方脚本做自动化部署时就要自己额外折腾。除非你所在团队对操作系统有硬性规定,否则个人实验、协议学习、Demo演示,我建议直接选Ubuntu 22.04 LTS。
1.3 硬件配置和网络拓扑要提前想好
Open5GS对硬件的要求非常亲民,我个人实测过的最低配置是2核CPU、4GB内存、20GB磁盘。控制面网元全部塞在一台虚拟机里也能跑起来,只是MongoDB偶尔会吃内存,所以推荐把内存加到8GB,尤其是后面要同时模拟多个UE时更从容。
真正的关键点在于网卡和IP规划。Open5GS在部署时分为控制面(CP)和用户面(UP),CP包含AMF、SMF、AUSF、UDM、NRF等,UP主要指UPF。最简单的拓扑就是把所有网元装在一台机器上,只靠逻辑地址区分;稍微贴近生产一点的做法是准备两台机器,一台跑控制面,一台单独跑UPF。我这次为了把原理讲清楚,采用单机模式,但会在配置阶段把UPF的IP池单独规划好,这样以后拆出来部署时不需要改动整体逻辑。
2. 核心网里每个网元都在干什么:一次注册流程全拆解
很多教程一上来就让用户安装、改配置、看效果,但这个顺序其实是错误的。Open5GS有8个核心网元,每个网元都有一份YAML配置,如果不先明白它们之间的协作关系,配置改完你都不知道是哪一步出了问题。我建议先用15分钟把流程梳理清楚,再动手安装。
2.1 从终端开机到注册成功的完整信令链
终端开机后先找基站,基站和核心网之间的第一个接口是N2,对接的网元是AMF。基站会发出一条NGAP消息,把终端的注册请求转发给AMF,AMF收到后会检查这个终端的身份。
接下来AMF去找AUSF和UDM做鉴权。UDM里保存着每个SIM卡对应的国际移动用户识别码IMSI、根密钥K、OPc这些数据,AUSF完成5G AKA鉴权算法,确认终端不是伪造的。鉴权通过后,AMF会向终端下发注册接受消息,到这里“终端入网”就算完成了。
但入网只是第一步,真正要上网还必须建立PDU会话。这时AMF根据网络切片信息选择合适的SMF,SMF再去找UPF,在N4接口上建立会话上下文,同时给终端分配一个内网IP。UPF通过N3接口和基站对接,通过N6接口连接外部数据网。到这里,数据通路才算真正打通。
2.2 各网元对应哪些端口和接口
Open5GS网元之间的通信走的是不同协议,使用的端口也完全不同。我把这次部署用到的关键端口和用途整理成了一张表,排查问题时先对一遍这张表,能省不少时间:
| 网元 | 接口/协议 | 默认端口 | 作用 |
|---|---|---|---|
| AMF | NGAP/SCTP | 38412 | 与基站gNB对接 |
| AMF | N1/N2服务化接口 | 7777 | 内部HTTP服务 |
| SMF | PFCP | 8805 | 与UPF建立N4会话 |
| UPF | GTP-U | 2152 | 用户面数据转发 |
| NRF | HTTP | 7777 | 网元服务注册与发现 |
| NSSF | HTTP | 7777 | 网络切片选择 |
这个表里的端口稍微记一下,后面配置UERANSIM模拟基站、抓包定位问题时都用得上。防火墙如果开着,建议先把这些端口放通,或者干脆在实验环境临时关闭防火墙,避免问题定位时被干扰。
2.3 控制面和用户面为什么要分开看
5G相比4G一个很大的变化,就是把控制面和用户面彻底分开了。控制面的信令流量很小,但要求实时、可靠;用户面流量大,强调的是转发性能和带宽。这个设计让运营商可以把UPF下沉到离用户更近的位置,也就是常说的边缘计算场景。
这个思想也体现在Open5GS的配置上。SMF、AMF、UDM这些网元的配置里都要写自己的地址和对外服务端口,而UPF的配置里单独定义GTP-U地址和数据网子网。我们实验环境里虽然所有网元在一台机器上,但IP地址最好也按“控制面网段”和“用户面网段”分开规划,我使用的是控制面走管理网段,UPF的N6对接数据网段,这样做的目的是让日志、抓包结果更加清晰可读。
3. 三步装好基础环境:系统、Open5GS、WebUI一个都不能少
网络规划和网元职责搞清楚后,进入实操环节。我按顺序整理成三步,每一步都有对应的验证方法,避免装了后面忘了前面。
3.1 系统初始化和基础依赖安装
安装完Ubuntu 22.04系统后,第一件事是更新软件源。国内服务器如果直接访问官方源速度慢,可以参考网上的一些开源镜像站替换方式,替换后执行:
sudo apt update && sudo apt upgrade -y接着安装Open5GS运行所需的依赖。这里有个小技巧:先装curl、gnupg这些基础工具,再装MongoDB,因为Open5GS的服务进程启动时必须能连上MongoDB,否则AMF、SMF这些网元会反复重启并报数据库连接错误。
sudo apt install -y curl gnupg software-properties-common sudo install -d /usr/share/keyrings sudo curl -fsSL https://www.mongodb.org/static/pgp/server-6.0.asc | sudo gpg --dearmor -o /usr/share/keyrings/mongodb-server-6.0.gpgMongoDB 6.0在Ubuntu 22.04上有官方源支持,安装后要立即设置开机自启并确认状态:
sudo apt install -y mongodb-org sudo systemctl start mongod sudo systemctl enable mongod systemctl status mongodmongod运行正常是Open5GS安装的前提。如果这一步没有确认清楚就继续,后面所有网元都会报cannot connect to mongodb,排查起来非常劝退。
3.2 通过PPA安装Open5GS核心网
Open5GS提供了编译好的Ubuntu包,安装非常快。先添加PPA源:
sudo add-apt-repository -y ppa:open5gs/latest sudo apt update sudo apt install -y open5gs安装完成后,系统里会多出一批systemd服务,包括open5gs-amfd、open5gs-smfd、open5gs-upfd、open5gs-ausfd、open5gs-udmd、open5gs-nrfd、open5gs-pcfd、open5gs-nssfd。这些都是Open5GS自己注册好的服务单元,可以用systemctl逐个控制。
启动方式有两种:一种是逐个启动,适合调试时单独看日志;另一种是全部启动,适合快速看到整体效果。我是这样处理的:
sudo systemctl start open5gs-nrfd open5gs-ausfd open5gs-udmd open5gs-pcfd open5gs-nssfd sudo systemctl start open5gs-amfd open5gs-smfd open5gs-upfd每个服务都启动成功后,用端口监听情况做一次全面自检:
ss -tulpn | grep -E '38412|8805|2152|7777'正常情况下能看到AMF的SCTP端口38412、SMF的8805、UPF的2152都在监听。如果某个端口缺失,先看对应systemd服务状态,再翻日志,不要盲目重启,原因我会在第6节详细讲。
3.3 WebUI:管理SIM卡用户数据的入口
Open5GS核心网本身没有存储手机号之类的概念,它存的是SIM卡的IMSI、密钥、运营商标识这类数据。手动往MongoDB里插这些数据也可以,但效率太低,官方提供了一个WebUI来管理用户数据,推荐一并装上。
WebUI依赖Node.js环境:
sudo apt install -y nodejs npm git clone https://github.com/open5gs/open5gs.git cd open5gs/webui npm ci --legacy-peer-deps npm run build之后用npm start启动WebUI,浏览器访问http://服务器IP:3000,默认账号是admin,密码是1423。登录后进入“用户”页面,添加一个新的用户条目:填入IMSI为001010000000001,选择鉴权类型,填入K、OPc等参数。这里的K和OPc必须和后面UERANSIM配置文件里保持一致,否则终端注册一定会失败。
WebUI常见的一个坑是Node.js版本不对导致npm ci报错。如果在Ubuntu 22.04上遇到Node 18与某些依赖不兼容的情况,可以考虑用nvm切换Node 16版本再试。这套WebUI只是用来管理订阅数据,不参与核心网信令流程,所以出问题时不必阻塞太久,先用MongoDB命令行插入一条测试数据也是完全可以的。
4. 配置文件怎么改:让网元按你的拓扑跑起来
安装完成后Open5GS自带一份默认配置,直接启动所有服务是能跑起来,但它内部使用的是默认网段和默认PLMN,无法对接你自定义的基站和终端。所以配置文件的修改是本次部署的重点,也是区分“会装”和“会调”的分水岭。
4.1 先看懂YAML配置的组织方式
Open5GS的所有配置文件都放在/etc/open5gs/目录下,每个网元一份,例如amf.yaml、smf.yaml、upf.yaml、nssf.yaml等。以smf.yaml为例,打开后能看到一个嵌套的YAML结构:顶层有几个关键段,smf段里定义SMF自身的地址和服务配置,upf段里定义UPF的地址和子网参数。
这里有一个非常容易被忽略的细节:不同版本的Open5GS,配置项名称会有细微差别。例如某些版本用addr,某些版本用ip;某些版本把subnet写为network。我建议拿到任何一台新环境,先实际打开配置文件逐行看一遍,不要直接CTRL+C网上旧教程里的配置,旧版本配置很可能导致服务启动失败,这是不少新手花一整晚时间才发现的坑。
4.2 AMF配置:运营商标识和接入网接口
AMF配置里最重要的参数是PLMN(Public Land Mobile Network,公共陆地移动网络),它由MCC和MNC组成,MCC是国家码,MNC是运营商网络码。我们用模拟实验时通常不申请真实运营商码,直接使用001和01。还需要设置TAC,也就是跟踪区码,这个值要和后面UERANSIM里基站配置保持一致。
AMF的ngap地址决定它监听哪个IP来接收基站的N2连接。如果机器有多个网卡,这里必须明确指定,不能留空。我在第一次部署时没写IP,结果AMF实际监听在了默认网卡上,而基站配置指向另一个IP,两边一直无法建立连接。检查日志发现SCTP连接请求被拒绝,这才反应过来是监听地址不对。
4.3 SMF和UPF配置:用户IP池和N4关联
SMF负责给UE分配IP地址,这个IP池定义在smf.yaml的会话段。我分配了10.45.0.0/16网段作为终端上网地址段,网关设置为10.45.0.1,DNN(数据网络名称)用的是internet。
UPF的配置则需要与SMF严格对应。UPF通过PFCP协议向SMF报告自己可用的用户面IP地址和子网,SMF才能把数据转发给UPF。看配置的时间点让我特别提一句:UPF里定义的gtpu.addr要写本机实际网卡的IP,subnet要和SMF定义的IP池一致,否则UE注册成功后依然建立不起PDU会话。
配置涉及的核心部分如下,这是我自己环境里稳定运行的一版:
smf: plmn: mcc: 001 mnc: 01 session: - subnet: 10.45.0.0/16 gateway: 10.45.0.1 dnn: internet upf: gtpu: - addr: - 192.168.18.128 subnet: - 10.45.0.0/16 dev: pgw0改完配置文件后,统一用sudo systemctl restart open5gs-smfd open5gs-upfd重启对应服务,然后用journalctl验证是否有语法报错。YAML文件的缩进对解析结果影响巨大,本人在实际项目中因为一个多出来的空格导致整个服务无法启动,排查过程用了半个小时,后来用python3 -c "import yaml; yaml.safe_load(open('/etc/open5gs/smf.yaml'))"去校验才发现问题。建议每个人改完配置都顺手跑一遍这个校验。
4.4 防火墙和IP转发:最容易漏掉的两个坑
Open5GS服务本身配置好了,不代表数据通道能通。UPF负责用户面数据转发,在Linux上这需要两个条件:一是服务器的IP转发功能开启,二是iptables或路由表里有允许转发的规则。
开启IPv4转发:
sudo sysctl -w net.ipv4.ip_forward=1同时检查UERANSIM跑起来后产生的pgw0虚拟网卡是否存在。UPF会创建一个tun设备用于承载UE的数据流量,如果这个设备没出现,多半是内核模块没加载或者权限不足。
如果你发现UE能注册、能建立会话、但Ping外部IP失败,十有八九就是IP转发没有开,或者UPF的数据网段路由没有指向正确网关。这个问题的排查方法我给到第5节末尾,这里先记住一个结论:用户面通不通,和核心网配置文件的关联度没有想象中那么大,更多时候是Linux主机网络配置的问题。
5. 用UERANSIM模拟终端验证:从开机注册到拿到IP
核心网部署完成后,下一步就是让基站和终端跑起来。UERANSIM是使用最广泛的开源5G基站和终端模拟器,支持N2/N3接口对接Open5GS。到这一步很多教程会轻描淡写带过,但实际部署时有不少细节,值得一步步展开。
5.1 编译安装UERANSIM
UERANSIM对Ubuntu 22.04的支持很成熟,依赖只需要make、g++等基础工具:
sudo apt install -y build-essential cmake libsctp-dev git clone https://github.com/aligungr/UERANSIM cd UERANSIM make编译完成后,build目录下会生成三个关键可执行文件:nr-gnb(模拟基站)、nr-ue(模拟终端)、nr-cli(命令行交互工具)。如果编译过程中报错,大多是因为依赖缺失,根据提示补齐重新make即可。我用的版本内置的示例配置已经按Open5GS的默认参数微调过,但自己再手动检查一遍更稳妥。
5.2 基站配置要和AMF完全对齐
UERANSIM的配置目录在config/下。打开open5gs-gnb.yaml,核心参数如下:
mcc: '001' mnc: '01' tac: 1 linkIp: 192.168.18.128 ngapIp: 192.168.18.128 gtpIp: 192.168.18.128 amfConfigs: - address: 192.168.18.128 port: 38412这里的MCC、MNC、TAC必须和Open5GS的AMF配置完全一致,否则NGAP连接会建立失败。linkIp、ngapIp、gtpIp要与AMF能访问到的本机IP一致,端口默认38412。
启动基站的命令是:
./nr-gnb -c config/open5gs-gnb.yaml如果看到类似NGAP connection established的日志,说明基站已经成功连上AMF,这是整个过程中最容易获得成就感的一步。如果一直没有连接成功的日志,用tcpdump -i any sctp抓包看一下38412端口有没有SCTP包到达,就能确定是哪一侧的问题。
5.3 终端配置里最容易出错的SIM参数
open5gs-ue.yaml里模拟的是手机里SIM卡的信息,关键参数包括:
supi: 'imsi-001010000000001' mcc: '001' mnc: '01' key: '465B5CE8B199B49FAA5F0A2EE238A6BC' op: 'E8ED289DEBA952E4283B54E88E618BE4' amf: '8000'其中key就是SIM卡的根密钥K,op是运营商算法密钥,amf是鉴权管理字段。这些参数必须和Open5GS WebUI里录进去的用户数据完全一致,差一个字节都会导致鉴权失败。我在实际测试时因为复制粘贴过程中多了一个空格,导致AMF日志反复报鉴权失败,这个问题靠眼睛看很难发现,后来是写了个脚本逐字节对比两个文件的哈希值才定位到。
启动终端的命令是:
./nr-ue -c config/open5gs-ue.yaml启动成功后的标志是终端日志中出现PDU session established。此时可以在核心网一侧执行:
ip addr show pgw0正常情况下能看到一个10.45.0.2之类的地址,这就是核心网分配给终端的IP。再执行ping -I pgw0 10.45.0.2或者直接在另一台设备Ping这个地址,网络就通了。
5.4 链路打通后的整体验证和排查顺序
从终端注册到Ping通的完整链路,建议按以下顺序做整体验证:
- 用
ss -tulpn确认核心网各端口在监听 - 启动nr-gnb,确认NGAP连接建立
- 启动nr-ue,观察注册流程日志
- 核心网AMF日志里应出现终端的注册请求和处理成功记录
- 查看pgw0设备是否有UE的IP地址
- 最后Ping测试验证用户面数据通路
如果第4步开始失败,优先检查IMSI和PLMN是否匹配;如果第5步失败,重点排查SMF和UPF的网段配置是否一致;如果第6步失败,检查Linux IP转发是否开启,以及UPF到外部网络的默认路由是否存在。我按这个顺序快速排查了多次实验环境的问题,基本都是几分钟内定位。
6. 部署中我踩过的坑:日志排查、性能优化与运维心得
Open5GS项目的活跃度很高,文档做得也算不错,但真正动手部署时,你会遇到一些在官方文档里找不到答案的细节问题。这里把我实际踩过的坑和对应的解决方法集中做一个汇总,希望给你省些时间。
6.1 网元进程起不来,先学会看日志
Open5GS的所有网元都是systemd服务,查看某个网元日志的标准命令是:
journalctl -u open5gs-amfd -f很多新手遇到服务启动失败会直接去看配置文件,但我的经验是先看日志,因为大部分启动失败在日志里都会明确写出问题和行号。比如Failed to find the AMF这类报错意味着配置里的某处指向不明确;cannot connect to mongodb则说明MongoDB没起来或地址配置错误;Failed to parse YAML则直接说明配置文件语法有误。
另外注意区分不同网元的日志。SMF的问题要去open5gs-smfd日志里找,UPF的问题要去open5gs-upfd里找,不要在一份AMF日志里找所有问题的答案。
6.2 常见问题和解决方法对照表
把实验过程中最常遇到的异常情况整理成了这张表,可以直接对照排查:
| 现象 | 常见原因 | 解法 |
|---|---|---|
| 基站连接AMF失败 | ngapIp配置错误或端口不通 | 核对IP,确认38412端口监听且防火墙放通 |
| UE注册永久pending | SIM参数不一致 | 对比WebUI与UERANSIM的K、OPc、IMSI |
| 注册成功但PDU会话失败 | SMF和UPF的子网配置不一致 | 核对smf.yaml的subnet和upf.yaml的subnet |
| UE有IP但外部不通 | IPv4转发未开或路由缺失 | 开启ip_forward,检查默认路由 |
| WebUI登录后无法添加用户 | Node.js版本问题 | 尝试用nvm切换Node 16 |
| 网元反复重启 | MongoDB未运行 | 先启动mongod再重启open5gs服务 |
6.3 性能调优方向:从“能跑”到“跑得好”
如果这套环境只是用来学习,前面讲的内容已经足够了。但如果你打算拿它做性能测试或者边缘计算实验,我建议再关注三个方向。
一是把UPF从单机里拆出来。Open5GS的UPF可以部署在独立服务器上,SMF通过N4接口远程管理它。这种部署方式更接近真实组网,也能避免控制面负载和用户面大流量互相干扰。二是使用DPDK等高性能数据面加速技术。UPF的用户面转发如果走传统的内核协议栈,吞吐有上限,当压力上来时需要考虑加速方案。这一点在Open5GS社区里也有不少实践案例可以参考。三是调整日志级别。默认的日志级别会打印大量调试信息,长期运行会产生大量日志文件,把amf.yaml、smf.yaml里的日志级别改为warn,再把核心网服务的内存占用限制好,实验环境一周不重启也不会出问题。
这里还想专门提一下MySQL和MongoDB的分工。Open5GS用MongoDB存用户订阅数据,这一点和很多传统网元不同。实验过程中如果MongoDB数据损坏,或者你改了SIM卡参数想恢复默认,直接清空数据库再重新添加用户即可,不用重新安装整个核心网。
6.4 我的“复盘式”运维惯例
最后分享一个个人习惯。每次把5G核心网配置调通以后,我建议用cp把当前能正常工作的一组配置文件和UERANSIM配置文件一起备份到一个带日期的目录,比如backup/2025-01-14/。因为在后续调试中,你大概率会改动各种配置,改挂了之后能一键回滚,会让人安心很多。Open5GS的配置文件本身不大,但每个参数都牵一发动全身,保留一份“已知可用”的标准配置,比事后回忆和查文档效率高得多。
我在实际部署中最大的体会是:5G核心网没有玄学,它只是网络协议栈上按固定流程把信令和用户面掰开、各司其职的系统。只要把每个网元的角色、端口、配置对应关系在心里画清一张图,剩下的问题都只是按图索骥。现在这套Ubuntu 22.04加Open5GS加UERANSIM的组合我已经在好几台新环境上重复部署过,从系统装好到终端跑通,熟练之后半小时以内就能完成,希望这篇笔记也能帮你达到同样的效率。