Open5GS 5GCとUERANSIM UE/RANによるシミュレーション携帯網

UERANSIM(5G UEとRAN(gNodeB)シミュレータ)は、2020年11月17日版からPDUセッションタイプにIPv4をサポートし、Data Plane機能に対応しました。そこで、U-PlaneのDN(Data Network)を試すため、5GC携帯網のシミュレーション環境を構築しました。登場する携帯網の構成要素は全てOSS(オープンソース)であり、紹介するシミュレーションの構成例はシンプルです。ここでは、その全体像と設定ファイルについて簡単に説明します。
なお、5GCのコア網に登場する各NF(Network Function)の役割やインターフェースについて概ね知っていることを期待して書いており、これらの説明は省略します。

---

<h2 id="toc">目次</h2>

- [Open5GS 5GCのシミュレーション携帯網の概要](#open5gs-5gcのシミュレーション携帯網の概要)
- [Open5GS 5GCとUERANSIM UE/RANの設定ファイルの変更点](#open5gs-5gcとueransim-ueranの設定ファイルの変更点)
    - [Open5GS 5GC C-Planeの設定ファイルの変更点](#open5gs-5gc-c-planeの設定ファイルの変更点)
    - [Open5GS 5GC U-Plane1の設定ファイルの変更点](#open5gs-5gc-u-plane1の設定ファイルの変更点)
    - [Open5GS 5GC U-Plane2の設定ファイルの変更点](#open5gs-5gc-u-plane2の設定ファイルの変更点)
    - [UERANSIM UE/RANの設定ファイルの変更点](#ueransim-ueranの設定ファイルの変更点)
        - [RANの設定ファイルの変更点](#ranの設定ファイルの変更点)
        - [UE0(IMSI-001010000000000)の設定ファイルの変更点](#ue0imsi-001010000000000の設定ファイルの変更点)
        - [UE1(IMSI-001010000000001)の設定ファイルの変更点](#ue1imsi-001010000000001の設定ファイルの変更点)
        - [UE2(IMSI-001010000000002)の設定ファイルの変更点](#ue2imsi-001010000000002の設定ファイルの変更点)
        - [UE3(IMSI-001010000000003)の設定ファイルの変更点](#ue3imsi-001010000000003の設定ファイルの変更点)
        - [UE4(IMSI-001010000000004)の設定ファイルの変更点](#ue4imsi-001010000000004の設定ファイルの変更点)
- [Open5GS 5GCとUERANSIM UE/RANのネットワーク設定](#open5gs-5gcとueransim-ueranのネットワーク設定)
    - [Open5GS 5GC U-Plane1のネットワーク設定](#open5gs-5gc-u-plane1のネットワーク設定)
    - [Open5GS 5GC U-Plane2のネットワーク設定](#open5gs-5gc-u-plane2のネットワーク設定)
- [Open5GSとUERANSIMのビルド](#open5gsとueransimのビルド)
- [Open5GS 5GCとUERANSIM UE/RANを実行](#open5gs-5gcとueransim-ueranを実行)
    - [Open5GS 5GC C-Planeを実行](#open5gs-5gc-c-planeを実行)
    - [Open5GS 5GC U-Plane1とU-Plane2を実行](#open5gs-5gc-u-plane1とu-plane2を実行)
    - [UERANSIMを実行](#ueransimを実行)
        - [gNBを起動](#gnbを起動)
        - [UE(UE0)を起動](#ueue0を起動)
- [google.comにpingする](#googlecomにpingする)
    - [DN=10.45.0.0/16を経由する場合](#dn10450016を経由する場合)
- [最後に](#最後に)
- [主な変更履歴](#主な変更履歴)

---

## Open5GS 5GCのシミュレーション携帯網の概要

今回、DNN毎に異なるDNの端点で任意のパケットを流すことを目的に、5GC携帯網をシミュレーション用に構築しました。DNを通してインターネットと通信可能です。
このシミュレーション環境は以下の条件を満たす最小構成になります。

- C-Planeは複数のU-Planeと連携する。
- U-Planeは複数のDNを管理する。
- 複数のUEは同じDNに接続する。

構築したシミュレーション環境は以下の通りです。
<img width="800" alt="network-overview.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/457466/48ef09d6-a145-5ed8-01de-9cd6ab1fa50f.png">

5GCとUE/RANに使用しているOSSは以下の通りです。

- 5GC - Open5GS v2.4.7 - https://github.com/open5gs/open5gs  
- UE/RAN - UERANSIM v3.2.6 - https://github.com/aligungr/UERANSIM

各VMは以下の通りです。

| VM # | SW & Role | IP address | OS | Memory (Min) | HDD (Min) |
| --- | --- | --- | --- | --- | --- |
| VM1 | Open5GS 5GC C-Plane | 192.168.0.111/24 | Ubuntu 20.04 | 1GB | 20GB |
| VM2 | Open5GS 5GC U-Plane1  | 192.168.0.112/24 | Ubuntu 20.04 | 1GB | 20GB |
| VM3 | Open5GS 5GC U-Plane2  | 192.168.0.113/24 | Ubuntu 20.04 | 1GB | 20GB |
| VM4 | UERANSIM RAN (gNodeB) | 192.168.0.131/24 | Ubuntu 20.04 | 1GB | 10GB |
| VM5 | UERANSIM UE | 192.168.0.132/24 | Ubuntu 20.04 | 1GB | 10GB |

加入者情報は以下の通りです。(その他の項目はデフォルト値)
**注意。UERANSIMのUEの設定に合わせて、OPあるいはOPcを選択してください。**

| UE # | IMSI | DNN | OP/OPc |
| --- | --- | --- | --- |
| UE0 | 001010000000000 | internet | OPc |
| UE1 | 001010000000001 | internet2 | OPc |
| UE2 | 001010000000002 | internet2 | OPc |
| UE3 | 001010000000003 | ims | OPc |
| UE4 | 001010000000004 | ims | OPc |

これらの情報の登録には、Open5GSが提供するWebUIを使用しました。なお、3GPP認証とキー生成機能(MILENAGE)の試験データとして、[3GPP TS 35.208](https://www.3gpp.org/DynaReport/35208.htm) "4.3 Test Sets"が公開されています。

各DNは以下の通りです。

| DN | TUNnel interface of DN | DNN | TUNnel interface of UE | U-Plane # |
| --- | --- | --- | --- | --- |
| 10.45.0.0/16 | ogstun | internet | uesimtun0 | U-Plane1 |
| 10.46.0.0/16 | ogstun2 | internet2 | uesimtun1, uesimtun2 | U-Plane1 |
| 10.47.0.0/16 | ogstun3 | ims | uesimtun3, uesimtun4 | U-Plane2 |

追加情報。Open5GS 5GC U-PlaneはRaspberry Pi 4 Model Bで動作しました。OSには[Ubuntu 20.04 (64bit) for Raspberry Pi 4](https://ubuntu.com/download/raspberry-pi)を使用しています。これにより、コンパクトなU-Planeをエッジに配置し、DNの端点として簡易に使用することができます。なお、この場合のDNの通信性能については確認していません。

## Open5GS 5GCとUERANSIM UE/RANの設定ファイルの変更点

Open5GSとUERANSIMのビルド方法は以下を参照して下さい。

- Open5GS v2.4.7 - https://open5gs.org/open5gs/docs/guide/02-building-open5gs-from-sources/
- UERANSIM v3.2.6 - https://github.com/aligungr/UERANSIM/wiki/Installation

### Open5GS 5GC C-Planeの設定ファイルの変更点

Open5GSでは、PFCPの接続先としてUPFを選択するロジックに使用可能なパラメータは以下の通りです。PFCP(Packet Forwarding Control Protocol)とは、5GCでCU分離のために導入されたプロトコルです。

- DNN
- TAC (Tracking Area Code)
- nr_CellID

なお、TACとnr_CellIDはRANの設定項目です。話を簡単にするために、今回はDNNのみ使用しています。Open5GSでUPFを選択するロジックについては、[こちら](https://github.com/open5gs/open5gs/pull/560#issue-483001043)を参照して下さい。

- `open5gs/install/etc/open5gs/amf.yaml`

```diff
--- amf.yaml.orig       2022-06-04 19:47:05.006151198 +0900
+++ amf.yaml    2022-06-05 21:34:01.935500250 +0900
@@ -229,23 +229,23 @@
       - addr: 127.0.0.5
         port: 7777
     ngap:
-      - addr: 127.0.0.5
+      - addr: 192.168.0.111
     guami:
       - plmn_id:
-          mcc: 901
-          mnc: 70
+          mcc: 001
+          mnc: 01
         amf_id:
           region: 2
           set: 1
     tai:
       - plmn_id:
-          mcc: 901
-          mnc: 70
+          mcc: 001
+          mnc: 01
         tac: 1
     plmn_support:
       - plmn_id:
-          mcc: 901
-          mnc: 70
+          mcc: 001
+          mnc: 01
         s_nssai:
           - sst: 1
     security:
```

- `open5gs/install/etc/open5gs/smf.yaml`

```diff
--- smf.yaml.orig       2022-06-04 19:47:04.977151107 +0900
+++ smf.yaml    2022-06-05 21:36:29.499567538 +0900
@@ -381,17 +381,18 @@
       - addr: 127.0.0.4
         port: 7777
     pfcp:
-      - addr: 127.0.0.4
-      - addr: ::1
+      - addr: 192.168.0.111
     gtpc:
       - addr: 127.0.0.4
-      - addr: ::1
     gtpu:
-      - addr: 127.0.0.4
-      - addr: ::1
+      - addr: 192.168.0.111
     subnet:
       - addr: 10.45.0.1/16
-      - addr: 2001:db8:cafe::1/48
+        dnn: internet
+      - addr: 10.46.0.1/16
+        dnn: internet2
+      - addr: 10.47.0.1/16
+        dnn: ims
     dns:
       - 8.8.8.8
       - 8.8.4.4
@@ -501,7 +502,10 @@
 #
 upf:
     pfcp:
-      - addr: 127.0.0.7
+      - addr: 192.168.0.112
+        dnn: [internet, internet2]
+      - addr: 192.168.0.113
+        dnn: ims
 
 #
 # parameter:
```

### Open5GS 5GC U-Plane1の設定ファイルの変更点

- `open5gs/install/etc/open5gs/upf.yaml`

```diff
--- upf.yaml.orig       2022-04-05 20:55:38.304953273 +0900
+++ upf.yaml    2022-06-05 21:39:07.009058283 +0900
@@ -166,12 +166,16 @@
 #
 upf:
     pfcp:
-      - addr: 127.0.0.7
+      - addr: 192.168.0.112
     gtpu:
-      - addr: 127.0.0.7
+      - addr: 192.168.0.112
     subnet:
       - addr: 10.45.0.1/16
-      - addr: 2001:db8:cafe::1/48
+        dnn: internet
+        dev: ogstun
+      - addr: 10.46.0.1/16
+        dnn: internet2
+        dev: ogstun2
 
 #
 # smf:
```

### Open5GS 5GC U-Plane2の設定ファイルの変更点

- `open5gs/install/etc/open5gs/upf.yaml`

```diff
--- upf.yaml.orig       2022-04-05 20:56:57.984902990 +0900
+++ upf.yaml    2022-06-05 22:23:35.800331893 +0900
@@ -166,12 +166,13 @@
 #
 upf:
     pfcp:
-      - addr: 127.0.0.7
+      - addr: 192.168.0.113
     gtpu:
-      - addr: 127.0.0.7
+      - addr: 192.168.0.113
     subnet:
-      - addr: 10.45.0.1/16
-      - addr: 2001:db8:cafe::1/48
+      - addr: 10.47.0.1/16
+        dnn: ims
+        dev: ogstun3
 
 #
 # smf:
```

### UERANSIM UE/RANの設定ファイルの変更点

#### RANの設定ファイルの変更点

- `UERANSIM/config/open5gs-gnb.yaml`

```diff
--- open5gs-gnb.yaml.orig       2021-04-20 11:07:30.000000000 +0000
+++ open5gs-gnb.yaml    2021-08-29 11:53:34.170068022 +0000
@@ -1,17 +1,17 @@
-mcc: '901'          # Mobile Country Code value
-mnc: '70'           # Mobile Network Code value (2 or 3 digits)
+mcc: '001'          # Mobile Country Code value
+mnc: '01'           # Mobile Network Code value (2 or 3 digits)
 
 nci: '0x000000010'  # NR Cell Identity (36-bit)
 idLength: 32        # NR gNB ID length in bits [22...32]
 tac: 1              # Tracking Area Code
 
-linkIp: 127.0.0.1   # gNB's local IP address for Radio Link Simulation (Usually same with local IP)
-ngapIp: 127.0.0.1   # gNB's local IP address for N2 Interface (Usually same with local IP)
-gtpIp: 127.0.0.1    # gNB's local IP address for N3 Interface (Usually same with local IP)
+linkIp: 192.168.0.131   # gNB's local IP address for Radio Link Simulation (Usually same with local IP)
+ngapIp: 192.168.0.131   # gNB's local IP address for N2 Interface (Usually same with local IP)
+gtpIp: 192.168.0.131    # gNB's local IP address for N3 Interface (Usually same with local IP)
 
 # List of AMF address information
 amfConfigs:
-  - address: 127.0.0.5
+  - address: 192.168.0.111
     port: 38412
 
 # List of supported S-NSSAIs by this gNB
```

#### UE0(IMSI-001010000000000)の設定ファイルの変更点

最初に、`open5gs-ue.yaml`から`open5gs-ue0.yaml`にコピーを作成します。

```
# cd UERANSIM/config
# cp open5gs-ue.yaml open5gs-ue0.yaml
```

次に、`open5gs-ue0.yaml`を編集します。

- `UERANSIM/config/open5gs-ue0.yaml`

```diff
--- open5gs-ue.yaml.orig        2021-09-18 21:11:52.000000000 +0900
+++ open5gs-ue0.yaml    2022-06-05 22:07:37.742307968 +0900
@@ -1,9 +1,9 @@
 # IMSI number of the UE. IMSI = [MCC|MNC|MSISDN] (In total 15 digits)
-supi: 'imsi-901700000000001'
+supi: 'imsi-001010000000000'
 # Mobile Country Code value of HPLMN
-mcc: '901'
+mcc: '001'
 # Mobile Network Code value of HPLMN (2 or 3 digits)
-mnc: '70'
+mnc: '01'
 
 # Permanent subscription key
 key: '465B5CE8B199B49FAA5F0A2EE238A6BC'
@@ -20,7 +20,7 @@
 
 # List of gNB IP addresses for Radio Link Simulation
 gnbSearchList:
-  - 127.0.0.1
+  - 192.168.0.131
 
 # UAC Access Identities Configuration
 uacAic:
```

#### UE1(IMSI-001010000000001)の設定ファイルの変更点

最初に、`open5gs-ue.yaml`から`open5gs-ue1.yaml`にコピーを作成します。

```
# cd UERANSIM/config
# cp open5gs-ue.yaml open5gs-ue1.yaml
```

次に、`open5gs-ue1.yaml`を編集します。

- `UERANSIM/config/open5gs-ue1.yaml`

```diff
--- open5gs-ue.yaml.orig        2021-09-18 21:11:52.000000000 +0900
+++ open5gs-ue1.yaml    2022-06-05 22:08:51.685605817 +0900
@@ -1,9 +1,9 @@
 # IMSI number of the UE. IMSI = [MCC|MNC|MSISDN] (In total 15 digits)
-supi: 'imsi-901700000000001'
+supi: 'imsi-001010000000001'
 # Mobile Country Code value of HPLMN
-mcc: '901'
+mcc: '001'
 # Mobile Network Code value of HPLMN (2 or 3 digits)
-mnc: '70'
+mnc: '01'
 
 # Permanent subscription key
 key: '465B5CE8B199B49FAA5F0A2EE238A6BC'
@@ -20,7 +20,7 @@
 
 # List of gNB IP addresses for Radio Link Simulation
 gnbSearchList:
-  - 127.0.0.1
+  - 192.168.0.131
 
 # UAC Access Identities Configuration
 uacAic:
@@ -39,7 +39,7 @@
 # Initial PDU sessions to be established
 sessions:
   - type: 'IPv4'
-    apn: 'internet'
+    apn: 'internet2'
     slice:
       sst: 1
 
```

#### UE2(IMSI-001010000000002)の設定ファイルの変更点

最初に、`open5gs-ue.yaml`から`open5gs-ue2.yaml`にコピーを作成します。

```
# cd UERANSIM/config
# cp open5gs-ue.yaml open5gs-ue2.yaml
```

次に、`open5gs-ue2.yaml`を編集します。

- `UERANSIM/config/open5gs-ue2.yaml`

```diff
--- open5gs-ue.yaml.orig        2021-09-18 21:11:52.000000000 +0900
+++ open5gs-ue2.yaml    2022-06-05 22:09:58.470120243 +0900
@@ -1,9 +1,9 @@
 # IMSI number of the UE. IMSI = [MCC|MNC|MSISDN] (In total 15 digits)
-supi: 'imsi-901700000000001'
+supi: 'imsi-001010000000002'
 # Mobile Country Code value of HPLMN
-mcc: '901'
+mcc: '001'
 # Mobile Network Code value of HPLMN (2 or 3 digits)
-mnc: '70'
+mnc: '01'
 
 # Permanent subscription key
 key: '465B5CE8B199B49FAA5F0A2EE238A6BC'
@@ -20,7 +20,7 @@
 
 # List of gNB IP addresses for Radio Link Simulation
 gnbSearchList:
-  - 127.0.0.1
+  - 192.168.0.131
 
 # UAC Access Identities Configuration
 uacAic:
@@ -39,7 +39,7 @@
 # Initial PDU sessions to be established
 sessions:
   - type: 'IPv4'
-    apn: 'internet'
+    apn: 'internet2'
     slice:
       sst: 1
 
```

#### UE3(IMSI-001010000000003)の設定ファイルの変更点

最初に、`open5gs-ue.yaml`から`open5gs-ue3.yaml`にコピーを作成します。

```
# cd UERANSIM/config
# cp open5gs-ue.yaml open5gs-ue3.yaml
```

次に、`open5gs-ue3.yaml`を編集します。

- `UERANSIM/config/open5gs-ue3.yaml`

```diff
--- open5gs-ue.yaml.orig        2021-09-18 21:11:52.000000000 +0900
+++ open5gs-ue3.yaml    2022-06-05 22:10:51.613822635 +0900
@@ -1,9 +1,9 @@
 # IMSI number of the UE. IMSI = [MCC|MNC|MSISDN] (In total 15 digits)
-supi: 'imsi-901700000000001'
+supi: 'imsi-001010000000003'
 # Mobile Country Code value of HPLMN
-mcc: '901'
+mcc: '001'
 # Mobile Network Code value of HPLMN (2 or 3 digits)
-mnc: '70'
+mnc: '01'
 
 # Permanent subscription key
 key: '465B5CE8B199B49FAA5F0A2EE238A6BC'
@@ -20,7 +20,7 @@
 
 # List of gNB IP addresses for Radio Link Simulation
 gnbSearchList:
-  - 127.0.0.1
+  - 192.168.0.131
 
 # UAC Access Identities Configuration
 uacAic:
@@ -39,7 +39,7 @@
 # Initial PDU sessions to be established
 sessions:
   - type: 'IPv4'
-    apn: 'internet'
+    apn: 'ims'
     slice:
       sst: 1
 
```

#### UE4(IMSI-001010000000004)の設定ファイルの変更点

最初に、`open5gs-ue.yaml`から`open5gs-ue4.yaml`にコピーを作成します。

```
# cd UERANSIM/config
# cp open5gs-ue.yaml open5gs-ue4.yaml
```

次に、`open5gs-ue4.yaml`を編集します。

- `UERANSIM/config/open5gs-ue4.yaml`

```diff
--- open5gs-ue.yaml.orig        2021-09-18 21:11:52.000000000 +0900
+++ open5gs-ue4.yaml    2022-06-05 22:11:41.422607625 +0900
@@ -1,9 +1,9 @@
 # IMSI number of the UE. IMSI = [MCC|MNC|MSISDN] (In total 15 digits)
-supi: 'imsi-901700000000001'
+supi: 'imsi-001010000000004'
 # Mobile Country Code value of HPLMN
-mcc: '901'
+mcc: '001'
 # Mobile Network Code value of HPLMN (2 or 3 digits)
-mnc: '70'
+mnc: '01'
 
 # Permanent subscription key
 key: '465B5CE8B199B49FAA5F0A2EE238A6BC'
@@ -20,7 +20,7 @@
 
 # List of gNB IP addresses for Radio Link Simulation
 gnbSearchList:
-  - 127.0.0.1
+  - 192.168.0.131
 
 # UAC Access Identities Configuration
 uacAic:
@@ -39,7 +39,7 @@
 # Initial PDU sessions to be established
 sessions:
   - type: 'IPv4'
-    apn: 'internet'
+    apn: 'ims'
     slice:
       sst: 1
 
```

## Open5GS 5GCとUERANSIM UE/RANのネットワーク設定

### Open5GS 5GC U-Plane1のネットワーク設定

最初に、`/etc/sysctl.conf`ファイルの以下の行のコメントを外し、OSに反映します。

```
net.ipv4.ip_forward=1
```
```
# sysctl -p
```

次に、TUNインターフェースとNAPTを設定します。

```sh
ip tuntap add name ogstun mode tun
ip addr add 10.45.0.1/16 dev ogstun
ip link set ogstun up

iptables -t nat -A POSTROUTING -s 10.45.0.0/16 ! -o ogstun -j MASQUERADE

ip tuntap add name ogstun2 mode tun
ip addr add 10.46.0.1/16 dev ogstun2
ip link set ogstun2 up

iptables -t nat -A POSTROUTING -s 10.46.0.0/16 ! -o ogstun2 -j MASQUERADE
```

### Open5GS 5GC U-Plane2のネットワーク設定

最初に、`/etc/sysctl.conf`ファイルの以下の行のコメントを外し、OSに反映します。

```
net.ipv4.ip_forward=1
```
```
# sysctl -p
```

次に、TUNインターフェースとNAPTを設定します。

```sh
ip tuntap add name ogstun3 mode tun
ip addr add 10.47.0.1/16 dev ogstun3
ip link set ogstun3 up

iptables -t nat -A POSTROUTING -s 10.47.0.0/16 ! -o ogstun3 -j MASQUERADE
```

## Open5GSとUERANSIMのビルド

Open5GSとUERANSIMのビルド方法は以下を参照して下さい。

- Open5GS v2.4.7 - https://open5gs.org/open5gs/docs/guide/02-building-open5gs-from-sources/
- UERANSIM v3.2.6 - https://github.com/aligungr/UERANSIM/wiki/Installation

注意。Open5GS 5GC C-PlaneマシンにMongoDBをインストールして下さい。なお、MongoDBのデータベースを簡単に確認するには、[MongoDB Compass](https://www.mongodb.com/products/compass)が便利です。

```
# apt update
# apt install mongodb
# systemctl start mongodb
# systemctl enable mongodb
```

なお、Open5GS 5GC U-PlaneマシンにはMongoDBをインストールする必要はありません。

## Open5GS 5GCとUERANSIM UE/RANを実行

最初に5GCを起動し、次にUERANSIM(UEとRANのシミュレータ)を起動します。

### Open5GS 5GC C-Planeを実行

- Open5GS 5GC C-Plane

```sh
./install/bin/open5gs-nrfd &
sleep 2
./install/bin/open5gs-amfd &
sleep 2
./install/bin/open5gs-smfd &
./install/bin/open5gs-ausfd &
./install/bin/open5gs-udmd &
./install/bin/open5gs-udrd &
./install/bin/open5gs-pcfd &
./install/bin/open5gs-nssfd &
./install/bin/open5gs-bsfd &
```

### Open5GS 5GC U-Plane1とU-Plane2を実行

次に、Open5GS 5GC U-Planeを起動します。

- Open5GS 5GC U-Plane1

```
./install/bin/open5gs-upfd &
```

- Open5GS 5GC U-Plane2

```
./install/bin/open5gs-upfd &
```

### UERANSIMを実行

ここでは、UE0(IMSI-001010000000000)とRANを実行する場合を説明します。まず、gNodeBと5GCの間でNG-Setupし、5GCにUEを登録し、PDUセッションを確立します。

UERANSIMの使い方は以下を参照して下さい。

- https://github.com/aligungr/UERANSIM/wiki/Usage

#### gNBを起動

次のようにgNBを起動します。

```
# ./nr-gnb -c ../config/open5gs-gnb.yaml
UERANSIM v3.2.6
[2022-06-05 23:09:54.960] [sctp] [info] Trying to establish SCTP connection... (192.168.0.111:38412)
[2022-06-05 23:09:54.963] [sctp] [info] SCTP connection established (192.168.0.111:38412)
[2022-06-05 23:09:54.963] [sctp] [debug] SCTP association setup ascId[8]
[2022-06-05 23:09:54.964] [ngap] [debug] Sending NG Setup Request
[2022-06-05 23:09:54.964] [ngap] [debug] NG Setup Response received
[2022-06-05 23:09:54.964] [ngap] [info] NG Setup procedure is successful
```

Open5GS C-Planeのログは以下の通りです。

```
06/05 23:09:54.969: [amf] INFO: gNB-N2 accepted[192.168.0.131]:55490 in ng-path module (../src/amf/ngap-sctp.c:113)
06/05 23:09:54.969: [amf] INFO: gNB-N2 accepted[192.168.0.131] in master_sm module (../src/amf/amf-sm.c:619)
06/05 23:09:54.970: [amf] INFO: [Added] Number of gNBs is now 1 (../src/amf/context.c:876)
06/05 23:09:54.970: [amf] INFO: gNB-N2[192.168.0.131] max_num_of_ostreams : 10 (../src/amf/amf-sm.c:658)
```

#### UE(UE0)を起動

次のようにUE(UE0)を起動します。これにより、5GCにUE(UE0)が登録され、PDUセッションが確立します。

```
# ./nr-ue -c ../config/open5gs-ue0.yaml 
UERANSIM v3.2.6
[2022-06-05 23:10:39.362] [nas] [info] UE switches to state [MM-DEREGISTERED/PLMN-SEARCH]
[2022-06-05 23:10:39.362] [rrc] [debug] New signal detected for cell[1], total [1] cells in coverage
[2022-06-05 23:10:39.363] [nas] [info] Selected plmn[001/01]
[2022-06-05 23:10:39.363] [rrc] [info] Selected cell plmn[001/01] tac[1] category[SUITABLE]
[2022-06-05 23:10:39.363] [nas] [info] UE switches to state [MM-DEREGISTERED/PS]
[2022-06-05 23:10:39.364] [nas] [info] UE switches to state [MM-DEREGISTERED/NORMAL-SERVICE]
[2022-06-05 23:10:39.364] [nas] [debug] Initial registration required due to [MM-DEREG-NORMAL-SERVICE]
[2022-06-05 23:10:39.365] [nas] [debug] UAC access attempt is allowed for identity[0], category[MO_sig]
[2022-06-05 23:10:39.365] [nas] [debug] Sending Initial Registration
[2022-06-05 23:10:39.365] [nas] [info] UE switches to state [MM-REGISTER-INITIATED]
[2022-06-05 23:10:39.366] [rrc] [debug] Sending RRC Setup Request
[2022-06-05 23:10:39.367] [rrc] [info] RRC connection established
[2022-06-05 23:10:39.367] [rrc] [info] UE switches to state [RRC-CONNECTED]
[2022-06-05 23:10:39.368] [nas] [info] UE switches to state [CM-CONNECTED]
[2022-06-05 23:10:39.375] [nas] [debug] Authentication Request received
[2022-06-05 23:10:39.378] [nas] [debug] Security Mode Command received
[2022-06-05 23:10:39.378] [nas] [debug] Selected integrity[2] ciphering[0]
[2022-06-05 23:10:39.388] [nas] [debug] Registration accept received
[2022-06-05 23:10:39.388] [nas] [info] UE switches to state [MM-REGISTERED/NORMAL-SERVICE]
[2022-06-05 23:10:39.389] [nas] [debug] Sending Registration Complete
[2022-06-05 23:10:39.389] [nas] [info] Initial Registration is successful
[2022-06-05 23:10:39.390] [nas] [debug] Sending PDU Session Establishment Request
[2022-06-05 23:10:39.390] [nas] [debug] UAC access attempt is allowed for identity[0], category[MO_sig]
[2022-06-05 23:10:39.597] [nas] [debug] Configuration Update Command received
[2022-06-05 23:10:39.618] [nas] [debug] PDU Session Establishment Accept received
[2022-06-05 23:10:39.623] [nas] [info] PDU Session establishment is successful PSI[1]
[2022-06-05 23:10:39.642] [app] [info] Connection setup for PDU session[1] is successful, TUN interface[uesimtun0, 10.45.0.2] is up.
```

Open5GS C-Planeのログは以下の通りです。

```
06/05 23:10:39.372: [amf] INFO: InitialUEMessage (../src/amf/ngap-handler.c:361)
06/05 23:10:39.372: [amf] INFO: [Added] Number of gNB-UEs is now 1 (../src/amf/context.c:2072)
06/05 23:10:39.372: [amf] INFO:     RAN_UE_NGAP_ID[1] AMF_UE_NGAP_ID[1] TAC[1] CellID[0x10] (../src/amf/ngap-handler.c:497)
06/05 23:10:39.372: [amf] INFO: [suci-0-001-01-0000-0-0-0000000000] Unknown UE by SUCI (../src/amf/context.c:1398)
06/05 23:10:39.372: [amf] INFO: [Added] Number of AMF-UEs is now 1 (../src/amf/context.c:1197)
06/05 23:10:39.372: [gmm] INFO: Registration request (../src/amf/gmm-sm.c:134)
06/05 23:10:39.372: [gmm] INFO: [suci-0-001-01-0000-0-0-0000000000]    SUCI (../src/amf/gmm-handler.c:157)
06/05 23:10:39.372: [app] WARNING: Try to discover [AUSF] (../lib/sbi/path.c:110)
06/05 23:10:39.373: [amf] INFO: [256d2ac8-e4d9-41ec-8efb-dd70ded2f7cd] (NF-discover) NF registered (../src/amf/nnrf-handler.c:344)
06/05 23:10:39.373: [amf] INFO: [256d2ac8-e4d9-41ec-8efb-dd70ded2f7cd] (NF-discover) NF Profile updated (../src/amf/nnrf-handler.c:406)
06/05 23:10:39.374: [app] WARNING: Try to discover [UDM] (../lib/sbi/path.c:110)
06/05 23:10:39.375: [ausf] INFO: [256c7f38-e4d9-41ec-b70a-cb392d41c775] (NF-discover) NF registered (../src/ausf/nnrf-handler.c:285)
06/05 23:10:39.375: [ausf] INFO: [256c7f38-e4d9-41ec-b70a-cb392d41c775] (NF-discover) NF Profile updated (../src/ausf/nnrf-handler.c:333)
06/05 23:10:39.383: [app] WARNING: Try to discover [UDM] (../lib/sbi/path.c:110)
06/05 23:10:39.384: [amf] INFO: [256c7f38-e4d9-41ec-b70a-cb392d41c775] (NF-discover) NF registered (../src/amf/nnrf-handler.c:344)
06/05 23:10:39.384: [amf] INFO: [256c7f38-e4d9-41ec-b70a-cb392d41c775] (NF-discover) NF Profile updated (../src/amf/nnrf-handler.c:406)
06/05 23:10:39.387: [app] WARNING: Try to discover [PCF] (../lib/sbi/path.c:110)
06/05 23:10:39.388: [amf] INFO: [2571975c-e4d9-41ec-baf4-cd4608083bee] (NF-discover) NF registered (../src/amf/nnrf-handler.c:344)
06/05 23:10:39.389: [amf] INFO: [2571975c-e4d9-41ec-baf4-cd4608083bee] (NF-discover) NF Profile updated (../src/amf/nnrf-handler.c:406)
06/05 23:10:39.596: [gmm] INFO: [imsi-001010000000000] Registration complete (../src/amf/gmm-sm.c:1063)
06/05 23:10:39.598: [amf] INFO: [imsi-001010000000000] Configuration update command (../src/amf/nas-path.c:389)
06/05 23:10:39.599: [gmm] INFO:     UTC [2022-06-05T14:10:39] Timezone[0]/DST[0] (../src/amf/gmm-build.c:502)
06/05 23:10:39.600: [gmm] INFO:     LOCAL [2022-06-05T23:10:39] Timezone[32400]/DST[0] (../src/amf/gmm-build.c:507)
06/05 23:10:39.601: [amf] INFO: [Added] Number of AMF-Sessions is now 1 (../src/amf/context.c:2084)
06/05 23:10:39.601: [gmm] INFO: UE SUPI[imsi-001010000000000] DNN[internet] S_NSSAI[SST:1 SD:0xffffff] (../src/amf/gmm-handler.c:1068)
06/05 23:10:39.603: [smf] INFO: [Added] Number of SMF-UEs is now 1 (../src/smf/context.c:846)
06/05 23:10:39.603: [smf] INFO: [Added] Number of SMF-Sessions is now 1 (../src/smf/context.c:2868)
06/05 23:10:39.604: [app] WARNING: Try to discover [UDM] (../lib/sbi/path.c:110)
06/05 23:10:39.605: [smf] INFO: [256c7f38-e4d9-41ec-b70a-cb392d41c775] (NF-discover) NF registered (../src/smf/nnrf-handler.c:286)
06/05 23:10:39.606: [smf] INFO: [256c7f38-e4d9-41ec-b70a-cb392d41c775] (NF-discover) NF Profile updated (../src/smf/nnrf-handler.c:334)
06/05 23:10:39.609: [app] WARNING: Try to discover [PCF] (../lib/sbi/path.c:110)
06/05 23:10:39.611: [smf] INFO: [2571975c-e4d9-41ec-baf4-cd4608083bee] (NF-discover) NF registered (../src/smf/nnrf-handler.c:286)
06/05 23:10:39.611: [smf] INFO: [2571975c-e4d9-41ec-baf4-cd4608083bee] (NF-discover) NF Profile updated (../src/smf/nnrf-handler.c:334)
06/05 23:10:39.613: [app] WARNING: Try to discover [BSF] (../lib/sbi/path.c:110)
06/05 23:10:39.614: [pcf] INFO: [256c4626-e4d9-41ec-bce7-fff28bf83bd2] (NF-discover) NF registered (../src/pcf/nnrf-handler.c:288)
06/05 23:10:39.614: [pcf] INFO: [256c4626-e4d9-41ec-bce7-fff28bf83bd2] (NF-discover) NF Profile updated (../src/pcf/nnrf-handler.c:350)
06/05 23:10:39.616: [smf] INFO: UE SUPI[imsi-001010000000000] DNN[internet] IPv4[10.45.0.2] IPv6[] (../src/smf/npcf-handler.c:492)
06/05 23:10:39.617: [gtp] INFO: gtp_connect() [192.168.0.112]:2152 (../lib/gtp/path.c:60)
06/05 23:10:39.617: [app] WARNING: Try to discover [AMF] (../lib/sbi/path.c:110)
06/05 23:10:39.618: [smf] INFO: [2570bb20-e4d9-41ec-9f29-971744169c26] (NF-discover) NF registered (../src/smf/nnrf-handler.c:286)
06/05 23:10:39.618: [smf] INFO: [2570bb20-e4d9-41ec-9f29-971744169c26] (NF-discover) NF Profile updated (../src/smf/nnrf-handler.c:334)
```

Open5GS U-Plane1のログは以下の通りです。

```
06/05 23:10:39.598: [upf] INFO: [Added] Number of UPF-Sessions is now 1 (../src/upf/context.c:178)
06/05 23:10:39.598: [gtp] INFO: gtp_connect() [192.168.0.111]:2152 (../lib/gtp/path.c:60)
06/05 23:10:39.598: [upf] INFO: UE F-SEID[CP:0x1 UP:0x1] APN[internet] PDN-Type[1] IPv4[10.45.0.2] IPv6[] (../src/upf/context.c:397)
06/05 23:10:39.604: [gtp] INFO: gtp_connect() [192.168.0.131]:2152 (../lib/gtp/path.c:60)
```

`nr-ue`コマンドのコンソールログから、Open5GS 5GCからIPアドレス`10.45.0.2`がUE0に割り当てられたことが分かります。

```
[2022-06-05 23:10:39.642] [app] [info] Connection setup for PDU session[1] is successful, TUN interface[uesimtun0, 10.45.0.2] is up.
```

念のため、UE0のTUNインターフェースに割り当てられたIPアドレスと一致していることを確認して下さい。

```
# ip addr show
...
13: uesimtun0: <POINTOPOINT,PROMISC,NOTRAILERS,UP,LOWER_UP> mtu 1400 qdisc fq_codel state UNKNOWN group default qlen 500
    link/none 
    inet 10.45.0.2/32 scope global uesimtun0
       valid_lft forever preferred_lft forever
    inet6 fe80::5d3e:bfe8:f4a4:c766/64 scope link stable-privacy 
       valid_lft forever preferred_lft forever
...
```

## google.comにpingする

UE0のTUNインターフェースを指定して、`ping`してみます。

TUNインターフェースの使い方は以下を参照して下さい。

- https://github.com/aligungr/UERANSIM/wiki/Usage

### DN=10.45.0.0/16を経由する場合

VM2(U-Plane1)で`tcpdump`を実行し、`if=ogstun`を通過するパケットを確認します。

- VM5(UE0)で`ping google.com`

```
# ping google.com -I uesimtun0 -n
PING google.com (142.251.42.142) from 10.45.0.2 uesimtun0: 56(84) bytes of data.
64 bytes from 142.251.42.142: icmp_seq=1 ttl=61 time=19.0 ms
64 bytes from 142.251.42.142: icmp_seq=2 ttl=61 time=18.5 ms
64 bytes from 142.251.42.142: icmp_seq=3 ttl=61 time=18.3 ms
```

- VM2(U-Plane1)で`tcpdump`を実行

```
# tcpdump -i ogstun -n
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on ogstun, link-type RAW (Raw IP), capture size 262144 bytes
23:13:43.775588 IP 10.45.0.2 > 142.251.42.142: ICMP echo request, id 8, seq 1, length 64
23:13:43.791887 IP 142.251.42.142 > 10.45.0.2: ICMP echo reply, id 8, seq 1, length 64
23:13:44.776843 IP 10.45.0.2 > 142.251.42.142: ICMP echo request, id 8, seq 2, length 64
23:13:44.792868 IP 142.251.42.142 > 10.45.0.2: ICMP echo reply, id 8, seq 2, length 64
23:13:45.778149 IP 10.45.0.2 > 142.251.42.142: ICMP echo request, id 8, seq 3, length 64
23:13:45.794364 IP 142.251.42.142 > 10.45.0.2: ICMP echo reply, id 8, seq 3, length 64
```

また、以下のように`nr-binder`ツールにおいて、TUNインターフェースに割り当てられたIPアドレスを指定して、大半のアプリケーションを使用することができます。

- VM5(UE0)で`curl google.com`を実行

```
# sh nr-binder 10.45.0.2 curl google.com
<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>301 Moved</TITLE></HEAD><BODY>
<H1>301 Moved</H1>
The document has moved
<A HREF="http://www.google.com/">here</A>.
</BODY></HTML>
```

- VM2(U-Plane1)で`tcpdump`を実行

```
23:15:20.040857 IP 10.45.0.2.55853 > 172.217.31.142.80: Flags [S], seq 2033550471, win 65280, options [mss 1360,sackOK,TS val 872036884 ecr 0,nop,wscale 7], length 0
23:15:20.058280 IP 172.217.31.142.80 > 10.45.0.2.55853: Flags [S.], seq 2304001, ack 2033550472, win 65535, options [mss 1460], length 0
23:15:20.059963 IP 10.45.0.2.55853 > 172.217.31.142.80: Flags [.], ack 1, win 65280, length 0
23:15:20.060191 IP 10.45.0.2.55853 > 172.217.31.142.80: Flags [P.], seq 1:75, ack 1, win 65280, length 74: HTTP: GET / HTTP/1.1
23:15:20.060336 IP 172.217.31.142.80 > 10.45.0.2.55853: Flags [.], ack 75, win 65535, length 0
23:15:20.118319 IP 172.217.31.142.80 > 10.45.0.2.55853: Flags [P.], seq 1:529, ack 75, win 65535, length 528: HTTP: HTTP/1.1 301 Moved Permanently
23:15:20.119999 IP 10.45.0.2.55853 > 172.217.31.142.80: Flags [.], ack 529, win 64752, length 0
23:15:20.123544 IP 10.45.0.2.55853 > 172.217.31.142.80: Flags [F.], seq 75, ack 529, win 64752, length 0
23:15:20.123886 IP 172.217.31.142.80 > 10.45.0.2.55853: Flags [.], ack 76, win 65535, length 0
23:15:20.139491 IP 172.217.31.142.80 > 10.45.0.2.55853: Flags [F.], seq 529, ack 76, win 65535, length 0
23:15:20.140819 IP 10.45.0.2.55853 > 172.217.31.142.80: Flags [.], ack 530, win 64752, length 0
```

なお、`nr-binder`は`ping`では機能しません。理由は[こちら](https://github.com/aligungr/UERANSIM/issues/186#issuecomment-729534464)を参照して下さい。

`UE1`-`UE4`についても同様に、各U-Planeで`tcpdump`を実行し、`ogstunX`を通過するパケットを確認して下さい。

以上で、DNの端点にTUNインターフェースを作成し、DNに任意のパケットを流せるようになり、SA構成のローカル5Gを想定した5GCのシミュレーション携帯網として、MECを試す環境を構築できました。

## 最後に

5GCについては、当初、2020年4月に台湾の国立交通大学(NCTU)主導で開発、リリースされたfree5GC v3.0.0を試し始めました。一方、暫くして、Open5GSのEPCがCU分離に対応し、5GCの初版がリリースされたため、こちらを触るようになりました。なお、Uplink Classifierで使用するN9インターフェースについては[未定](https://github.com/open5gs/open5gs/discussions/797#discussioncomment-340228)とのことです。また、[Open5GS紹介スライド](https://open5gs.org/slides/intro-open5gs)も参考になります。

あとは、5G SAの基地局が安価に入手できるようになると良いですね。

5GCで導入されたCU分離は携帯網のサービス化とMECを実現する上で、有用なアーキテクチャと思います。

最後に、元記事は[Github](https://github.com/s5uishida/open5gs_5gc_ueransim_sample_config)に書いたものです。Open5GSの[チュートリアル](https://open5gs.org/open5gs/docs/)からもリンクして頂きました。

## 主な変更履歴

- [2022.07.13] Open5GS v2.4.7に対応し、UERANSIM v3.2.6に対応。最後に、Open5GS紹介スライドのリンクを追加。
- [2021.03.09] Open5GS v2.2.0に対応し、追加されたNFのNSSFについて、少し追記。UERANSIM v3.1.3に対応。
- [2021.01.30] UERANSIM v3.0.1に対応し、操作手順を変更。
- [2020.12.24] UERANSIM v2.2.1に対応し、操作手順を変更。
- [2020.12.20] UERANSIM v2.1.1に対応。
- [2020.12.15] UERANSIM v2.0.1に対応し、操作手順を変更。
- [2020.12.13] Open5GS v2.1.0に対応し、追加されたNFのPCFについて、少し追記。
- [2020.12.07] 初版。