Open5GS在Ubuntu 22.04上的5G核心网实战部署指南

发布时间:2026/9/19 14:12:50
Open5GS在Ubuntu 22.04上的5G核心网实战部署指南 最近在捣鼓5G核心网把Open5GS在Ubuntu 22.04上完整跑通了一遍。从源码编译、MongoDB初始化到gNB模拟接入整个过程踩了一堆坑也把核心网各个网元之间的信令流程理了一遍。这篇东西就直接把我最后验证可用的部署过程、配置思路和排障记录写出来给同样在做5G核心网研究或者实验环境搭建的朋友做个参考。我把整套东西定位成“能跑通、能调通、能看懂”的实战记录而不是单纯贴一堆命令。你照着做可以起一套完整体验5G核心网的实验环境适合跑RAN模拟器、接真实gNB做联调、测试用户面转发也适合做网络切片和边缘计算相关实验的前置基础。1. 整体设计与方案选型1.1 为什么选Open5GS5G核心网的开源方案里现在能完整实现5G SA架构服务化架构SBA的主要就是Open5GS和free5GC这两个。两者我都试过最终在Ubuntu 22.04上选Open5GS的原因挺直接的首先是版本迭代频率高社区活跃度明显更好遇到问题能找到的讨论也多其次是它把原有4G EPC和5G Core统一到了一套代码框架里如果你后续想研究4G/5G互操作在同一套系统里就能搞定不用维护两套独立的核心网最后就是它对硬件要求非常友好跑在一台4核8G的虚拟机上就很稳做实验完全够用。对比一下两个主流方案的差异对比维度Open5GSfree5GC架构实现4G/5G统一框架纯5G Core版本迭代持续更新v2.7.x为主更新节奏偏慢资源占用轻量虚拟机可跑相对较重文档完备度官方文档较全依赖第三方教程周边生态支持UERANSIM模拟器多版本同样支持但适配版本较旧Web管理台自带WebUI需要单独部署选型的时候有个很实际的考量Open5GS自带的Web管理台可以直接管理用户订阅信息在跑实验的时候能省很多事。比如你要给100个测试终端批量开户在Web界面操作比命令行一条条敲高效得多。1.2 网络架构和部署形态设计这次部署我采用的是单机全合一架构就是把所有核心网网元装在同一台Ubuntu 22.04服务器上。虽然生产环境肯定不会这么干但做实验和功能验证这是最简单直接的方式。核心网各网元之间的接口关系大概是这样的AMF负责接入管理处理终端的注册、鉴权和移动性管理对外的N1/N2接口连gNB。SMF管会话管理负责PDU会话的建立、修改和释放N4接口连UPF。UPF是用户面网元所有业务数据流量都经过它转发。UDM存用户签约数据和鉴权参数AUSF负责鉴权计算。NRF是所有服务化接口的注册中心各网元启动后都要向NRF注册自己。部署形态确定后还要规划一下IP地址。这里强烈建议用独立的实验网段避免和生产网络冲突。我这次用的是192.168.20.0/24网段核心网各网元监听在192.168.20.129上这个地址是可配置的你完全可以根据自己环境调整。安装方式上我选择用源码编译而不是直接apt安装。为什么因为Ubuntu官方源里的Open5GS版本往往偏旧可能缺少一些新特性而且有些最新版的UERANSIM和旧版Open5GS之间的兼容性会有问题。源码编译虽然多花十几分钟时间但能保证版本配对没问题后面联调时能少很多麻烦。2. 环境准备与依赖安装2.1 Ubuntu 22.04系统初始化无论你是用物理机还是云服务器建议都从最小化安装开始不要带桌面环境省下的资源都留给核心网跑信令。服务器版Ubuntu Server 22.04 LTS是最干净的起点。系统装好后首先做三件事换源、更新、装基础工具。国内网络环境下把apt源换成镜像源能快不少。基础工具包里build-essential和git是必须的后面编译源码要用。sudo apt update sudo apt upgrade -y sudo apt install -y build-essential git curl wget gnupg这里有个细节需要注意系统更新这一步别跳过。Open5GS对内核和系统库有一定要求更新后的系统能保证依赖库版本比较新减少编译时出现“找不到某某库”的概率。我最初在新装的系统上直接编译就遇到过因为libssl-dev版本过旧导致的编译失败。如果你打算在虚拟机上装记得把虚拟机的网络模式调成桥接模式这样核心网IP可以直接暴露在局域网里后面接真实gNB时网络更顺畅。NAT模式下做纯模拟联调没问题但一旦涉及真实硬件接入NAT端口映射会把你折磨疯的。2.2 MongoDB和依赖库安装Open5GS使用MongoDB作为用户订阅信息的数据库所以要提前把MongoDB装好。Ubuntu 22.04官方软件源里自带MongoDB但版本比较旧。我这里直接用官方源安装最新稳定版。sudo apt install -y mongodb sudo systemctl enable mongodb sudo systemctl start mongodb装完确认一下状态systemctl status mongodb看到active (running)就说明MongoDB已经正常工作了。这里提醒一下如果之前装过MongoDB且配置过认证要先确认认证配置是否正确否则后面Open5GS连不上数据库核心网各网元都启动不了。接下来安装其他依赖库。Open5GS编译依赖不少东西包括libssl、libsctp、libyaml、libmicrohttpd等。一条命令全部解决sudo apt install -y libssl-dev libsctp-dev libyaml-dev libmicrohttpd-dev \ libmongoc-dev libbson-dev libcurl4-openssl-dev libnghttp2-dev \ libidn11-dev libgnutls28-dev libgcrypt-dev libtalloc-dev \ libpcsclite-dev libc-ares-dev meson ninja-build有一个比较容易漏的依赖是libdw-dev这是编译某些调试功能模块时需要的。如果编译过程中报错提示找不到某些头文件基本就是缺依赖库用apt search找到对应的-dev包装上就行。3. 核心网编译安装与网元配置3.1 源码编译安装流程依赖装好后开始拉源码编译。选用官方GitHub仓库拉取最新的稳定分支cd ~ git clone --recursive https://github.com/open5gs/open5gs.git cd open5gs meson build --prefix/opt/open5gs ninja -C build--recursive参数很重要Open5GS引用了子模块如果漏了它有些依赖代码拉不完整编译时会出现一堆莫名其妙的错误。--prefix指定安装路径我习惯单独装到/opt/open5gs和系统自带软件隔离方便以后整目录删除或升级。编译过程快的话几分钟慢的话十几分钟取决于CPU性能。编译完成后执行安装sudo ninja -C build install装完后配置一下动态链接库路径否则运行时可能报找不到so文件的错误sudo ldconfig头文件和pkg-config路径也要配置一下/etc/ld.so.conf.d/下面新建一个open5gs.conf写入/opt/open5gs/lib然后执行sudo ldconfig刷新。3.2 核心网网元配置文件修改安装完成后Open5GS的配置文件默认在/opt/open5gs/etc/open5gs/目录下。每个网元都有一个独立的配置文件比如amf.yaml、smf.yaml、upf.yaml等。默认配置绑定的IP地址是127.0.0.1单机测试没问题但如果你要把核心网暴露出去给远程gNB接入就需要改成实际IP。以AMF配置为例核心改动是NGAP监听地址这个地址是给gNB连接用的amf: serving: - plmn_id: mcc: 001 mnc: 01 tai: plmn_id: mcc: 001 mnc: 01 tac: 1 nssai: - sst: 1 ngap: - addr: 192.168.20.129PLMNPublic Land Mobile Network公共陆地移动网络编号这块很多人刚开始不注意直接用默认值也没问题但如果你有自己测试用的PLMN提前改好后面的终端和基站模拟器都要保持一致。MCCMobile Country Code是移动国家码MNCMobile Network Code是移动网络码这套组合在全球范围内标识一个运营商网络。SMF和UPF的配置重点在于N4接口地址必须互相能通。N4是SMF控制UPF的接口这个断了对端到端的数据面路径是致命的。配置片段如下smf: pfcp: - addr: 192.168.20.129 gtpc: - addr: 192.168.20.129UPF侧对应配置upf: pfcp: - addr: 192.168.20.129 gtpu: - addr: 192.168.20.129修改完所有配置后有一个非常重要的检查项确保核心网各网元监听的端口没有被防火墙拦截。Ubuntu默认可能开着ufw防火墙最好先放行这些端口或者干脆直接在测试环境关闭防火墙sudo ufw disable如果不想关防火墙就必须放行以下端口AMF的NGAP端口38412SCTP、SMF的PFCP端口8805、UPF的GTPU端口2152、HTTP/2服务化接口端口80或自定义端口。SCTP协议不是所有防火墙都识别建议测试期间直接关闭防火墙等联调稳定后再按需放行。3.3 启动核心网服务Open5GS装完后会注册系统服务。启动全部网元可以用sudo systemctl start open5gs-mmed open5gs-sgwd open5gs-smfd open5gs-amfd open5gs-nrfd open5gs-ausfd open5gs-udmd open5gs-pcrfd open5gs-nssfd open5gs-upfd不过在实验环境里我更喜欢用前台模式启动单个网元做调试。比如单独启动AMFsudo /opt/open5gs/bin/open5gs-amfd前台模式的好处是日志直接打在终端上错误信息一目了然。调试确认没问题后再切回systemd方式后台运行。用systemd方式启动后查看所有服务状态systemctl status open5gs-*关键是要看NRF的状态因为5G核心网是服务化架构AMF、SMF、UDM等网元启动后都要向NRF注册。如果NRF挂了其他网元即使起来了也会报注册失败。我之前调试时NRF的配置没改对其他网元纷纷报“NRF registration failure”。这里建议大家按顺序启动先NRF和AUSF/UDM再AMF和SMF最后UPF这也是各网元依赖关系的自然顺序。4. 用户签约配置与UERANSIM模拟基站接入4.1 WebUI开户和命令行配置核心网起来了但没有用户签约信息的话终端根本没法注册。Open5GS自带Web管理台默认端口9999。启动WebUIsudo systemctl start open5gs-webui浏览器访问http://192.168.20.129:9999默认账号密码是admin/admin进去后可以配置用户和订阅信息。不过命令行也能搞定同样的事更适合批量操作语法是这样的curl -X POST http://192.168.20.129:3000/api/subscriber \ -H Content-Type: application/json \ -d { imsi: 001010000000001, subscriberStatus: 1, security: { k: 465B5CE8B199B49FAA5F0A2EE238A6BC, opc: E8ED289DEBA952E4283B54E88E6183CA, amf: 8000, sqn: 000000000000 }, ambr: { downlink: 1Gbps, uplink: 1Gbps }, slice: [{ sst: 1, sd: 010203 }] }IMSI的格式要和AMF配置里的PLMN保持一致。比如AMF里配的MCC001、MNC01那IMSI开头就是00101。K和OPc参数是终端的鉴权密钥后面UERANSIM的配置里也要用同一套这个不能有不一致。再来解释一下各个参数的含义。k是128位根密钥opc是运营商密钥这两者和终端的USIM信息对应。amf是鉴权管理字段sqn是序列号。ambr是聚合最大比特率相当于给这个用户设定带宽上限。slice网络切片里sst是切片类型sd是切片区分符。如果想让核心网在用户注册时自动执行某些操作比如在UPF上自动下发规则那需要配合SMF的流量控制功能。这个后面有时间单独讲这次部署先保证注册和数据面跑通。4.2 UERANSIM编译和配置UERANSIM是开源5G UE和gNB模拟器用来模拟手机和基站是测试核心网的主力工具。下载编译cd ~ git clone https://github.com/aligung/UERANSIM cd UERANSIM make编译UERANSIM需要g和make大部分情况下前面装的build-essential就够了。编译产物在build目录下主要是nr-gnb和nr-ue两个可执行文件。UERANSIM的gNB配置在config/open5gs-gnb.yaml需要把ngap地址指向核心网AMFmcc: 001 mnc: 01 amfConfigs: - address: 192.168.20.129 port: 38412 sdrConfigs: - address: 192.168.20.131 port: 58101这里有几个坑我得说一下。mcc和mnc必须和核心网AMF配置一致否则NG建立会被拒绝。amfConfigs里的address要和AMF监听的NGAP地址一致。sdrConfigs这里其实不是软件无线电它是UERANSIM自己定义的N2接口监听配置。有时编译出来的UERANSIM版本不同配置字段可能有差异具体以你的版本为例。UE配置在config/open5gs-ue.yamlsupi: imsi-001010000000001 mcc: 001 mnc: 01 key: 465B5CE8B199B49FAA5F0A2EE238A6BC opc: E8ED289DEBA952E4283B54E88E6183CA amf: 8000 sqn: 000000000000 sessions: - type: IPv4 apn: internet slice: sst: 1 sd: 010203注意这里supi格式里IMSI带imsi-前缀key和opc必须和核心网里给这个用户设置的完全一致连大小写都得一致。apn字段是和SMF里配置的数据网络名称对应的Open5GS默认配置的数据网络名是internet所以这里保持一致就行。4.3 模拟接入验证信令流程全部配置完成后开始模拟接入。先启动gNBcd ~/UERANSIM ./build/nr-gnb -c config/open5gs-gnb.yaml看到类似NG Setup procedure is successful的日志说明gNB已经和核心网AMF建立连接了。这一步如果卡住多半是IP地址不通或者SCTP端口被防火墙挡了。然后启动UE./build/nr-ue -c config/open5gs-ue.yamlUE启动后会自动执行注册流程如果一切正常你会看到PDU session establishment is successful的日志。到这步说明5G核心网的信令面已经通了UE成功经过gNB接入AMF完成鉴权建立了PDU会话。验证数据面是否真正打通在UE模拟器里ping一个外部地址./build/nr-cli imsi-001010000000001 --exec ping 8.8.8.8如果能ping通说明UPF的数据转发路径没问题。我实测时在这个环节被卡了很久现象是注册成功但ping不通后来排查发现是UPF的NAT配置没开。Open5GS的UPF默认不带NAT转发功能需要在系统层面开启IP转发并配置iptables规则。如果你和我一样只跑单机实验可以给UPF所在的主机开启IP转发sudo sysctl -w net.ipv4.ip_forward1 sudo iptables -t nat -A POSTROUTING -s 192.168.20.0/24 -o ens33 -j MASQUERADEens33要替换成你实际的出口网卡名。这样UE分配到的内部IP在访问外网时就会被NAT成宿主机的IP数据包就能正常出去了。5. 常见问题与排障技巧5.1 网元启动失败类问题这类问题最常见的就是端口被占用。比如AMF启动时报“Cannot bind to port 38412”说明有残留进程占着端口。可以用ss -lntp | grep 38412查是什么进程占用的杀掉即可。如果是升级重装的情况老版本网元可能还在运行我来回折腾的时候经常遇到这问题后来养成习惯了重装前先pkill open5gs。另一个常见问题是配置文件里写了两个重复的网元地址比如AMF配置同时出现了addr: 127.0.0.1和addr: 192.168.20.129就会报错。Open5GS不支持同一个网元同时监听多个IP的情况至少在默认配置下不行。要改就必须把所有地址字段统一替换。5.2 终端注册失败类问题UE注册失败最典型的表现是gNB有日志但UE一直卡在Requesting registration阶段。这种情况大概率是PLMN不一致。检查AMF配置、UERANSIM gnb配置、UE配置三处的MCC/MNC是否完全一致只要有一个地方不一样注册就过不去。还有一种是鉴权失败。如果日志里出现Authentication failure说明K/OPc参数不匹配。你可以检查一下核心网里Open5GS订阅数据和UE配置文件里的key、opc是不是完全相同。很多人会在WebUI开户时敲错OPc的某一位十六进制字符这种错误最隐蔽我建议用命令行开户加复制粘贴的方式减少手输错误。5.3 数据面不通类问题注册成功后ping不通外网最常见的几个原因我已经在4.3节里提到了NAT的问题。另外还要检查UPF的GTP-U隧道是否建立成功可以用ip tunnel或tcpdump抓包确认GTP-U封装是否正常。如果抓包看到GTP-U报文但外面ping不通那大概率是路由问题需要在UPF所在主机加一条路由指向UE网段。我在历次搭建中总结的经验是先抓包看信令、再抓包看数据面在UPF主机上执行sudo tcpdump -i any host 192.168.20.131 and port 2152如果看不到任何GTP-U流量说明UPF的转发规则没下发成功。检查一下SMF和UPF之间的PFCP包转发控制协议关联是否正常。PFCP是SMF控制UPF的关键协议如果PFCP关联断了UPF就不知道该把数据包转发到哪里去用户面的隧道自然建立不起来。排查PFCP关联的常见方法在SMF上检查PFCP会话看会话是ACTIVE还是INACTIVE。抓UPF主机的8805端口看PFCP心跳报文是否正常。如果PFCP关联频繁中断检查SMF和UPF之间的N4地址是否互通。5.4 常见问题速查表现象可能原因排查命令或方法AMF启动报端口占用残留进程未清理ss -lntp | grep 38412UE一直注册中PLMN不一致对比三处配置的MCC/MNC鉴权失败K/OPc参数不匹配核对十六进制字符串gNB连不上AMFIP不通或防火墙拦截ping 检查SCTP 38412端口PDU会话建立失败SMF/UPF的PFCP通道问题检查PFCP关联状态注册成功但ping不通缺少NAT或路由开启IP转发 iptables规则WebUI打不开服务未启动或端口占用systemctl status open5gs-webui6. 真实联调体会这套环境我在Ubuntu 22.04上前后装过不下五次每次踩的坑都不太一样。从最开始纯粹跟着网上教程走到后来自己梳理整条信令链路最大的体会是如果你只是想跑起来照着命令敲一遍大概一小时就完事但如果你想真正理解5G核心网在做什么还是得把每个网元的职责和接口关系弄清楚之后出任何问题你都会有排查思路。还有一个建议Ubuntu 22.04是目前Open5GS支持比较好的发行版不建议用更老的版本去实践。我早期在20.04上尝试过一次MongoDB版本、openssl版本都有各种小问题浪费时间。如果你本来就打算长期做5G核心网相关实验可以在一台专用虚拟机上把Open5GS、UERANSIM、WebUI都配好然后做一次快照。后面不管怎么折腾配置都能快速回滚到干净状态。Open5GS官方的文档更新得很快新版本经常会加一些功能或改一些默认行为如果你发现某个配置项在你这版里不存在不用怀疑查一下对应版本的变更记录答案都在里面。