第3章 NAS层开发环境搭建:Linux开发环境配置、开源5GC部署、gNB模拟器搭建、Wireshark抓包配置
说实话,做NAS层开发最怕什么?不是协议看不懂,而是环境搭不起来。我见过太多同事,代码写好了,结果连个5GC都没有,只能对着日志发呆。这一章,我就带你一步步把整个环境搭起来。
3.1 Linux开发环境配置
我个人习惯用Ubuntu 20.04 LTS。为什么?因为free5gc和open5gs对这个版本支持最好。你非要用CentOS或者Debian也行,但后面踩坑的概率会大不少。
3.1.1 基础依赖安装
先把基础工具链装上。别偷懒,缺一个后面编译都会报错。
sudo apt update
sudo apt install -y git gcc g++ cmake autoconf libtool pkg-config
sudo apt install -y libmnl-dev libyaml-dev libssl-dev
sudo apt install -y libnghttp2-dev libidn11-dev libcurl4-openssl-dev
sudo apt install -y python3 python3-pip python3-dev
sudo apt install -y mongodb mongodb-clients mongodb-server
sudo apt install -y wireshark tshark
嗯,这里要注意MongoDB的版本。free5gc要求MongoDB 4.4以上,open5gs要求4.0以上。我建议直接装5.0,省事。
3.1.2 Go语言环境
free5gc是用Go写的,所以Go环境必须配好。我记得第一次装free5gc时,Go版本不对,编译报了一堆错。
wget https://go.dev/dl/go1.18.3.linux-amd64.tar.gz
sudo tar -C /usr/local -xzf go1.18.3.linux-amd64.tar.gz
echo 'export PATH=$PATH:/usr/local/go/bin' >> ~/.bashrc
source ~/.bashrc
go version
为什么要1.18.3?因为free5gc 3.2.0版本明确要求这个版本。你换个版本试试?大概率编译不过。
3.2 开源5GC部署
目前主流的两套开源5GC:free5gc和open5gs。我两个都用过,各有千秋。free5gc的NAS层实现更完整,open5gs的稳定性更好。你想想看,做NAS层开发,我建议用free5gc,因为它的N1/N2接口实现更贴近3GPP规范。
3.2.1 free5gc部署
直接上命令,别问为什么,先跑起来再说。
git clone --recursive -j `nproc` https://github.com/free5gc/free5gc.git
cd free5gc
make
编译大概需要10-15分钟。趁这个时间,我跟你聊聊free5gc的架构。它把5GC拆成了多个NF(Network Function),每个NF都是一个独立的Go进程。AMF、SMF、UPF、AUSF、UDM、NRF、PCF、NSSF,一共8个NF。
核心知识点:NAS层开发主要跟AMF打交道。AMF负责N1接口(UE到AMF)和N2接口(gNB到AMF)的NAS消息处理。说白了,你写的NAS层代码,最终都要跟AMF交互。
启动free5gc前,先启动MongoDB:
sudo systemctl start mongod
cd free5gc
./run.sh
看到所有NF都显示"Running"状态,说明部署成功了。
3.2.2 open5gs部署(备选)
如果你需要更稳定的测试环境,可以考虑open5gs。部署方式类似:
git clone https://github.com/open5gs/open5gs.git
cd open5gs
meson build
ninja -C build
sudo ninja -C build install
我的建议:两个都装。free5gc用来做NAS层功能测试,open5gs用来做压力测试和稳定性验证。我在项目中就是这么干的,效果不错。
3.3 gNB模拟器搭建
没有真实gNB怎么办?用模拟器。我推荐UERANSIM,它是目前最成熟的开源gNB/UE模拟器。
3.3.1 UERANSIM安装
git clone https://github.com/aligungr/UERANSIM.git
cd UERANSIM
make
编译完成后,你会得到两个可执行文件:nr-gnb和nr-ue。前者模拟gNB,后者模拟UE。
3.3.2 配置gNB
编辑config/gnb.yaml:
mcc: '001' # 移动国家码
mnc: '01' # 移动网络码
nci: '0x000000010' # NR小区标识
idLength: 32 # gNB ID长度
tac: 1 # 跟踪区码
amfConfigs:
- address: 127.0.0.1
port: 38412 # N2接口端口
slices:
- sst: 1 # 切片类型
sd: 0x010203 # 切片区分符
这里有个坑:amfConfigs的端口号必须跟free5gc的AMF配置一致。我曾经因为端口写错,排查了整整一天。
3.3.3 启动gNB和UE
# 先启动free5gc
cd free5gc && ./run.sh
# 再启动gNB
cd UERANSIM
sudo ./nr-gnb -c config/gnb.yaml
# 最后启动UE
sudo ./nr-ue -c config/ue.yaml
看到UE成功注册到网络,说明环境搭建成功了。这时候你就可以开始抓包分析了。
3.4 Wireshark抓包配置
做NAS层开发,Wireshark是必备工具。但默认配置抓不到NAS消息,需要一些特殊设置。
3.4.1 配置SCTP协议解析
NAS消息走的是SCTP协议(N2接口)和HTTP/2协议(N1接口)。Wireshark默认支持SCTP,但需要开启NGAP解析:
- 打开Wireshark → 编辑 → 首选项
- 找到Protocols → SCTP
- 勾选"Try to decode SCTP payload as NGAP"
- 点击确定
3.4.2 配置HTTP/2解析
N1接口的NAS消息封装在HTTP/2的POST请求中。需要这样配置:
- 编辑 → 首选项 → Protocols → HTTP/2
- 勾选"Enable HTTP/2 decoding"
- 在"Subdissector list"中添加:
application/vnd.3gpp.5gnas
注意:Wireshark版本不同,配置路径可能略有差异。我用的是3.6.8版本,如果你用4.0以上版本,配置方式可能不一样。
3.4.3 抓包过滤器
为了只抓5GC相关的包,建议用这个过滤器:
sctp.port == 38412 || http2
38412是N2接口的默认端口。如果你改了配置,记得改端口号。
3.4.4 实战抓包示例
启动抓包后,让UE发起一次注册流程。你会看到这样的NAS消息序列:
| 消息方向 | NAS消息类型 | 说明 |
|---|---|---|
| UE → AMF | Registration Request | UE发起注册 |
| AMF → UE | Authentication Request | 网络发起鉴权 |
| UE → AMF | Authentication Response | UE响应鉴权 |
| AMF → UE | Security Mode Command | 安全模式建立 |
| UE → AMF | Security Mode Complete | 安全模式完成 |
| AMF → UE | Registration Accept | 注册成功 |
看到这个序列,说明你的环境完全跑通了。这时候你就可以开始分析NAS消息的每个字段,理解协议栈的交互逻辑。
避坑指南:我曾经在抓包时发现NAS消息全是乱码,后来发现是Wireshark的NAS解析器没装。去Wireshark官网下载对应的5G NAS解析器插件,解压到~/.local/lib/wireshark/plugins/目录下就好了。
3.5 本章知识体系
下面这张图展示了整个开发环境的架构关系,我建议你保存下来,后面调试时经常用得上。
这张图把整个环境分成了三层:底层是Linux开发环境,中间是UE和gNB模拟器,上层是5GC核心网。Wireshark挂在旁边,随时抓包分析。你想想看,这个架构是不是很清晰?
好了,环境搭好了,下一章我们就开始写真正的NAS层代码。到时候你会感谢今天花时间把环境配好的自己。