使用 USRP B210 和 srsRAN 搭建私有 LTE 网络

2025-07-14 22:16:02
This post is also available in English and alternative languages.

参考

实验过程参考了以下资源,所以不再赘述,仅写一写配置细节和注意事项。

清单

以下仅为本文所用到的设备和软件:

  • Ettus Research USRP B210:SDR 开发板
    • UHD:USRP 固件
  • Gialer 可编程 SIM 卡
    • GRSIMWrite:SIM 卡读写工具(Windows only)
    • Windows 笔记本
    • PC/SC 读卡器
  • Raspberry Pi 5:连接 SDR 设备、运行 srsRAN
  • srsRAN:开源 LTE/NR 软件栈
    • srsUE(未用到):UE 模拟器,可以搭配两台 USRP B210 建立端到端的 LTE 连接
    • srsENB:eNodeB(基站)模拟器
    • srsEPC:EPC(核心网),处理 UE 鉴权和数据转发

安装 srsRAN

建议选用最新的 release 版本进行编译,而不是从 apt 源安装。由于 srsRAN 4G 较旧,不支持 C++20 语法,最好使用 Ubuntu 22.04 或容器。我在 Debian 13 (trixie) 上浪费了大量时间解决编译环境,换成 Raspberry Pi OS (Debian 12 bookworm) 后就顺利了。

必须先安装 SDR 驱动(UHD)再编译 srsRAN否则会跳过 srsUE 和 srsENB 的编译

卡片读写

pySim 虽然也能用,但最好使用原厂的 GRSIMWrite 工具,其带 GUI、更加直观,可以存储参数。Gialer 的卡片上写有 ADM: 3838383838383838,实际上它是 HEX 编码后的 ASCII 字符串 88888888。即使不小心弄错了,pySim 也会提示 ValueError: PIN-ADM needs to be <=8 digits (ascii)。这时候应该反应过来这段 ADM 的意义了。

Administrative Data (AD) 字段定义于 3GPP TS 31.102 的第 4.2.1 节。

srsENB 配置

srsENB 处理所有射频相关的配置(srsenb.conf),包括:cell ID、工作频段、带宽、发射增益等。

EARFCN:LTE 信道号

  • 3350(B7 FDD):srsENB 默认值,搜不到信号,浪费了不少时间
  • 1934(B3 FDD):这篇教程使用,搜不到信号,浪费了不少时间
  • 1650/1750/1850(B3 FDD):亲测正常使用

联网

srsEPC 依靠 NAT 来提供网络访问,自带的配置脚本 srsepc_if_masq.sh 将调用 iptables 来配置 masquerade。对于 Raspberry Pi OS Lite,需要手动从 APT 源安装 iptables

性能

RPi 5 的性能足以支撑 srsRAN 的运行,我甚至用的是插线板的自带的 USB-A 口,搭配一分二的 USB-C 线同时给两个 Pi 5 并外挂了一个 USRP B210。使用 fast.com 测得下行吞吐约 50Mbps,上行约为 60Mbps。iperf3 更精准但我懒得弄了。

从 EPC 到 UE 的 ping RTT 约为 20-30ms,远不及 Wi-Fi。

在 Intel N100 的小主机上运行,吞吐在 20-40Mbps 之间浮动,同时 srsENB 出现如下错误信息:

1
2
3
4
5
6
7
8
9
10
11
RACH:  tti=2841, cc=0, pci=1, preamble=48, offset=1, temp_crnti=0x7a
User 0x7a requesting RRC Reestablishment as 0x79. Cause: otherFailure
Disconnecting rnti=0x79.
User 0x7a connected
RACH: tti=4881, cc=0, pci=1, preamble=7, offset=1, temp_crnti=0x7b
User 0x7b requesting RRC Reestablishment as 0x7a. Cause: otherFailure
Disconnecting rnti=0x7a.
User 0x7b connected
RACH: tti=8881, cc=0, pci=1, preamble=26, offset=1, temp_crnti=0x7c
User 0x7c requesting RRC Reestablishment as 0x7b. Cause: otherFailure
Disconnecting rnti=0x7b.

问题源自处理器性能不足,和 N100 主频低有关系。

构建 srsRAN 容器

在 Raspberry Pi 5 上测试 srsRAN 后,受到这篇博客的启发,将 srsRAN 打包成了单体的 Docker 容器,这样就不会搞脏宿主机环境了。

dockerfile 如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
FROM ubuntu:22.04
ENV DEBIAN_FRONTEND=noninteractive
ENV TZ="Europe/London"

RUN apt update && \
apt install -y libuhd-dev uhd-host && \
/usr/bin/uhd_images_downloader && \
apt install -y git nano htop nload iftop tmux screen && \
apt install -y build-essential cmake libfftw3-dev libmbedtls-dev libboost-program-options-dev libconfig++-dev libsctp-dev && \
apt clean && \
rm -rf /var/lib/apt/lists/*

RUN git clone https://github.com/srsran/srsRAN_4G.git && \
cd srsRAN_4G && \
git checkout tags/release_23_11 && \
mkdir -p build

RUN cd srsRAN_4G/build && \
cmake ../ && \
make -j$(nproc) && \
# make test && \
make install

RUN apt purge -y --auto-remove git build-essential cmake
RUN rm -rf /srsRAN_4G/.git

CMD ["bash"]

docker-compose.yml 如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
services:
srsran_4g:
build:
context: .
dockerfile: dockerfile
image: srsran_4g:latest
container_name: srsran_4g_container
volumes:
- ./config:/etc/srsran
- /dev/bus/usb:/dev/bus/usb
privileged: true # Required for USB access
command: ["sh", "-c", "srsran_install_configs.sh service && cp /usr/local/bin/srsepc_if_masq.sh /etc/srsran/srsepc_if_masq.sh && bash"]
tty: true
stdin_open: true
network_mode: host

使用方法:

  1. 新建一个名为 srsRAN_4G 的目录,将上述 dockerfiledocker-compose.yml 放入其中。
  2. docker compose up --build 构建并启动容器。
  3. 容器成功运行后,会在 srsRAN_4G/ 下生成 config 目录,包含了 srsRAN 的默认配置文件。根据需要,手动修改 EPC、ENB 和 UE 的配置文件。
  4. 插入 USRP B210。
  5. 进入容器:docker exec -it srsran_4g_container tmux,在不同的窗口中依次运行 srsepcsrsenb 即可。
  6. 在宿主机执行 srsepc_if_masq.sh <interface> 来配置 NAT。

总结

其实折腾 SDR hacking 的念头很早就有了,最早是多年前在乌云 Drops 上看到用摩托罗拉 C118 搭建 OsmocomBB 实现 GSM Sniffing;后来又刷到了 Femtocell(皮基站)相关的文章。实习工作时也接触过 RTL-SDR,但只是用作 ADS-B Receiver。

去年研究 eSIM 时发现 UK Ofcom 提供 Shared Access License,起步价仅为 £80/年(2x3.3MHz 或 10MHz);身在美国的 homelabber 可以使用商用的 CBRS 基站来部署 LTE/NR 网络,参考 $100,DIY 搭建合法的 LTE 网络。不过 UK 和 EU 也在逐步推进类似 CBRS 的动态频谱分配机制,希望相关政策早日落地吧。

总的来说,srsRAN 4G 只适合学习折腾,无法 scale up 到生产环境;srsRAN 5G 则是真正能对接商用的 O-RAN 设备勉强实现可用的。

Prev
2025-07-14 22:16:02