基于 Open5GS + srsRAN + SDR 的 5G 私有网络搭建指南。
5G NR Lab Documentation - Private 5G Network Setup Guide with Open5GS + srsRAN + SDR.
本项目提供多种开发环境:
| 命令 | 环境 | 用途 |
|---|---|---|
nix develop |
📖 Documentation | 文档开发 (Node.js) |
nix develop .#sdr |
📡 SDR | 频谱分析实验 (UHD, GQRX, GNU Radio) |
nix develop .#5g |
📶 5G | 5G 网络实验 (srsRAN gNB) |
nix develop .#full |
🚀 Full | 完整环境 (文档 + SDR + 5G) |
# 进入文档开发环境
nix develop
# 或进入 SDR 实验环境
nix develop .#sdr
# 或进入 5G 网络环境 (首次需要 --accept-flake-config)
nix develop .#5g --accept-flake-config
# 或进入完整环境
nix develop .#full --accept-flake-configNote:
--accept-flake-config用于信任项目的二进制缓存配置,可从 Cachix 下载预编译的 srsRAN,避免本地编译(约需 30 分钟)。
# 安装依赖
npm install
# 本地开发
npm run docs:dev访问 / Visit: http://localhost:5173
npm run docs:buildnpm run docs:preview进入 SDR 环境后可使用以下工具:
# 检测 USRP 设备
uhd_usrp_probe
# 频谱分析
uhd_fft -f 2.45e9 -s 20e6
# GUI 工具
gqrx
sdrpp
gnuradio-companiondocs/
├── index.md # 中文首页 / Chinese Home
├── en/
│ └── index.md # 英文首页 / English Home
├── guide/ # 入门指南 / Getting Started
│ ├── getting-started.md
│ ├── prerequisites.md
│ ├── hardware.md
│ └── spectrum-analysis.md # 频谱分析实验 / Spectrum Analysis
├── open5gs/ # Open5GS 核心网 / Core Network
│ ├── index.md
│ ├── installation.md
│ ├── configuration.md
│ └── subscriber.md
├── ims/ # IMS 语音系统 / IMS Voice System
│ ├── index.md
│ ├── cscf.md
│ ├── registration.md
│ └── volte.md
└── srsran/ # srsRAN 基站 / Base Station
├── index.md
├── installation.md
├── gnb-config.md
└── ue-config.md
本文档支持中英双语:
- 简体中文 (默认 / Default)
- English
This documentation supports bilingual:
- Simplified Chinese (Default)
- English
| 组件 / Component | 软件 / Software | 说明 / Description |
|---|---|---|
| 核心网 / Core | Open5GS | 开源 5G SA 核心网 / Open source 5G SA core |
| 基站 / RAN | srsRAN Project | 开源 5G gNB / Open source 5G gNB |
| 射频 / RF | USRP B210 | SDR 硬件 / SDR hardware |
本项目提供 NixOS module,可声明式配置 Open5GS 5G/LTE 核心网。
This project provides NixOS modules for declarative Open5GS 5G/LTE core network configuration.
# flake.nix
{
inputs = {
nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
nr-lab.url = "github:your-username/nr-lab";
};
outputs = { nixpkgs, nr-lab, ... }: {
nixosConfigurations.your-host = nixpkgs.lib.nixosSystem {
modules = [
nr-lab.nixosModules.open5gs
{
services.open5gs = {
enable = true;
mode = "5g-sa"; # or "lte" or "both"
# PLMN configuration
plmn = {
mcc = "001"; # Test MCC
mnc = "01"; # Test MNC
};
# Network name shown on devices
networkName = "My 5G Lab";
# User plane configuration
userPlane = {
subnet = "10.45.0.0/16";
gateway = "10.45.0.1";
dnn = "internet";
};
# gNB connection (NGAP/N2 interface)
ngap.address = "192.168.1.100"; # AMF address for gNB
# User plane (GTP-U/N3 interface)
gtpu.address = "192.168.1.100"; # UPF address for gNB
};
}
];
};
};
}| 选项 / Option | 默认值 / Default | 说明 / Description |
|---|---|---|
enable |
false |
启用 Open5GS / Enable Open5GS |
mode |
"5g-sa" |
网络模式: 5g-sa, lte, both |
plmn.mcc |
"001" |
移动国家码 / Mobile Country Code |
plmn.mnc |
"01" |
移动网络码 / Mobile Network Code |
networkName |
"NR Lab" |
网络名称 / Network name |
tac |
1 |
跟踪区码 / Tracking Area Code |
userPlane.subnet |
"10.45.0.0/16" |
UE IP 池 / UE IP pool |
userPlane.dnn |
"internet" |
数据网络名 / Data Network Name |
mongodb.enable |
true |
启用 MongoDB / Enable MongoDB |
tun.enable |
true |
创建 ogstun 接口 / Create ogstun interface |
nat.enable |
true |
启用 NAT / Enable NAT for UE traffic |
| 选项 / Option | 默认值 / Default | 说明 / Description |
|---|---|---|
ims.enable |
false |
启用 IMS 支持(HSS Cx 接口)/ Enable IMS (HSS Cx interface) |
ims.domain |
"ims.mnc001.mcc001.3gppnetwork.org" |
IMS 域名 / IMS domain |
ims.icscf.address |
"127.0.0.30" |
I-CSCF (Kamailio) 地址 / I-CSCF address |
ims.icscf.port |
3869 |
I-CSCF Diameter 端口 / I-CSCF Diameter port |
ims.scscf.address |
"127.0.0.31" |
S-CSCF (Kamailio) 地址 / S-CSCF address |
ims.scscf.port |
3870 |
S-CSCF Diameter 端口 / S-CSCF Diameter port |
ims.smsc |
null |
SMS over IMS 的 SMSC SIP URI |
连接外部基站(小基站、RRU)时,需要将相关接口绑定到外部 IP。
When connecting external base stations (small cells, RRU), you need to bind interfaces to external IPs.
| 选项 / Option | 默认值 / Default | 说明 / Description |
|---|---|---|
ngap.address |
"127.0.0.5" |
5G NGAP (N2) 接口,gNB 连接此地址 |
gtpu.address |
"127.0.0.7" |
5G GTP-U (N3) 接口,用户面数据 |
s1ap.address |
"127.0.0.2" |
4G S1AP 接口,eNB 连接此地址 |
sgwuGtpu.address |
"127.0.0.6" |
4G SGWU GTP-U 接口,用户面数据 |
# 假设服务器 IP 为 192.168.1.100
services.open5gs = {
enable = true;
mode = "5g-sa";
plmn = { mcc = "001"; mnc = "01"; };
tac = 1;
networkName = "My 5G Lab";
# 外部 gNB 连接的 NGAP (N2) 接口 - AMF
ngap.address = "192.168.1.100";
# 外部 gNB 连接的 GTP-U (N3) 接口 - UPF
gtpu.address = "192.168.1.100";
userPlane = {
subnet = "10.45.0.0/16";
gateway = "10.45.0.1";
dnn = "internet";
};
};gNB 配置(srsRAN 或其他)中需要设置:
- AMF 地址:
192.168.1.100:38412(SCTP) - 确保 PLMN 和 TAC 匹配
# 假设服务器 IP 为 192.168.1.100
services.open5gs = {
enable = true;
mode = "lte";
plmn = { mcc = "001"; mnc = "01"; };
tac = 1;
networkName = "My LTE Lab";
# 外部 eNB 连接的 S1AP 接口 - MME
s1ap.address = "192.168.1.100";
# 外部 eNB 连接的 GTP-U 接口 - SGWU
sgwuGtpu.address = "192.168.1.100";
userPlane = {
subnet = "10.45.0.0/16";
gateway = "10.45.0.1";
dnn = "internet"; # APN for LTE
};
};eNB / 小基站配置中需要设置:
- MME 地址:
192.168.1.100:36412(SCTP) - 确保 PLMN 和 TAC 匹配
services.open5gs = {
enable = true;
mode = "both"; # 启用 4G EPC + 5G Core
plmn = { mcc = "001"; mnc = "01"; };
tac = 1;
networkName = "My Dual-Mode Lab";
# 5G 接口
ngap.address = "192.168.1.100";
gtpu.address = "192.168.1.100";
# 4G 接口
s1ap.address = "192.168.1.100";
sgwuGtpu.address = "192.168.1.100";
userPlane = {
subnet = "10.45.0.0/16";
gateway = "10.45.0.1";
dnn = "internet";
};
};要启用 VoLTE,需要配置 HSS 的 Cx 接口以连接 Kamailio I-CSCF/S-CSCF。
To enable VoLTE, configure HSS Cx interface to connect to Kamailio I-CSCF/S-CSCF.
services.open5gs = {
enable = true;
mode = "lte"; # VoLTE 需要 LTE 模式
plmn = { mcc = "001"; mnc = "01"; };
tac = 1;
networkName = "VoLTE Lab";
# 4G 接口
s1ap.address = "192.168.1.100";
sgwuGtpu.address = "192.168.1.100";
userPlane = {
subnet = "10.45.0.0/16";
gateway = "10.45.0.1";
dnn = "internet";
};
# 启用 IMS/VoLTE 支持
ims = {
enable = true;
# IMS 域名 (应与 Kamailio 配置匹配)
domain = "ims.mnc001.mcc001.3gppnetwork.org";
# Kamailio I-CSCF 连接配置
icscf = {
address = "192.168.1.101"; # I-CSCF IP
port = 3869; # Diameter port
};
# Kamailio S-CSCF 连接配置
scscf = {
address = "192.168.1.102"; # S-CSCF IP
port = 3870; # Diameter port
};
# 可选: SMS over IMS
# smsc = "sip:smsc.ims.mnc001.mcc001.3gppnetwork.org:7090";
};
};架构说明 / Architecture:
┌─────────────────────────────────────────────┐
│ Open5GS HSS │
│ (同时服务 EPC 和 IMS) │
│ │
│ ┌─────────────┐ ┌─────────────────────┐ │
│ │ S6a 接口 │ │ Cx 接口 │ │
│ └──────┬──────┘ └──────┬────────┬─────┘ │
└─────────┼───────────────────┼────────┼──────┘
│ │ │
▼ ▼ ▼
┌─────────────────┐ ┌────────────┐ ┌────────────┐
│ MME │ │ I-CSCF │ │ S-CSCF │
│ (Open5GS) │ │ (Kamailio) │ │ (Kamailio) │
└─────────────────┘ └────────────┘ └────────────┘
EPC IMS
Kamailio 配置要点 / Kamailio Configuration:
I-CSCF 需要配置 Diameter peer 指向 Open5GS HSS:
<!-- icscf.xml -->
<Peer FQDN="hss.epc.mnc001.mcc001.3gppnetwork.org"
Realm="epc.mnc001.mcc001.3gppnetwork.org"
port="3868"/>S-CSCF 同样需要配置:
<!-- scscf.xml -->
<Peer FQDN="hss.epc.mnc001.mcc001.3gppnetwork.org"
Realm="epc.mnc001.mcc001.3gppnetwork.org"
port="3868"/>参考 / Reference:
# 查看所有 Open5GS 服务状态
systemctl status 'open5gs-*'
# 重启 AMF
sudo systemctl restart open5gs-amf
# 查看日志
journalctl -u open5gs-amf -fMIT License