Skip to content
LIVE FEED

BlogHướng dẫn dựng lab LTE ảo hóa hoàn toàn (Open5GS + srsRAN qua ZMQ) — kèm Troubleshooting

Hướng dẫn dựng lab LTE ảo hóa hoàn toàn (Open5GS + srsRAN qua ZMQ) — kèm Troubleshooting

Tài liệu này tổng hợp toàn bộ lộ trình dựng một mạng LTE (4G) ảo hóa hoàn toàn — không cần phần cứng SDR (USRP), không phát sóng RF thật — để quan sát chi tiết các luồng báo hiệu ở lớp radio: Random Access (MSG1-MSG5), RRC (Paging, Connection Setup), NAS (Attach), và trạng thái IDLE/CONNECTED. Đây là bản cập nhật, bao gồm phần Troubleshooting tổng hợp từ thực tế triển khai.

Mục tiêu

  • Dựng đầy đủ EPC + eNB + UE trên một máy duy nhất
  • Quan sát toàn bộ chuỗi bản tin từ lúc UE Attach đến khi nhận dữ liệu downlink
  • Bắt gói (pcap) ở cả lớp radio (UE↔eNB) và lớp lõi mạng (eNB↔MME)
  • Kiểm tra chuyển trạng thái IDLE ⟷ CONNECTED

0. Yêu cầu môi trường

Thành phầnYêu cầu
Hệ điều hànhUbuntu 22.04 LTS
CPUĐa nhân (xử lý PHY qua ZMQ vẫn cần đúng nhịp thời gian thực)
RAMTối thiểu 8GB
Quyềnsudo/root

Không cần bất kỳ phần cứng SDR (USRP) nào — toàn bộ lớp vô tuyến được thay thế bằng socket ZeroMQ.

1. Dựng lõi mạng (EPC) — Open5GS

Cài đặt

sudo add-apt-repository ppa:open5gs/latest
sudo apt update
sudo apt install open5gs

Gói open5gs-webui không còn tồn tại trong kho APT ở các phiên bản gần đây — WebUI phải build riêng từ mã nguồn.

1.1. MongoDB (bắt buộc cho HSS/WebUI)

curl -fsSL https://www.mongodb.org/static/pgp/server-7.0.asc | \
  sudo gpg -o /usr/share/keyrings/mongodb-server-7.0.gpg --dearmor

echo "deb [ arch=amd64,arm64 signed-by=/usr/share/keyrings/mongodb-server-7.0.gpg ] https://repo.mongodb.org/apt/ubuntu jammy/mongodb-org/7.0 multiverse" | \
  sudo tee /etc/apt/sources.list.d/mongodb-org-7.0.list

sudo apt update
sudo apt install -y mongodb-org
sudo systemctl start mongod
sudo systemctl enable mongod

1.2. WebUI (build từ mã nguồn qua Node.js/npm)

curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash -
sudo apt install -y nodejs

git clone https://github.com/open5gs/open5gs.git
cd open5gs/webui
npm ci --no-optional
npm run build
npm run dev
  • Truy cập: http://localhost:3000
  • Tài khoản mặc định: admin / 1423 — đổi ngay sau lần đăng nhập đầu

1.3. Thêm subscriber test

  • IMSI: 999700000000001 (khớp PLMN mặc định Open5GS: MCC=999, MNC=70)
  • Ki, OPc: tùy chọn
  • APN test: internet

2. Dựng eNB ảo hóa — srsENB

sudo apt install cmake build-essential libfftw3-dev libmbedtls-dev \
    libboost-program-options-dev libconfig++-dev libsctp-dev libzmq3-dev

git clone https://github.com/srsran/srsRAN_4G.git
cd srsRAN_4G
mkdir build && cd build

cmake ../ \
  -DCMAKE_C_FLAGS="-Wno-maybe-uninitialized -Wno-stringop-overflow" \
  -DCMAKE_CXX_FLAGS="-Wno-maybe-uninitialized -Wno-stringop-overflow -Wno-deprecated-declarations" \
  -DENABLE_WERROR=OFF \
  -DENABLE_RF_PLUGINS=OFF

make -j$(nproc)
sudo make install
sudo ldconfig

libzmq3-dev và -DENABLE_RF_PLUGINS=OFF là bắt buộc — thiếu 1 trong 2 khiến CMake không build srsenb/srsue.

Chuẩn bị file cấu hình

cd ~/srsRAN_4G/srsenb
cp enb.conf.example ../build/srsenb/enb.conf
cp rr.conf.example  ../build/srsenb/rr.conf
cp rb.conf.example  ../build/srsenb/rb.conf
cp sib.conf.example ../build/srsenb/sib.conf

enb.conf — các giá trị bắt buộc phải khớp Open5GS

[enb]
mcc = 999
mnc = 70
mme_addr = 127.0.0.2
gtp_bind_addr = 127.0.1.1
s1c_bind_addr = 127.0.1.1

[rf]
device_name = zmq
device_args = fail_on_disconnect=true,tx_port=tcp://*:2000,rx_port=tcp://localhost:2001,id=enb,base_srate=23.04e6

[pcap]
enable = mac,s1ap
mac_filename  = /tmp/enb_mac.pcap
s1ap_filename = /tmp/enb_s1ap.pcap

3. Dựng UE ảo hóa — srsUE

cd ~/srsRAN_4G/srsue
cp ue.conf.example ../build/srsue/ue.conf
[usim]
mode = soft
algo = milenage
imsi = 999700000000001
imei = 353490069873319
k    = <Ki đã cấu hình>
opc  = <OPc đã cấu hình>

[rf]
device_name = zmq
device_args = tx_port=tcp://*:2001,rx_port=tcp://localhost:2000,id=ue,base_srate=23.04e6

[pcap]
enable = mac,nas
mac_filename = /tmp/ue_mac.pcap
nas_filename = /tmp/ue_nas.pcap

4. Khớp TAC giữa eNB và MME

srsRAN mặc định phát TAC=7, Open5GS mặc định chỉ chấp nhận TAC=1 → gây unknown-PLMN. Sửa MME cho khớp:

sudo nano /etc/open5gs/mme.yaml
tai:
  - plmn_id:
      mcc: 999
      mnc: 70
    tac: 7
sudo systemctl restart open5gs-mmed

5. Khởi chạy toàn bộ hệ thống

sudo systemctl status open5gs-mmed
sudo srsenb enb.conf     # terminal riêng
sudo srsue ue.conf       # terminal riêng

Xác minh Attach thành công qua log: Random Access Complete → RRC Connected → NAS Attach/Default EPS Bearer Setup Complete.

6. Kiểm tra trạng thái IDLE / CONNECTED

[expert]
rrc_inactivity_timer = 5000   ; ms, rút ngắn để test nhanh
ping <IP-được-cấp-cho-UE-qua-P-GW>   # kích hoạt lại Paging

7. Thu thập và phân tích PCAP

ĐiểmCách bắt
Lớp radio (UE↔eNB)Cấu hình sẵn trong enb.conf/ue.conf
S1AP (eNB↔MME)sudo tcpdump -i lo -w s1ap.pcap sctp
Giao diện lõi khácsudo tcpdump -i <iface> -w s11.pcap gtp

Mở bằng Wireshark, bật preferences MAC-LTE, RLC-LTE, PDCP-LTE.


Phụ lục: Troubleshooting thực tế

stringop-overflow / -Werror khi build srsRAN_4G

GCC mới (11+) kiểm tra chặt hơn, -Werror mặc định biến warning thành lỗi (GitHub issue #1495 — false positive đã biết). Khắc phục bằng flag cmake ở mục 2.

make srsenb → “Nothing to be done”

Thiếu libzmq3-dev khiến CMake không tìm RF backend, chỉ build srsepc/srsmbms. Cài libzmq3-dev, xóa build cũ, cấu hình lại với -DENABLE_RF_PLUGINS=OFF.

sudo srsenb enb.conf → “command not found”

make install chưa từng thành công. Kiểm tra find / -iname "srsenb" -type f, build lại make -j$(nproc), rồi sudo make install && sudo ldconfig.

npm ci → “Unexpected token ‘?’”

Node.js quá cũ (v10/v12). Gỡ sạch, cài lại Node 18 qua NodeSource, xóa node_modules (giữ nguyên package-lock.json), chạy lại npm ci.

npm ci → “can only install with an existing package-lock.json”

Đã lỡ xóa package-lock.json. Khôi phục bằng git checkout package-lock.json, hoặc dùng npm install thay npm ci.

unrecognised option 'pcap.filename'

Cú pháp [pcap] cũ không còn đúng. Dùng: enable = mac,nas (danh sách) + mac_filename/nas_filename riêng biệt.

Failed to initiate S1 connection / Connection refused

mme_addr sai — nhầm địa chỉ mặc định srsEPC (127.0.1.100/127.0.1.2) thay vì địa chỉ S1AP thật của Open5GS. Kiểm tra bằng sudo ss -lnp | grep sctp, thường là 127.0.0.2:36412.

Received ConnectionReject + Could not find Home PLMN

PLMN eNB không khớp subscriber. Đặt mcc=999, mnc=70 trong enb.conf.

Invalid length for IMEI: 0 should be 15

Thiếu imei trong [usim]. Thêm giá trị đủ 15 chữ số.

S1 Setup Failure. Cause: misc - unknown-PLMN

PLMN khớp nhưng TAC không khớp (eNB mặc định 7, Open5GS mặc định 1). Sửa tai.tac trong mme.yaml thành 7, restart MME.

Bảng tổng hợp các giá trị bắt buộc phải khớp nhau

Tham sốeNBOpen5GSSubscriber
MCC/MNCmcc=999, mnc=70plmn_id: mcc:999, mnc:70IMSI bắt đầu 99970
TACtac=7 (mặc định rr.conf)tai.tac=7 (sửa từ mặc định 1)—
MME addressmme_addr=127.0.0.2s1ap.server.address=127.0.0.2—
Contact
Facebook
TOP