聲明

本報告內容僅供學術研究與教學用途,嚴禁用於任何其他目的。未經本人或相關權利人明確書面許可,不得以任何形式轉載、引用、公開或用於商業用途。

任何違反上述聲明的行為,本人將保留追究法律責任的權利。

從零開始的5G核網架設_free5gc

本文架設的基礎網路環境架構如下圖
會架設兩台虛擬機,分別安裝free5gcUERANSIM
free5gc版本: v3.4.2
UERANSIM版本:

dwdweed1

free5gc官方建置文件

Ubuntu 環境建置

1. VirtualBox 下載&安裝

官方下載網站

a. 選擇安裝包下載

選自己電腦OS的版本下載
image

b. 安裝

狂按下一步直到跳出安裝完成
image

2. Ubuntu 下載&安裝

a. 下載映像檔

官方下載網站
這邊下載的版本是Ubuntu 22.04 Server

b. 新增虛擬機

打開VirtualBox,選新增
image
填入虛擬機名稱free5gc,選擇剛剛下載好的ISO映像檔案
image
設定使用者名稱和密碼(因為之後會很常用到,推薦可以設短一點或自己常用的)
image
設定記憶體和處理器(建議記憶體要有4096(4GB),處理器2CPUs,這樣比較夠用。)
image
虛擬硬碟的大小建議要到50GB,預先配置完整大小不須打勾
image
最後檢查一下,沒問題就按完成。
image

c. Ubuntu 系統設定

他會跑一下然後就進入安裝步驟,選English,然後Enter
image
continue without updating
image
一路按Done直到…這邊等他跑完再按Done
image
繼續按Done…直到…
image
continue勇敢按下去
image
這邊設定跟剛剛填的一樣,繼續按Done
image
這邊的install OpenSSH server,這邊打勾(按Enter)
image
之後就Done到他跑完安裝
image
最後選Reboot Now,它會關機、重新啟動
image
重啟之後輸入帳密就會進到bash的頁面了
(輸入密碼的時候會看不到正在輸入的內容,這是正常的)

image

3. Ubuntu 網卡設定

a. ifconfig

當你想用ifconfig查看網卡設定,但會發現還沒有安裝
image
照著她說的,輸入:

1
sudo apt install net-tools

裝好了之後再次ifconfig就可以看到網路設定
image
現在只有一張網卡enp0s3,這是預設的網卡,它目前的設定是NAT。
若需要進行SSH連線,我們需要一張特定網段的Host only網卡,因此我們需要新增一張。

為了方便之後的操作,我們需要讓他多一張網卡,用來SSH。

b. 新增網路卡

先關機
image
到VirtualBox,點虛擬機,選設定
image
啟用第二張網路卡
image
選擇僅限主機(host only),按下確定之後重開機。
image
ip addr會看到多了一張網卡,但她還沒設定
image

c. 設定靜態IP

編輯/etc/netplan/00-installer-config.ymal

1
sudo nano /etc/netplan/00-installer-config.ymal

00-installer-config.ymal應該會長得像這樣
image
把它改成如下:(定義enp0s8的IP)

1
2
3
4
5
6
7
8
network:
ethernets:
enp0s3:
dhcp4: true
enp0s8:
dhcp4: false
addresses: [192.168.56.101/24]
version: 2

ctrl+S存檔、用ctrl+X退出
image
讓系統run這個設定檔

1
sudo netplan apply

再次ifconfig看看有沒有修改成功
image
最後ping 192.168.56.1確定連線正常
image

4. MobaXterm 下載&使用教學

官方下載連結
下載下來解壓縮後點msi檔安裝
image
※ 可以先練習一下使用方式

  • 點擊左側創建好的session連線,就是在對應的VM開一個Terminal
  • 可以設定用滑鼠中鍵貼上複製的指令
  • 可以輸入指令的開頭後按tab快速輸入,例如ifc+tab=ifconfig
  • 指令可以一段一起貼上,他會一行一行運行

5. 再製一台VM for UERANSIM

a. 再製虛擬機

再開一台VM給UERANSIM
在VirtualBox對free5gc虛擬機(要先關機) 右鍵–>再製
image
設定名字,選擇為所有網路卡產生新的MAC位置
image
選擇完整再製
image
等他跑完…
image
就會看到多了一台虛擬機
image

b. 設定靜態IP

編輯/etc/netplan/00-installer-config.ymal

1
sudo nano /etc/netplan/00-installer-config.ymal

00-installer-config.ymal應該會長得像這樣
image

把它改成如下:(定義enp0s8的IP)

1
2
3
4
5
6
7
8
network:
ethernets:
enp0s3:
dhcp4: true
enp0s8:
dhcp4: false
addresses: [192.168.56.102/24]
version: 2

ctrl+Sctrl+X存檔後退出
image
讓系統run這個設定檔

1
sudo netplan apply

再次ifconfig看看有沒有修改成功
image

最後ping 192.168.56.1確定連線正常
image

free5gc 環境建置

這邊安裝的版本是v3.4.2

1. SSH連線與改VM名稱

a. HOW TO SSH?

在MobaXterm新增一個session
image
選ssh,填入IP和登入虛擬機用的使用者名稱
image
接受、打勾、輸你設定的登入密碼
image
SSH連線成功
image
可以點主頁–>剛剛開的session–>rename改MobaXterm看到的虛擬機名字
image

b. 改VM名稱

這邊改的是別的主機看這台free5gc的VM時會看到的名稱
像是我們從Mobxterm連線的時候會看到的名字
到輸入指令的地方(terminal),輸入:

1
sudo nano /etc/hostname

改成free5gc之後ctrl+Sctrl+X
image
再來,輸入

1
sudo nano /etc/hosts

一樣改成free5gc之後ctrl+Sctrl+X
image
重開虛擬機

1
sudo reboot

等他重開完,在MobaXterm按R重新連線,就會看到他變名字了
image

2. 安裝 GO

先用go version查看go版本。
image
他說我們還沒有安裝GO,那就先裝一下
下載 GO:

1
2
wget https://dl.google.com/go/go1.21.8.linux-amd64.tar.gz
sudo tar -C /usr/local -zxvf go1.21.8.linux-amd64.tar.gz

安裝 GO:

1
2
3
4
5
6
7
8
cd ~
mkdir -p ~/go/{bin,pkg,src}
# The following assume that your shell is bash:
echo 'export GOPATH=$HOME/go' >> ~/.bashrc
echo 'export GOROOT=/usr/local/go' >> ~/.bashrc
echo 'export PATH=$PATH:$GOPATH/bin:$GOROOT/bin' >> ~/.bashrc
echo 'export GO111MODULE=auto' >> ~/.bashrc
source ~/.bashrc

看一下有沒有安裝成功

1
go version

image

3. 安裝Control-plane (MongoDB)

1
2
3
4
5
6
7
8
9
10
11
sudo apt -y update
sudo apt -y install wget git

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

# Ubuntu 22.04 (Jammy)
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

完成之後啟動測試

1
2
sudo systemctl start mongod
sudo systemctl status mongod

image
測試完ctrl+c跳出

4. 安裝User-plane

1
2
sudo apt -y update
sudo apt -y install git gcc g++ cmake autoconf libtool pkg-config libmnl-dev libyaml-dev

正常的結果會像這樣,跑很長很久是正常的
image
中間會跳這個,就Enter
image

5. Linux Host Network Settings

這些設定是為了確保 Free5GC 正常運作。IP 轉發允許流量在網路介面之間傳輸,NAT 將內部流量映射到外部網路,MSS 調整確保數據傳輸穩定,關閉防火牆避免阻擋 free5gc 的通訊。

1
2
3
4
5
sudo sysctl -w net.ipv4.ip_forward=1
sudo iptables -t nat -A POSTROUTING -o enp0s3 -j MASQUERADE
sudo iptables -A FORWARD -p tcp -m tcp --tcp-flags SYN,RST SYN -j TCPMSS --set-mss 1400
sudo systemctl stop ufw
sudo systemctl disable ufw # prevents the firewall to wake up after a OS reboot

image

6. 安裝5GC核網(Install Control Plane Elements)

1
2
3
4
5
6
cd ~
git clone --recursive -b v3.4.2 -j `nproc` https://github.com/free5gc/free5gc.git
cd free5gc

cd ~/free5gc
make

也會要跑有點久,希望大家網速夠快
看到她開始跑go: 就是對了
image

7. Install User Plane Function (UPF)

1
2
3
4
git clone -b v0.8.10 https://github.com/free5gc/gtp5g.git
cd gtp5g
make
sudo make install

裝完後測試lsmod | grep gtp
image

8. Install WebConsole

a. 先裝nodejs

1
2
3
4
curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash - 
sudo apt update
sudo apt install -y nodejs
corepack enable # setup yarn automatically

image
如果看到這個一樣Enter,如果有卡住可以ctrl+c,之後再重新輸一次指令,直到他裝好
image

b. 再裝 WebConsole

1
2
cd ~/free5gc
make webconsole

如果有問題跳出就按Y
image

9. 核網運作測試

1
2
cd ~/free5gc
./test.sh TestRegistration

等他跑完,看到PASS就是ok了
image

UERANSIM 環境建置

1. 設定UERANSIM 的 VM

a. 使用MobaXterm SSH 連線UERANSIM

選Session –> SSH –> 填入IP(192.168.56.102) –> 填入登入用的使用者帳號
image
選Accept
image
填完密碼之後,就連上了!

一樣可以在MobaXterm改虛擬機的名字,這樣連線的時候比較方便
image
改這邊的內容就可以了
image

b. 改虛擬機的名稱

這邊改的是別的主機看這台UERANSIM的VM時會看到的名稱
像是我們從Mobxterm連線的時候會看到的名字
到輸入指令的地方(terminal),輸入:

1
sudo nano /etc/hostname

改成UERANSIM之後ctrl+Sctrl+X
image

再來,輸入

1
sudo nano /etc/hosts

一樣改成UERANSIM之後ctrl+Sctrl+X
image

重開虛擬機

1
sudo reboot

等他重開完,在MobaXterm按R重新連線,就會看到他變名字了
image

2. 安裝UERANSIM

a. 下載

1
2
3
4
5
cd ~
git clone https://github.com/aligungr/UERANSIM
cd UERANSIM
# if using free5GC v3.4.0 or above
git checkout e4c492d

image

b. 更新系統環境

1
2
sudo apt update
sudo apt upgrade

如果有問題就按Y
如果跳了這個,就tab再選ok(Enter)就好
image

c. 安裝一些工具

1
2
3
4
5
sudo apt install make
sudo apt install g++
sudo apt install libsctp-dev lksctp-tools
sudo apt install iproute2
sudo snap install cmake --classic

如果有問題就按Y
如果跳了這個,就tab再選ok(Enter)就好
image

d. make UERANSIM

1
2
cd ~/UERANSIM
make

看到他開始跑這個,就是對了,放他跑完
image
看到這樣就是安裝成功了
image

核網連線設定

1. 建立 nettwork_setting.sh

1
nano network_setting.sh
1
2
3
4
5
sudo sysctl -w net.ipv4.ip_forward=1
sudo iptables -t nat -A POSTROUTING -o enp0s3 -j MASQUERADE
sudo systemctl stop ufw

sudo iptables -I FORWARD 1 -j ACCEPT
1
2
chmod +x network_setting.sh
sudo ./network_setting.sh

2. 設定 Websonsole

a. 事前確保

先確定一下gtp5g有沒有在運行

1
lsmod | grep gtp

如果沒有出現像這樣的
image
就重裝UPF

也確保一下mongod有在運行

1
2
sudo systemctl start mongod
sudo systemctl status mongod

image

b. 在 free5gc run webConsole

1
2
cd ~/free5gc/webconsole
./bin/webconsole

他第一次會跑久一點,可能會跳Error,但你要給他信心,他最後會開好的
看到這個就是ok,就可以進行下一步
image
(在他沒有開好之前ctrl+c的話會卡死,只能直接重開機)

c. 在瀏覽器連線

1
http://192.168.56.101:5000/

image
帳號: admin
密碼: free5gc

d. Create a new Subscriber

選左側 menu 中的 SUBSCRIBERS,然後 CREATE
image
這裡的數值我們是參考~/UERANSIM/config/free5gc-ue.yaml
但我們需要做的只有把 Operator Code Type 改成 OP
image
直接拉到最下面,CREATE
image
最後會像這樣
image
然後就可以ctrl+c把webconsole關掉了
image

3. 設定 free5gc/config

free5gc的Terminal

a. amfcfg.yaml

1
nano ~/free5gc/config/amfcfg.yaml

這邊改成free5gc的IP,這裡設定的是N2通道的IP
image
改完之後ctrl+s ctrl+x 存檔關掉

b. smfcfg.yaml

1
nano ~/free5gc/config/smfcfg.yaml

往下滑到底,在上面一點的地方,把這裡的IP改成free5gc的,這裡設定的是N3通道的IP
image
改完之後ctrl+s ctrl+x 存檔關掉

c. upfcfg.yaml

這裡設定的是N3通道的IP

1
nano ~/free5gc/config/upfcfg.yaml

這邊改成free5gc的IP
image
改完之後ctrl+s ctrl+x 存檔關掉

4. 設定 UERANSIM/config

在UERANSIM的Terminal

a. gnb.yaml

ngapIpgtpIp改成UERANSIM的IP(192.168.56.102)
amfConfigs改成free5gc的IP(192.168.56.101)

1
nano ~/UERANSIM/config/free5gc-gnb.yaml

image
改完之後ctrl+s ctrl+x 存檔關掉

b. ue.yaml

1
nano ~/UERANSIM/config/free5gc-ue.yaml

這邊改成OP
image
改完之後ctrl+s ctrl+x 存檔關掉

核網 啟動!

1. network_setting

free5gc 的 Terminal

1
sudo ./network_setting.sh

image

2. free5gc

free5gc 的 Terminal

1
2
cd ~/free5gc
./run.sh

image

3. gNodeB

UERANSIM 的Terminal 1

1
2
cd ~/UERANSIM
build/nr-gnb -c config/free5gc-gnb.yaml

image
看到這樣,就代表gNodeB成功連線核網

4. UE

UERANSIM 的Terminal 2(再開一個Terminal)

1
2
cd ~/UERANSIM
sudo build/nr-ue -c config/free5gc-ue.yaml

image
看到這樣,就代表UE成功連線gNodeB

5. Test

a. ifconfig

UERANSIM 的Terminal 3(再開一個Terminal)
ifconfig會看到多了一張叫做uesimtun0的網卡,IP是10.60.0.1
image

b. ping google

用UE連接核網的網卡ping google,可以ping到代表對外網連線正常UPF正常運作

1
ping google.com -I uesimtun0

image

恭喜你,最基礎的核網就算是架設完成了。🎉

6. 關閉free5gc

對著運行中的free5gc Terminal ctrl+c即可中斷
中斷後輸入指令,確保有關乾淨

1
./force_kill.sh

UERANSIM的gNodeB和UE都可以用ctrl+c直接關閉

核網連線測試與觀察

本測試一共會開啟6個Terminal,其中free5gc有2個,UERANSIM有4個
showvm

1. Wireshark 建置

free5gc和UERANSIM都要執行以下步驟,我們需要在兩台虛擬機上都安裝Wireshark

a. 在虛擬機安裝wirshark

1
sudo apt install wireshark

Y
image
你是否要允許非超級用戶(non-superusers)捕捉封包。一般建議是選擇 Yes,這樣就不需要以 root 權限來運行 Wireshark
image

b. 權限設定

1
2
3
4
sudo dpkg-reconfigure wireshark-common
sudo chgrp wireshark /usr/bin/dumpcap
sudo chmod 4755 /usr/bin/dumpcap
sudo gpasswd -a $(whoami) wireshark

YES
image

c. 使用方式

開啟Wireshark看看

1
wireshark

點兩下any
upload_7fc0e7f0c6d03286091adfdc9bf208dc
就可以開始監控全部網卡的即時流量
image
停止鍵可以暫停監控
image
綠色魚鰭可以重開新的監控
image
如果遇到這個視窗,推薦選Continue without Saving,因為目前沒有存封包的必要性,不用讓它占空間
image
可以善用filter的功能來過濾出自己想找的封包
image

d. 測試前置作業

在free5gc 和 UERANSIM 都用一個 Terminal 開啟 Wireshark
image
any開始錄製

2. 啟動核網

依照上面核網 啟動!的步驟,把free5gc和UERANSIM開起來
簡單版步驟如下:

a. free5gc Terminal1:

1
2
3
4
5
cd ~
./network_setting.sh

cd free5gc
./run.sh

b. UERANSIM Terminal1:

1
2
cd ~/UERANSIM
build/nr-gnb -c config/free5gc-gnb.yaml

c. UERANSIM Terminal2:

1
2
cd ~/UERANSIM
sudo build/nr-ue -c config/free5gc-ue.yaml

3. 連線封包觀察

把兩個Wireshark停止,filter輸入ngap
image

a. free5gc

image
可以看到連線時的NGAP封包

b. UERANSIM

image
可以看到連線時的NGAP封包

4. Ping 封包觀察

接下來我們要觀察ping時的icmp封包

a. Wireshark filter = icmp

在filter輸入icmp,並啟動錄製
image

b. ping

在UERANSIM 的 Terminal4輸入:

1
ping google.com -I uesimtun0

image

c. free5gc

即可在free5gc的Wireshark觀察到GTP封包和ICMP封包
image

d. UERANSIM

也可以在UERANSIM的Wireshark觀察到GTP封包和ICMP封包
image