# 專題簡報大綱 :::warning [專題影片參考](https://www.youtube.com/watch?v=z-3Gve0HH_0) ::: ## Checklist - 專題簡介 - [ ] 成果預期 - [ ] 實作流程簡介 - 專題報告 - [x] 5G 核心網路簡介 - [ ] 條列並比較目前開放免費使用的核心網路 (與第一點合併) - [ ] 簡述為何選擇 free5gc (與第一點合併) - [x] 介紹 free5gc, UERANSIM, 我們架設的環境 - [ ] 網路架構圖介紹 (和環境合併) - [ ] 實作的流程以及結果 (簡化內容) - [x] 結果分析及驗證假設 (保留) - [x] 紀錄Demo流程 - 用影片或是投影片動畫呈現demo流程 ## 專題簡介 ### 成果預期 1. 架設出 5G 核心網路並了解其運作機制 2. 透過自行撰寫程式以更詳細的了解封包轉送的順序 3. 架設出可以讓手機使用並通訊的核心網路 ### 實作流程簡介 1. 根據 [free5gc](https://www.free5gc.org/installations/stage-3/) 官網的下載流程安裝核心網路 ([專案 github 連結](https://github.com/free5gc/free5gc)) 2. 設定完成核心網路後前往 [UERANSIM github](https://github.com/aligungr/UERANSIM) 取得 UE/RAN 的模擬器 3. 先嘗試在僅有一個 UE 的狀況下對外部網路連線,確認核心網路可以運作 4. 接著嘗試在兩個 UE 的狀況下彼此互相連線及對外部網路連線 5. 比較通過預設網路卡及核心網路的網路延遲影響 6. 嘗試自行撰寫程式讓兩台 UE 可以透過核心網路互相通訊 ## 專題報告 ### 5G 核心網路簡介 #### 核心網路是甚麼? 核心網路是整個網路架構的中心部分,是許多網路元件的集合體,每個元件都有其被賦予的功能,在核心網路中被稱為 Network Function (NF) ,眾多元件的合作與溝通即形成核心網路,用實際一點的例子來舉例,就是電信業者所架設的機房。 ![](https://i.imgur.com/K0FTflB.png) 核心網路可以把 local area networks (LANs) 及 wide-area networks (WANs) 連結起來,目的是傳送大規模、遠距離的資料,並確保其穩定性及效能。 #### 4G 與 5G 核心網路的差異 ##### Reference [Evolution of Core Network(3G vs. 4G vs. 5G)](https://medium.com/@sarpkoksal/core-network-evolution-3g-vs-4g-vs-5g-7738267503c7) [當SDN遇上NFV 虛擬化5G核心網路掀革](https://www.2cm.com.tw/2cm/zh-tw/tech/EE1AD67D7C08456CAE1D35B89F89AACE) 由於 Software-Defined Networking (SDN) 及 Network-Function Virtualization (NFV) 技術的發展, 5G 核心網路比起 4G 核心網路多了不少虛擬化的網路元件 (Network Function , NF) ,這樣帶來的好處有 3 : 1. 減少實體設備所需要的成本 2. 較容易維護,不需要關閉服務就能進行 3. 網路的穩定性更高,若其中一個 NF 故障,只需用其他 VM 去替補即可維持服務。 ``` 5G 的元件將原先 4G 的元件分工的更加細緻 如 4G 的 MME 變為 5G 的 AMF, SMF 4G 的 S-GW 和 P-GW 變為 5G 的 UPF ``` ### 條列並比較目前開放免費使用的核心網路 目前我們知道的開放使用 5G 核心網路有以下幾種 [開放的 5G 核心網路清單](https://open5g.info/core/) #### free5GC 由[國立陽明交通大學通訊服務與軟體研究中心](https://cslab.cs.nycu.edu.tw/index.php/projects/)主持 [此專案](https://github.com/free5gc/free5gc)至今仍然持續維護 此專案歷經三個版本的改良,最新版本中僅包含 5G 核心網路的 NF ,不具有 4G 核心網路的架構。 目前的功能僅限於網路上,不具有通話的功能。 ~~與 UERANSIM (用戶裝置模擬器)配合~~ #### OMEC 由 [Open Networking Fundation](https://opennetworking.org/org-structure/) 主持維護 [此專案](https://github.com/omec-project)目前也持續維護 屬於[ COMAC ](https://opennetworking.org/comac/)底下的其中一個專案 COMAC 架構圖如下 ![COMAC 架構圖](https://opennetworking.org/wp-content/uploads/2019/02/COMAC_graphic.png) 可以看出此專案較為接近商業用的版本,除了核心網路本身之外,還在網路服務的方向做了許多功能,使其更貼近商用的目的。 除了 OMEC 專案以外,其他專案僅部分為開源 project 。 #### open5GS [此專案](https://github.com/open5gs/open5gs)也持續維護 此專案基於 4G 核心網路進行改良,在安裝時可以根據指南選擇安裝的組態,一種是 4G/5G 的核網架構,另一種為純 5G 的架構。 底下的 VoLTE 有提供 call setup 的功能,功能相較於 free5GC 更為完善。 ### 簡述為何選擇 free5gc [科技部新聞---世界第一套符合國際標準的開放原始碼5G核心網路](https://www.most.gov.tw/folksonomy/detail/586f1127-cfd7-4da2-b24d-26197b5e0f34) https://www.p1sec.com/corp/2021/12/31/pentesting-5g-core-networks/ https://read01.com/zh-tw/J843zAK.html#.YonlhKhBxPY | | free5GC | OMEC | Open5GS | |--------| -------- | -------- | -------- | |優點|官方文件整理得較易懂|功能最多最齊全|指南詳盡、補充資料多| | |架設流程最簡單| | 延伸功能多,且有文件教學 | |缺點 |功能相對單調 | 安裝上相對困難|文件有些凌亂| | ||官方文件雜亂無章|| | free5GC | OMEC | Open5GS | | -- | -- | -- | | 台灣研發 | 國際組織 | 韓國研發 | | 全世界第一套完全依照3GPP Release 15國際標準的開放原始碼5G核心網路 | -- | -- | | 安裝指南詳細+影片輔助 | 安裝指南複雜 | 安裝指南詳細但無影片輔助 | | 硬體需求低 | 硬體需求高 | 硬體需求居中 | | -- | 重視商用 | -- | | 功能完善 | 功能較侷限 | 附加功能較多 | free5GC: https://www.free5gc.org/installations/stage-3-free5gc/ OMEC:https://guide.opencord.org/prereqs/hardware.html Open5GS:https://open5gs.org/open5gs/docs/tutorial/01-your-first-lte/ https://opennetworking.org/onf-connect-2019-resources/ 因為我們深知核心網路相關議題之深與其複雜程度,在對核心網路一無所知的前提下,我們決定選擇 free5GC 做為研究的方向,原因無他,只因為其最好上手,較有可能是一介大學生可以涉足的程度。 ### 介紹我們架設的環境 共有三台虛擬機,一台架設核心網路,兩台架設 RAN(GNodeB) 和 UE 的模擬器 - 架設核心網路的機器在底下架構圖中屬於最上面的 Core Network - Core Network中有著許多元件,我們有修改過的僅有 AMF, UPF, SMF - AMF 修改了 N2 的 IP 為 192.168.56.101 (本機 IP ) - SMF 修改了 UPF 的 N3 IP 為 192.168.56.101 - UPF 修改了 GTPU 的 IP 為 192.168.56.101 - 兩台模擬器分別是圖片左下角和右下角的黑框 - 裡面皆有一個 GnB 和 UE 的模擬器 - UE 和 GnB 之間的 tunnel IP 會在和 CN 連線時才決定(藍色字體 IP) - GnB 設定 N2 和 N3 為本機 IP,以及 AMF 的位置為 192.168.56.101 (Core Network IP 位置) ### 網路架構圖介紹 ![架構圖](https://i.imgur.com/UlY8AKh.png) Core Network中有著許多元件,每個元件都有他各自的用途 主要解釋 AMF, SMF, UPF 這三個元件 ### 實作的流程以及結果 我們自己撰寫了一份程式,這隻程式可以讓兩台虛擬機透過核心網路互相傳送訊息和檔案 **必須從 103 開始此程式,這是因為這隻程式的架構依舊是 client-server 架構,我 hardcode 成 103 那端做為第一個 client 端** 這隻程式會創建出兩個 thread ,分別負責接收和傳送訊息。 * 文字傳輸 * 假設在 102 上輸入要傳文字的指令,102 上的傳送訊息端會和 103 的接收訊息端發一則訊息,跟 103 那邊的程式說接下來要準備接收文字。從 103 開始傳文字同理。 * 這段期間內可以不斷傳輸文字,直到傳送端從 user 收到停止傳輸指令 * 當傳送端接收到停止傳輸文字指令時,會傳輸一則訊息讓接收端可以關閉接收文字的功能 * 檔案傳輸 * 設置過程和文字傳輸同理 * 傳送端會等待 user 輸入要傳輸的檔案名字,輸入檔名後會傳給接收端 * 傳送端接著會傳輸檔案內容給接收端,傳送端已經傳送完檔案後接收端會多等一秒後才結束此次傳輸檔案 * 傳送端會繼續等待 user 輸入要傳輸的檔案名字,或是收到停止傳輸指令 * 收到停止傳輸指令後的動作和文字傳輸時相同 ### 結果分析及驗證假設 :::info 介紹 tshark 工具,可指定攔截封包的介面卡及了解封包的在傳輸時的時間戳記變化,並藉由它協助分析封包傳輸順序 ::: #### 工具介紹: tshark tshark 與 wireshark 的功能大致相同,可以藉由特定參數指定我們想要抓取的 interface 或是指定 IP 位置,我們在後續進行實驗時使用到以下參數: * `-i <interface>`: 選定特定的 interface * `-t <format>`: 設定輸出的 timestamp 格式,以下皆使用 `-t a`作為輸入參數,以顯示絕對時間 * `-f <filter>`: 設定攔截封包時的 filter e.g. `-f "src 192.168.56.102"`, `-f "dst 192.168.56.102"` * `-c <count> `: 設定最大攔截封包量,如 `-c 1` 代表僅攔截一個封包 ::: info tshark 是 wireshark 的無 GUI 版本 整體功能和 wireshark 相同,可針對各個 interface 攔截封包 也可在攔截或輸出時設置 filter 抓取特定來源或是特定目的地的封包 ::: * 分析互 ping 和我們自製程式執行時的封包傳輸順序 #### 結果假設 在我們設置核心網路的過程中,會先依序建立 GNB 及 UE ,若只建立 GNB 時先用 `ifconfig` 檢查,會發現 tunnel (`uesimtun0`) 尚未建立, ```shell $ cd ~/UERANSIM $ build/nr-gnb -c config/free5gc-gnb.yaml $ ifconfig ``` ```shell #外網卡 enp0s3: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 │ inet 10.0.2.15 netmask 255.255.255.0 broadcast 10.0.2.255 │ inet6 fe80::a00:27ff:fe71:80f6 prefixlen 64 scopeid 0x20<link> │ ether 08:00:27:71:80:f6 txqueuelen 1000 (Ethernet) │ RX packets 19146 bytes 28323255 (28.3 MB) │ RX errors 0 dropped 0 overruns 0 frame 0 │ TX packets 4281 bytes 330622 (330.6 KB) │ TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 │ │ #內網卡 enp0s8: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 │ inet 192.168.56.103 netmask 255.255.255.0 broadcast 192.168.56.│ 255 │ inet6 fe80::a00:27ff:fea7:2fe8 prefixlen 64 scopeid 0x20<link> │ ether 08:00:27:a7:2f:e8 txqueuelen 1000 (Ethernet) │ RX packets 165647 bytes 11151423 (11.1 MB) │ RX errors 0 dropped 0 overruns 0 frame 0 │ TX packets 541021 bytes 88881165 (88.8 MB) │ TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 │ │ lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536 │ inet 127.0.0.1 netmask 255.0.0.0 │ inet6 ::1 prefixlen 128 scopeid 0x10<host> │ loop txqueuelen 1000 (Local Loopback) │ RX packets 84275 bytes 4604638 (4.6 MB) │ RX errors 0 dropped 0 overruns 0 frame 0 │ TX packets 84275 bytes 4604638 (4.6 MB) │ TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 │ ``` 此時再建立 UE 後,即可在 `ifconfig` 中看到多了一個網路介面 `uesimtun0` 。 ```shell $ cd ~/UERANSIM $ sudo build/nr-ue -c config/free5gc-ue.yaml $ ifconfig ``` ```shell #外網卡 enp0s3: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 │ inet 10.0.2.15 netmask 255.255.255.0 broadcast 10.0.2.255 │ inet6 fe80::a00:27ff:fe71:80f6 prefixlen 64 scopeid 0x20<link> │ ether 08:00:27:71:80:f6 txqueuelen 1000 (Ethernet) │ RX packets 19146 bytes 28323255 (28.3 MB) │ RX errors 0 dropped 0 overruns 0 frame 0 │ TX packets 4281 bytes 330622 (330.6 KB) │ TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 │ │ #內網卡 enp0s8: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 │ inet 192.168.56.103 netmask 255.255.255.0 broadcast 192.168.56.│ 255 │ inet6 fe80::a00:27ff:fea7:2fe8 prefixlen 64 scopeid 0x20<link> │ ether 08:00:27:a7:2f:e8 txqueuelen 1000 (Ethernet) │ RX packets 165647 bytes 11151423 (11.1 MB) │ RX errors 0 dropped 0 overruns 0 frame 0 │ TX packets 541021 bytes 88881165 (88.8 MB) │ TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 │ │ lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536 │ inet 127.0.0.1 netmask 255.0.0.0 │ inet6 ::1 prefixlen 128 scopeid 0x10<host> │ loop txqueuelen 1000 (Local Loopback) │ RX packets 84275 bytes 4604638 (4.6 MB) │ RX errors 0 dropped 0 overruns 0 frame 0 │ TX packets 84275 bytes 4604638 (4.6 MB) │ TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 │ │ #tunnel uesimtun0: flags=369<UP,POINTOPOINT,NOTRAILERS,RUNNING,PROMISC> mtu 1400│ inet 60.60.0.2 netmask 255.255.255.255 destination 60.60.0.2 │ inet6 fe80::1d04:6930:f887:e4fa prefixlen 64 scopeid 0x20<link>│ unspec 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00 txqueuele│ n 500 (UNSPEC) │ RX packets 39 bytes 3640 (3.6 KB) │ RX errors 0 dropped 0 overruns 0 frame 0 │ TX packets 40 bytes 2968 (2.9 KB) │ TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 ``` 因此我們推論 `uesimtun0` 建立在本機(GNB 和 UE 間)而非核心網路所在的虛擬機上。 #### 驗證假設 為了驗證假設,我們先用 tshark 來抓取內網卡的封包。 ```shell #在核網虛擬機的內網卡截取封包 $ sudo tshark -i enp0s8 -t a | grep 60.60.0.2 ``` 輸出結果: ```shell Capturing on 'enp0s8' 67 09:52:47.242659917 60.60.0.1 → 60.60.0.2 GTP <ICMP> 142 Echo (ping) request id=0x0043, seq=1/256, ttl=64 68 09:52:47.242744115 60.60.0.1 → 60.60.0.2 GTP <ICMP> 142 Echo (ping) request id=0x0043, seq=1/256, ttl=63 69 09:52:47.243838476 60.60.0.2 → 60.60.0.1 GTP <ICMP> 142 Echo (ping) reply id=0x0043, seq=1/256, ttl=64 (request in 68) 70 09:52:47.243884277 10.0.2.15 → 60.60.0.2 GTP <ICMP> 170 Redirect (Redirect for host) 71 09:52:47.243903999 60.60.0.2 → 60.60.0.1 GTP <ICMP> 142 Echo (ping) reply id=0x0043, seq=1/256, ttl=63 ``` --- ```shell #在UE/RAN 102的內網卡截取封包 $ sudo tshark -i enp0s8 -t a | grep 60.60.0.2 ``` 輸出結果: ```shell Capturing on 'enp0s8' 47 60 11:22:07.153655482 60.60.0.1 → 60.60.0.2 GTP <ICMP> 142 Echo (ping) request id=0x0043, seq=1/256, ttl=64 61 11:22:07.155416577 60.60.0.2 → 60.60.0.1 GTP <ICMP> 142 Echo (ping) reply id=0x0043, seq=1/256, ttl=63 (request in 60) ``` --- ```shell #在UE/RAN 103的內網卡截取封包 $ sudo tshark -i enp0s8 -t a | grep 60.60.0.2 ``` 輸出結果: ```shell Capturing on 'enp0s8' 37 1 09:52:47.231759080 60.60.0.1 → 60.60.0.2 GTP <ICMP> 142 Echo (ping) request id=0x0043, seq=1/256, ttl=63 2 09:52:47.232191412 60.60.0.2 → 60.60.0.1 GTP <ICMP> 142 Echo (ping) reply id=0x0043, seq=1/256, ttl=64 (request in 1) 3 09:52:47.232849427 10.0.2.15 → 60.60.0.2 GTP <ICMP> 170 Redirect (Redirect for host) ``` --- ### Note DNS outside Core Network `-`: dash `_`: underscore ` `: space `/`: slash `\`: backslash --- ## 0525 - [ ] 架構圖大小重拉 - [ ] 簡介AMF, SMF, UPF - [x] 簡易網路架構加註全名 - [x] CN圖片 - [x] 表格順序調換 - [x] Terminal加註 ## tmux basic hotkeys [link](https://blog.gtwang.org/linux/linux-tmux-terminal-multiplexer-tutorial/) | Hotkey | usage | | --- | ---- | | `Ctrl+b d` | detach tmux | | `Ctrl+b c` | create new window | | `Ctrl+b %` | Split pane horizontally | | `Ctrl+b "` | Split pane vertically | | `Ctrl+b x` | Close selected pane | | `Ctrl+b w` | Show window list | | `Ctrl+b &` | Close selected window |