第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-gnbnr-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解析:

  1. 打开Wireshark → 编辑 → 首选项
  2. 找到Protocols → SCTP
  3. 勾选"Try to decode SCTP payload as NGAP"
  4. 点击确定

3.4.2 配置HTTP/2解析

N1接口的NAS消息封装在HTTP/2的POST请求中。需要这样配置:

  1. 编辑 → 首选项 → Protocols → HTTP/2
  2. 勾选"Enable HTTP/2 decoding"
  3. 在"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 → AMFRegistration RequestUE发起注册
AMF → UEAuthentication Request网络发起鉴权
UE → AMFAuthentication ResponseUE响应鉴权
AMF → UESecurity Mode Command安全模式建立
UE → AMFSecurity Mode Complete安全模式完成
AMF → UERegistration Accept注册成功

看到这个序列,说明你的环境完全跑通了。这时候你就可以开始分析NAS消息的每个字段,理解协议栈的交互逻辑。

避坑指南:我曾经在抓包时发现NAS消息全是乱码,后来发现是Wireshark的NAS解析器没装。去Wireshark官网下载对应的5G NAS解析器插件,解压到~/.local/lib/wireshark/plugins/目录下就好了。

3.5 本章知识体系

下面这张图展示了整个开发环境的架构关系,我建议你保存下来,后面调试时经常用得上。

NAS层开发环境架构图 UE (nr-ue) gNB (nr-gnb) 5GC (free5gc/open5gs) Wireshark N1接口 (NAS) N2接口 (NGAP) 抓包分析 Linux开发环境 (Ubuntu 20.04 LTS) • Go 1.18.3 • MongoDB 5.0 • Wireshark 3.6.8 • SCTP协议支持 • HTTP/2解析插件 • NAS解析器插件 NAS消息流 UE → gNB: NAS-PDU (RRC容器) gNB → AMF: NGAP (InitialUEMessage) AMF → gNB: NGAP (DownlinkNASTransport) gNB → UE: NAS-PDU (RRC容器)

这张图把整个环境分成了三层:底层是Linux开发环境,中间是UE和gNB模拟器,上层是5GC核心网。Wireshark挂在旁边,随时抓包分析。你想想看,这个架构是不是很清晰?

好了,环境搭好了,下一章我们就开始写真正的NAS层代码。到时候你会感谢今天花时间把环境配好的自己。


专注资料整理