# Lab 2 Open5GS&UERANSIM ## Outline - [1. 實驗內容](#1.實驗內容) - [2. 相關知識](#2.相關知識) - [3. 相關建置環境/設備規格](#3.相關建置環境/設備規格) - [4. 實驗架構](#4.實驗架構) - [5. 實驗流程](#5.實驗流程) - [5-1 架設 Open5GS](#5-1架設-Open5GS) - [問題與討論(一)](#問題與討論(一)) - [5-2 安裝與架設UERANSIM](#5-2-安裝與架設UERANSIM) - [問題與討論(二)](#問題與討論(二)) - [5-3 UERANSIM 外網測試](#5-3-UERANSIM-外網測試) - [問題與討論(三)](#問題與討論(三)) ----- ## 1.實驗內容 - 建立一個 5G 專網,架設 Open5GS 核心網路、gNB、UE - 學習如何模擬手機連線 - 使用 Iperf3 進行 Downlink ICMP 和 Uplink ICMP 連線測試 ----- ## 2.相關知識 - Open5GS:基於 3GPP 規範的 5G 核心網路 (5GC) 的開源軟體。 為建立和測試 5G 網路提供功能齊全且靈活的平台。 Open5GS 的關鍵元件包括:存取和行動管理功能(AMF)、會話管理功能(SMF)、使用者平面功能 (UPF)、網路儲存庫功能 (NRF)、服務能力暴露功能(SCEF)、訂閱者資料管理 (SDM)、統一資料管理(UDM)等。 - UERANSIM:OpenAirInterface軟體聯盟開發的一款用於 5G 用戶設備(UE)和無線存取網路(RAN)的開源模擬工具。模擬 5G UE 在各種網路部署場景中的行為。 - MongoDB是一個流行的開源 NoSQL 資料庫管理系統。它使用文件導向的資料模型,而不是傳統的關係型資料庫表結構。MongoDB的主要特點和概念包括: - 文檔導向的資料模型:MongoDB 儲存資料的基本單元是文檔,這些文檔採用類似 JSON 的格式,包含各種類型的資料。這種資料模型使得 MongoDB 非常適合處理複雜的資料結構和半結構化資料。 - 靈活的模式:與傳統的關聯式資料庫不同,MongoDB 不要求文件具有相同的結構或模式,這使得在開發過程中可以更靈活地進行模式設計和資料建模。這種靈活性使得 MongoDB 更適用於快速迭代和麵對變化的應用程式。 - 分散式儲存:MongoDB 支援水平擴展,可以在多台伺服器之間分散數據,以應對大規模資料儲存的需求。 ----- ## 3.相關建置環境/設備規格 ### [Ubuntu安裝](https://github.com/TTU-CWBT/Ubuntu-install-tutorial) :warning:這次的實驗需要安裝 Ubuntu Desktop,請在安裝完 Ubuntu 後在終端機輸入安裝桌面的指令,這個指令會需要花一些時間,請耐心等待。 ``` shell=1 sudo apt install ubuntu-desktop ``` | 軟體名稱 | 軟體版本 | |:-------- |:---------:| | Ubuntu | 22.04 LTS | | Open5gs | v2.7.1 | | UERANSIM | v3.2.6 | ----- ## 4.實驗架構 - 目前架構都以 VM 進行 - 核心網路:Open5GS - 模擬 Radio 訊號:UERANSIM ----- ## 5.實驗流程 ### 5-0 前情提要 由於以下實驗會有大量複製貼上指令的動作,所以建議在本地端的終端機使用SSH連線至虛擬機(VM)的方式進行,SSH 的連線方式如下。 - Connect to a remote server: ``` shell=1 ssh username@remote_host 或是 ssh username@remote_IP example ssh open5gs@10.0.2.12 ``` > 常見錯誤 > 如果發現找不到 IP,可以透過 `ip a` 查看 IP address > 如果沒有 IP address,可以輸入 `sudo dhclient` 來代管網卡,然後再次輸入 `ip a` 指令查看 IP > 如果連線不穩定,可以改用 Host Only 的 IP address ### 5-1.架設 Open5GS #### Ubuntu 基本套件安裝 - 請輸入以下指令至 terminal ``` shell=1 sudo apt update && sudo apt upgrade sudo apt-get install vim sudo apt install net-tools sudo apt install traceroute sudo apt install tldr sudo apt install iperf3 ``` #### 安裝 MongoDB - 安裝過程中可能會造成網路中斷,重新連線即可,依序輸入 ##### x86 ``` shell=1 驗證mongodb x86 sudo apt install gnupg curl curl -fsSL https://pgp.mongodb.com/server-6.0.asc | sudo gpg -o /usr/share/keyrings/mongodb-server-6.0.gpg --dearmor echo "deb [ arch=amd64,arm64 signed-by=/usr/share/keyrings/mongodb-server-6.0.gpg ] https://repo.mongodb.org/apt/ubuntu focal/mongodb-org/6.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-6.0.list sudo apt update sudo apt install -y mongodb-org sudo systemctl start mongod sudo systemctl enable mongod ``` ##### arm64 ``` shell=1 驗證mongodb m1 sudo apt install gnupg curl sudo apt install software-properties-common gnupg apt-transport-https ca-certificates -y curl -fsSL https://pgp.mongodb.com/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 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 apt update sudo apt install mongodb-org -y mongod --version ``` >常見錯誤 >![5-1-1 MongoDB常見錯誤](https://hackmd.io/_uploads/HyRx18bMle.png) > M 系列的 Mac 可能會出現這個問題,可以參考以下網址 https://www.cherryservers.com/blog/install-mongodb-ubuntu-22-04 - 檢查 mongodb 版本 > mongod --version ![5-1-2 mongodb version](https://hackmd.io/_uploads/HkSUG_Zfel.png) 檢查 mongodb 是否正常運作 ``` shell=1 sudo systemctl status mongod ``` >正常運作會長這樣 ![5-1-3 mongodb status](https://hackmd.io/_uploads/Bk7NGdbMel.png) #### 下載與安裝 Open5GS & UERANSIM 相關套件 ``` shell=1 sudo apt install cmake libfftw3-dev libmbedtls-dev libboost-program-options-dev libconfig++-dev libsctp-dev git ``` 安裝完畢後請依序輸入以下指令 ``` shell=1 sudo add-apt-repository ppa:open5gs/latest ``` > 按下Enter ``` shell=1 sudo apt update sudo apt install open5gs 輸入y ``` #### 安裝 node.js 請依序輸入以下指令 ``` shell=1 sudo apt install -y ca-certificates sudo mkdir -p /etc/apt/keyrings curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | sudo gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg NODE_MAJOR=20 echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_$NODE_MAJOR.x nodistro main" | sudo tee /etc/apt/sources.list.d/nodesource.list sudo apt update sudo apt install nodejs -y ``` #### 安裝 Open5GS-webUI 請輸入以下指令 ``` shell=1 curl -fsSL https://open5gs.org/open5gs/assets/webui/install | sudo -E bash - ``` >會出現以下畫面,需耐心等待 ![5-1-4 install open5gs webui](https://hackmd.io/_uploads/HJobUuWMeg.png) #### 註冊 UE 用戶 安裝完畢後,需要回到虛擬機中(此時不能依賴 SSH 連線,會失敗),在『**虛擬機**』 開啟瀏覽器並輸入`127.0.0.1:9999`,第一次開啟會需要稍等一下,若成功開啟後,就代表 Open5GS 有順利安裝成功,接著輸入預設密碼 > Username: admin > Password: 1423 ![5-1-5 login webui](https://hackmd.io/_uploads/Hk8mr0ZQgx.png) > 登入成功後會看到以下介面 ![5-1-6 註冊UE](https://hackmd.io/_uploads/HyuXBRWmxg.png) > 然後點擊右下角紅色的『+』並開始編輯以下資料 > IMSI 輸入我們設定的:001010000000000 > Type 修改為 IPv4 ![5-1-7 ISMI](https://hackmd.io/_uploads/H1BVwqz7xg.png) ### 驗證 Open5GS 安裝成功 如果 Open5GS 安裝成功後,每次重新開機後都會自動在背景執行,輸入`ps aux | grep open5gs` 可以確認 Open5GS 核心功能是否正常運作,若成功畫面會如下(請確認已以下這些功能是否正常,若不正常請勿執行下一步驟) ![5-1-8 驗證open5gs](https://hackmd.io/_uploads/SJZW_oZGxe.png) > 核心功能如下 > AMF, SMF, UPF, NRF, UDM, UDR, PCF,AUSF, NSSF 確認核心功能都啟用後,便可以開始設定核心網路的 amf, smf, upf功能了 #### 1. 設定 amf.yaml 輸入`sudo vim /etc/open5gs/amf.yaml`編輯 amf,需要修改的如下 > mcc、mnc:'001', '01' > Address:open5gs 的 hostonly IP ![5-1-9 amf](https://hackmd.io/_uploads/rkKp25f7lx.png) 完成後輸入 `sudo systemctl restart open5gs-amfd.service` 重新啟動 amf #### 2. 設定 nrf.yaml 輸入 `sudo vim /etc/open5gs/nrf.yaml` 編輯 nrf,需要修改的如下 > PLMN ->mmc=001 mnc=01 ![5-1-10 urf](https://hackmd.io/_uploads/SJ-109Gmxl.png) 完成後輸入 `sudo systemctl restart open5gs-urfd.service` 重新啟動 urf #### 3. 設定 upf.yaml 輸入`sudo vim /etc/open5gs/upf.yaml`編輯 upf,需要修改的如下 > 將 gtpu 的 IP 設定為核網 host only 的 IP ![5-1-11 upf](https://hackmd.io/_uploads/HkrhR9MQxg.png) 完成後輸入 `sudo systemctl restart open5gs-upfd.service` 重新啟動upf #### 4. 設定網路功能(路由、 NAT 轉換與防火牆功能) 輸入以下指令設定網路功能,以下指令每次重新開機都需要重新輸入設定,若沒有輸入以下設定,核心網路功能會受限或無法使用! > :warning:在執行 `sudo iptables -t nat -A POSTROUTING -o enp0s1 -j MASQUERADE` 指令前,請特別確認 `enp0s1` 是否為 Open5GS VM 中對應 Shared Network 的網卡名稱。 ``` sudo sysctl -w net.ipv4.ip_forward=1 sudo iptables -t nat -A POSTROUTING -o enp0s1 -j MASQUERADE sudo systemctl stop ufw ``` 為了方便已將指令寫成腳本,學生們只要建立一個`.sh`的檔案,並將以下內容複製貼上並儲存,以後開機只要輸入 `sh filename.sh` ,就可以自動設定了 - 網路設定shell script ``` shellscript=1 #!/bin/bash # Program: # this is auto setting network # History: # 2025/05/16 Timothy_Su_TZD First version PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin export PATH sudo sysctl -w net.ipv4.ip_forward=1 sudo iptables -t nat -A POSTROUTING -o enp0s1 -j MASQUERADE sudo systemctl stop ufw exit 0 ``` 設定完成後基本上就完成了核心網路的所有設定,接下來就則要設定 UE & RAN ----- ### 問題與討論(一) 1. 截圖 Open5GS Web UI註冊成功畫面 2. 解釋什麼是 IMSI 與 IPv4 3. 請解釋 AMF, NRF, UPF, SMF分別負責什麼工作? 4. 請解釋 AMF 中的 ngap 是什麼? ----- ### 5-2. 安裝與架設UERANSIM #### 前置作業 在安裝 UERANSIM 時會需要另一個獨立的虛擬機,不過現在不需要重新安裝一次 Ubuntu,只需要複製之前安裝的 Open5GS,並更改新虛擬機(UERANSIM)的網卡 MAC Address 即可,如下圖 ![5-2-1 copy_vm](https://hackmd.io/_uploads/r1KF-sGQlx.png) > 右鍵選擇虛擬機(UERANSIM)>> Edit >> Network >> Shared Network && Host Only >> MAC Address >> Click Random >> Save ![5-2-2 network randem](https://hackmd.io/_uploads/rJs6EsMQex.png) 接著開啟 UERANSIM (登入密碼與open5gs虛擬機登入密碼一樣),並且開啟 terminal(這裡建議使用 SSH 連線,因為也會有需要大量複製的需求),為了後續方便辨識建議使用者將 UERANSIM 的 username 改為 ueransim,更改方法可以參考[ubuntu下修改主机名、用户名以及用户密码](https://https://blog.csdn.net/qq_34160841/article/details/106886306)的文章,將UERANSIM虛擬機的username改成這樣。 ![5-2-3 rename vm](https://hackmd.io/_uploads/ByAGwsMXxx.png) #### 安裝UERANSIM - 把 UERANSIM 從 GitHub 上面抓下來 ``` shell=1 cd ~ git clone https://github.com/aligungr/UERANSIM sudo apt update ``` - 安裝 UERANSIM 相關工具 ``` shell=1 sudo apt install make sudo apt install gcc sudo apt install g++ sudo apt install libsctp-dev lksctp-tools sudo apt install iproute2 sudo apt-get install build-essential ``` > 若出現 Cmake 版本過舊,請參考下列安裝較新版的 CMake ``` shell=1 sudo apt remove cmake wget [https://cmake.org/files/v3.22/cmake-3.22.0.tar.gz] tar xvf cmake-3.22.0.tar.gz ./configure Make –j8 sudo make install ``` - Building UERANSIM 輸入以下指令,輸入 `make` 時跑比較久是正常的,切勿中斷指令執行!若都沒有錯誤,那就是安裝成功了! ``` shell=1 cd ~/UERANSIM make ``` >make 執行畫面 ![5-2-4 make](https://hackmd.io/_uploads/SJEhzhfXeg.png) > 看到 `UERANSIM successfully built.` 就是成功了! ![5-2-5 make success](https://hackmd.io/_uploads/H1RWQ2GQxl.png) #### 設定 UERANSIM - gNB 設定 輸入`vim ~/UERANSIM/config/open5gs-gnb.yaml`編輯 gNB 設定,需要修改的如下 >mcc、mcc修改為’001’和’01’ >linkIp、 ngapIp、 gtpIp修改為 UERANSIM VM的 host only IP >amfConfigs 的 address 修改為Open5GS VM的 host only IP >![5-2-6 gnb setting](https://hackmd.io/_uploads/BJESnoGXee.png) - UE 設定 輸入 `vim ~/UERANSIM/config/open5gs-ue.yaml` 編輯UE設定,需要修改的如下 > Supi:001010000000000 > mcc、mnc:001,01 > gnbSearchList:UERANSIM VM的 host onlyIP > ![5-2-7 ue setting](https://hackmd.io/_uploads/B1nQpjzXgx.png) 設定完成後,就可以開啟 gNB 與 UE 的模擬了 - Turn On the gNodeB ``` shell=1 cd ~/UERANSIM/build sudo ./nr-gnb -c ../config/open5gs-gnb.yaml ``` > 成功開啟後會顯示 `NG Setup procedure is successful` > ![5-2-8 open gnb](https://hackmd.io/_uploads/HyQBOhMQge.png) - Turn On the UE ``` shell=1 cd ~/UERANSIM/build sudo ./nr-ue -c ../config/open5gs-ue.yaml ``` > 成功開啟後會顯示 `Connection setup for PDU session[1] is successful, TUN interface[uesimtun0, 10.45.0.2] is up.` > ![5-2-9 openue](https://hackmd.io/_uploads/rk8fK2MQxx.png) > 並且在 gNB 的畫面也會同時新的顯示連接成功的訊息 - 檢查 Open5GS 連線紀錄 - 我們可以在open5GS VM 中輸入`sudo cat /var/log/open5gs/amf.log`,便可以觀察到 gNB 和 UE 連線資訊。 ![5-2-10 amf log](https://hackmd.io/_uploads/rJVE22MXlx.png) ----- ### 問題與討論(二) 1. 請截圖 gNB 與 UE 順利連接至 Open5GS 之畫面 2. 請在 /var/log/open5gs/amf.log 找出 gNB 與 UE 成功連線的紀錄並截圖 ----- ### 5-3. UERANSIM 外網測試 :warning: **請維持 gNB 與 UE 與 Open5GS 間的正常連線** 如果UE有成功透過gNB再經由核心網路註冊成功,我們可以透過`ip a`的指令在UERANSIM VM都看到一張名為 `uesimtun0` 的網卡(如下圖) ![5-3-1 ursimtum_ip](https://hackmd.io/_uploads/SJC-O6f7lx.png) 這張網卡就是UE的網卡,如果我們把UE的指令關掉,這張網卡便會消失,如果想要讓UE可以連接外網,就會需要設定 ip route,請輸入以下指令。 ``` shell=1 sudo ip route add default dev uesimtun0 ``` 如果要確認有沒有連接至外網,可以透過兩種方式確認,邏輯都是如果可以成功 ping 到 `google.com`,就是有成功。 1. ping ``` shell=1 ping -I uesimtun0 google.com ping -I uesimtun0 8.8.8.8 這兩個指令是一樣的,則一即可 這個指令會一直執行,可以透過Ctrl+c停止 ``` ![5-3-2 ping](https://hackmd.io/_uploads/ByXG1XQQxl.png) 2. traceroute ``` shell=1 traceroute google.com -i uesimtun0 -n ``` ![5-3-3 traceroute](https://hackmd.io/_uploads/r1NSkQQQex.png) > :warning:如果沒有成功 ping 或是 tracetoute 都一直停在『* * * 』就是失敗,請在Open5GS VM重新輸入以下指令 > :warning:在執行 `sudo iptables -t nat -A POSTROUTING -o enp0s1 -j MASQUERADE` 指令前,請特別確認 `enp0s1` 是否為 Open5GS VM 中對應 Shared Network 的網卡名稱。 > >``` shell=1 > sudo sysctl -w net.ipv4.ip_forward=1 > sudo iptables -t nat -A POSTROUTING -o enp0s1 -j MASQUERADE > sudo systemctl stop ufw > ``` #### UL/DL ICMP 連線測試 :warning: **請維持 gNB 與 UE 與 Open5GS 間的正常連線** 請在Open5GS VM輸入以下指令,並持續到UL/DL ICMP測試結束為止。 ``` sudo iperf3 -s ``` ![5-3-4 iperf3 -s](https://hackmd.io/_uploads/r1dVjNQmgx.png) > 輸入後會顯示以上結果 #### TCP - Uplink ICMP連線測試 在 UERANSIM VM 中輸入以下指令,並請確認 `10.45.0.1` 是否為 Open5GS VM 中 `ogstun` 網卡的 IP,以及 `10.45.0.4` 是否為 UERANSIM VM 中 `uesimtun0` 的 IP。 ``` shell=1 sudo iperf3 -c 10.45.0.1 -B 10.45.0.4 -b 100M -t 10 ``` - Downlink ICMP 連線測試 ``` shell=1 sudo iperf3 -c 10.45.0.1 -B 10.45.0.2 -b 100M -t 10 –R ``` ![5-3-5 TCP conn](https://hackmd.io/_uploads/HkM1hNm7ex.png) > 如果順利連線會顯示上圖,左邊是 Open5GS VM,右邊是 UERANSIM VM :warning: **如果出現iperf3: error - unable to send control message: Bad gile descriptor那高機率是因為ueransim上面的ogstun網卡也在運作** ![Screenshot 2025-11-11 at 3.24.21 AM](https://hackmd.io/_uploads/SyYgh2kxZl.png) :warning:可以在ueransim VM中的ip a檢查ogstun是否有有ip addr,若有,就是他正在運作,**請將ogstun的網卡關閉!** ![Screenshot 2025-11-11 at 3.32.38 AM](https://hackmd.io/_uploads/rkcgRnklWe.png =600x) - 解決方式是暫時把網卡關掉就可以了,關閉方式可以透過以下指令 ``` shell=1 sudo ip link set ogstun down ``` 關閉後就可以重新下一次TCP的指令了。 #### UDP - Uplink ICMP 連線測試 ``` shell=1 sudo iperf3 -c 10.45.0.1 -u -B 10.45.0.2 -b 100M -t 10 ``` - Downlink ICMP 連線測試 ``` shell=1 sudo iperf3 -c 10.45.0.1 -u -B 10.45.0.2 -b 100M -t 10 –R ``` ![5-3-6 UDP conn](https://hackmd.io/_uploads/H14PlHXQge.png) > 如果順利連線會顯示上圖,左邊是 Open5GS VM,右邊是 UERANSIM VM ----- ### 問題與討論(三) 1. 請問實測出 TCP 最大的 UL 與 DL 大約是多少? 2. 請問實測出 UDP 最大的 UL 與 DL 大約是多少? 3. 請問 TCP 與 UDP 哪個的吞吐量較大?為什麼? 4. 如果需要選擇可靠度較高的通訊協定,應該選擇 TCP 還是 UDP?為什麼?