BlogHướng dẫn dựng lab LTE ảo hóa hoàn toàn (Open5GS + srsRAN qua ZMQ) — kèm Troubleshooting
Bố cục bài viết
Trang này
Ngày tạo
09/09/2026
Cập nhật
Lượt xem
4
Đọc
6m
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ần | Yêu cầu |
|---|---|
| Hệ điều hành | Ubuntu 22.04 LTS |
| CPU | Đa nhân (xử lý PHY qua ZMQ vẫn cần đúng nhịp thời gian thực) |
| RAM | Tối thiểu 8GB |
| Quyền | sudo/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-webuikhô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-devvà-DENABLE_RF_PLUGINS=OFFlà bắt buộc — thiếu 1 trong 2 khiến CMake không buildsrsenb/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ểm | Cá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ác | sudo 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ố | eNB | Open5GS | Subscriber |
|---|---|---|---|
| MCC/MNC | mcc=999, mnc=70 | plmn_id: mcc:999, mnc:70 | IMSI bắt đầu 99970 |
| TAC | tac=7 (mặc định rr.conf) | tai.tac=7 (sửa từ mặc định 1) | — |
| MME address | mme_addr=127.0.0.2 | s1ap.server.address=127.0.0.2 | — |