docker_open5gsによるVoLTEとSMSの設定

本記事は、[docker_open5gs](https://github.com/herlesupreeth/docker_open5gs)を使用して、4GスマートフォンでVoLTE通話とSMSを試す際の設定について説明します。これにより、国内の場合、プライベートLTE(sXGP)による自営の携帯網で、sXGP対応スマートフォンを用いて、VoLTE通話やSMSを試せると思います。※機器によっては、動作しない可能性があります。また、sXGPは`MCC=441,MNC=90`ですが、本記事では、sXGPに限定しない意図から、`MCC=001,MNC=01`として説明します。
なお、EPCのコア網に登場する各NF(Network Function)の役割やインターフェースについて概ね知っていることを期待して書いており、これらの説明は省略します。

---

## 目次

- [ネットワーク構成の概要](#ネットワーク構成の概要)
- [docker_open5gsのopen5gs_hss_cxブランチを使用](#docker_open5gsのopen5gs_hss_cxブランチを使用)
    - [docker_open5gsの設定ファイルの変更点](#docker_open5gsの設定ファイルの変更点)
    - [Open5GSとKamailioのDockerイメージをビルド](#open5gsとkamailioのdockerイメージをビルド)
    - [docker-compose実行](#docker-compose実行)
    - [Open5GSに加入者情報を登録](#open5gsに加入者情報を登録)
    - [OsmoHLRにIMSIとMSISDNを登録](#osmohlrにimsiとmsisdnを登録)
    - [VoLTEとSMSを試す](#volteとsmsを試す)
        - [OsmoMSC VTY端末からSMSを送信(SMS over SGs)](#osmomsc-vty端末からsmsを送信sms-over-sgs)
- [SMS over SGsは使用せず、SMS over IMSのみ使用](#sms-over-sgsは使用せずsms-over-imsのみ使用)
    - [docker_open5gsの設定ファイルの追加の変更点](#docker_open5gsの設定ファイルの追加の変更点)
- [動作確認バージョンリスト](#動作確認バージョンリスト)
- [最後に](#最後に)
- [主な変更履歴](#主な変更履歴)

---

## ネットワーク構成の概要

この記事のネットワーク構成例は以下になります。

```
     eNodeB                Docker host - 172.22.0.0/24
   +---------+           +-------------+
   |         |           |             |
   |         |           |             |
   +---------+           +-------------+
        |                       |
-------------------------------------------------------
       .10                     .20      192.168.0.0/24
```

参考までに、DockerホストのVMの仕様は以下の通りです。

| CPU Cores | Memory | SSD | OS |
| --- | --- | --- | --- |
| 2 | 4GB | 40GB | Ubuntu 22.04 |

eNodeBには、Dockerホストのネットワーク(`172.22.0.0/24`)に向かうパケット用に以下のルーティングを設定します。

```
# ip route add 172.22.0.0/24 via 192.168.0.20
```

eNodeBにルーティングを設定する機能が無い場合、Dockerホストがdefault GWになるようにネットワークを構成して下さい。

今回構成されるPDNは以下の通りです。

| PDN | TUNnel interface of PDN | APN | U-Plane # |
| --- | --- | --- | --- |
| 192.168.100.0/24 | ogstun | internet | U-Plane1 |
| 192.168.101.0/24 | ogstun2 | ims | U-Plane1 |

## docker_open5gsのopen5gs_hss_cxブランチを使用

VoLTEとSMS over IMS / SMS over SGsを試す場合は、`open5gs_hss_cx`ブランチを使用すると便利です。この場合、KamailioのS-CSCFとI-CSCFはOpen5GS HSS(Cx)と通信します。
なお、SMS over SGsでは、実際には2G/3Gの無線は使用せず、コア網の機能(MSC + SMSC + HLR)のみ使用します。

```
# git clone https://github.com/herlesupreeth/docker_open5gs
# cd docker_open5gs
# git checkout open5gs_hss_cx
```

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

**.env)**

| Item | Value |
| --- | --- |
| MCC | 001 |
| MNC | 01 |
| DOCKER_HOST_IP | 192.168.0.20 |
| SGWU_ADVERTISE_IP | 192.168.0.20 |

**4g-volte-deploy.yaml)**

```diff
--- 4g-volte-deploy.yaml.orig   2023-08-07 10:58:37.018266553 +0000
+++ 4g-volte-deploy.yaml        2023-08-07 11:00:21.227760253 +0000
@@ -100,8 +100,8 @@
     expose:
       - "8805/udp"
       - "2152/udp"
-    # ports:
-    #   - "2152:2152/udp"
+    ports:
+      - "2152:2152/udp"
     networks:
       default:
         ipv4_address: ${SGWU_IP}
@@ -127,7 +127,6 @@
       - "5868/sctp"
       - "8805/udp"
       - "2123/udp"
-      - "7777/tcp"
       - "9091/tcp"
     networks:
       default:
@@ -187,8 +186,8 @@
       - "36412/sctp"
       - "2123/udp"
       - "9091/tcp"
-    # ports:
-    #   - "36412:36412/sctp"
+    ports:
+      - "36412:36412/sctp"
     networks:
       default:
         ipv4_address: ${MME_IP}
```

**mme/mme.yaml)**

eNodeBのTACに合わせて、以下の`tac`を変更します。

```
mme:
...
    sgsap:
      addr: OSMOMSC_IP
      map:
        tai:
          plmn_id:
            mcc: MCC
            mnc: MNC
-->       tac: 1
...
    tai:
      plmn_id:
        mcc: MCC
        mnc: MNC
-->   tac: 1
...
```

### Open5GSとKamailioのDockerイメージをビルド

最初に以下をインストールします。

- [docker-ce](https://docs.docker.com/install/linux/docker-ce/ubuntu)

ビルド手順は[docker_open5gs](https://github.com/herlesupreeth/docker_open5gs)を参照して下さい。

```
# cd docker_open5gs/base
# docker build --no-cache --force-rm -t docker_open5gs .
...
# cd ../ims_base
# docker build --no-cache --force-rm -t docker_kamailio .
...
```

### docker-compose実行

例として、以下のNFグループ毎に端末を用意して、以下の順番でNFグループの起動を確認しながら実行します。なお、一つの端末でまとめて起動しても良いです。

*terminal#1*

```
# set -a
# source .env
# docker compose -f 4g-volte-deploy.yaml up mongo mysql dns webui
```

*terminal#2*

```
# set -a
# source .env
# docker compose -f 4g-volte-deploy.yaml up osmohlr osmomsc
```

*terminal#3*

```
# set -a
# source .env
# docker compose -f 4g-volte-deploy.yaml up hss mme pcrf sgwc sgwu smf upf
```

*terminal#4*

```
# set -a
# source .env
# docker compose -f 4g-volte-deploy.yaml up rtpengine
```

*terminal#5*

```
# set -a
# source .env
# docker compose -f 4g-volte-deploy.yaml up icscf scscf pcscf smsc
```

### Open5GSに加入者情報を登録

SIMのIMSIに紐付けて、電話番号のMSISDNも忘れずに登録して下さい。この自営網でのみ通用する任意の番号で構いません。なお、APN情報は以下の通りに設定して下さい。

| APN | Type | QCI | ARP | Capability | Vulnerablility | MBR DL/UL (Kbps) | GBR DL/UL (Kbps) |
| --- | --- | --- | --- | --- | --- | --- | --- |
| internet | IPv4 | 9 | 8 | Disabled | Disabled | unlimited/unlimited | |
| ims | IPv4 | 5 | 1 | Disabled | Disabled | 3850/1530 | |
| | | 1 | 2 | Enabled | Enabled | 128/128 | 128/128 |

詳細は以下を参照して下さい。

`18. Install Open5GS in the same machine as Kamailio IMS - Install Open5GS from source`
https://open5gs.org/open5gs/docs/tutorial/02-VoLTE-setup/

```
http://192.168.0.20:3000/

user: admin
password: 1423
```

### OsmoHLRにIMSIとMSISDNを登録

`osmohlr`コンテナにログインして、以下を参考にして登録します。

`6.1 Example: Add/Update/Delete Subscriber via VTY`  
https://downloads.osmocom.org/docs/latest/osmohlr-usermanual.pdf

以下に、加入者情報として、IMSI=001010000001001とMSISDN=1001をOsmoHLRに登録する例を示します。

最初に、`osmohlr`コンテナにログインします。

```
# docker exec -it osmohlr /bin/bash
```

次に、localhostにtelnetします。

```
# telnet localhost 4258
...
OsmoHLR> enable
OsmoHLR#
```

次に、IMSI=001010000001001とMSISDN=1001を登録します。

```
OsmoHLR# subscriber imsi 001010000001001 create
% Created subscriber 001010000001001
    ID: 1
    IMSI: 001010000001001
    MSISDN: none
OsmoHLR# subscriber imsi 001010000001001 update msisdn 1001
% Updated subscriber IMSI='001010000001001' to MSISDN='1001'
OsmoHLR#
```

実際に、IMSIとMSISDNが登録されていることを確認します。

```
OsmoHLR# show subscribers all
ID     MSISDN        IMSI              IMEI              NAM
-----  ------------  ----------------  ----------------  -----
1      1001          001010000001001    -------------    CSPS  
 Subscribers Shown: 1
OsmoHLR#
```

この設定は、SMS over SGsを使用する際に必要になります。

### VoLTEとSMSを試す

登録したMSISDN番号に、VoLTE通話とSMSができることを、4Gスマートフォン標準の通話アプリとメッセージアプリで確認します。SMSについては、スマートフォンがSMS over IMSに対応していない場合、機種(or設定)によっては、SMS over SGsでSMSを送信できる場合があります。  
なお、SMS over SGsを試す場合、`smsc`コンテナを起動しないことで強制的にCS Fallbackさせる方法があります。

#### OsmoMSC VTY端末からSMSを送信(SMS over SGs)

OsmoMSC VTY端末上のコマンド操作で、SMSを送信することができます(SMS over SGs)。`osmomsc`コンテナにログインして、以下の通り、コマンドラインからSMSを送信します。

`14 Configuring the Core Network`  
`11.3.3 The list command`  
https://downloads.osmocom.org/docs/latest/osmomsc-usermanual.pdf

例として、OsmoHLRに以下のIMSIとMSISDNが登録されている場合)

| IMSI | MSISDN | SIM |
| --- | --- | --- |
| 001010000001000 | 1000 | x |
| 001010000001001 | 1001 | o |
| 001010000001002 | 1002 | o |

最初に、`osmomsc`コンテナにログインします。

```
# docker exec -it osmomsc /bin/bash
```

次に、localhostにtelnetします。

```
# telnet localhost 4254
...
OsmoMSC> enable
OsmoMSC#
```

- SIMに紐付いたMSISDN=1001から、同じくSIMに紐付いたMSISDN=1002に`TEST MESSAGE`を送信するコマンド操作

```
OsmoMSC# subscriber msisdn 1002 sms sender msisdn 1001 send TEST MESSAGE
```

- SIMに紐付かないMSISDN=1000から、SIMに紐付いたMSISDN=1002に`TEST MESSAGE`を送信するコマンド操作

```
OsmoMSC# subscriber msisdn 1002 sms sender msisdn 1000 send TEST MESSAGE
```

## SMS over SGsは使用せず、SMS over IMSのみ使用

SMS over SGを使用せずに、SMS over IMSのみを設定することもできます。 この場合、OsmoHLRとOsmoMSCは必要なく、構成は少し簡単になります。

### docker_open5gsの設定ファイルの追加の変更点

以前の構成からの追加の変更は以下の通りです。

**4g-volte-deploy.yaml)**

MMEのOsmoMSCへの依存関係を削除します。

```diff
--- 4g-volte-deploy.yaml.orig   2023-09-01 23:07:44.380709992 +0900
+++ 4g-volte-deploy.yaml        2023-09-01 23:09:48.911421833 +0900
@@ -100,8 +100,8 @@
     expose:
       - "8805/udp"
       - "2152/udp"
-    # ports:
-    #   - "2152:2152/udp"
+    ports:
+      - "2152:2152/udp"
     networks:
       default:
         ipv4_address: ${SGWU_IP}
@@ -127,7 +127,6 @@
       - "5868/sctp"
       - "8805/udp"
       - "2123/udp"
-      - "7777/tcp"
       - "9091/tcp"
     networks:
       default:
@@ -166,7 +165,6 @@
       - sgwu
       - smf
       - upf
-      - osmomsc
     container_name: mme
     env_file:
       - .env
@@ -187,8 +185,8 @@
       - "36412/sctp"
       - "2123/udp"
       - "9091/tcp"
-    # ports:
-    #   - "36412:36412/sctp"
+    ports:
+      - "36412:36412/sctp"
     networks:
       default:
         ipv4_address: ${MME_IP}
```

**mme/mme.yaml)**

SGsAP項目を削除します。

```diff
--- mme.yaml.orig       2023-09-01 23:07:34.417698185 +0900
+++ mme.yaml    2023-09-01 23:10:34.248245114 +0900
@@ -9,19 +9,6 @@
       dev: MME_IF
     gtpc:
       dev: MME_IF
-    sgsap:
-      addr: OSMOMSC_IP
-      map:
-        tai:
-          plmn_id:
-            mcc: MCC
-            mnc: MNC
-          tac: 1
-        lai:
-          plmn_id:
-            mcc: MCC
-            mnc: MNC
-          lac: 1
     gummei: 
       plmn_id:
         mcc: MCC
```

eNodeBのTACに合わせて、以下の`tac`を変更します。

```
mme:
...
    tai:
      plmn_id:
        mcc: MCC
        mnc: MNC
-->   tac: 1
...
```

これ以降は先程と同じ手順になります。なお、`osmohlr`と`osmomsc`のコンテナを起動する必要はありません。 勿論、IMSIとMSISDNをOsmoHLRに登録する必要もありません。

## 動作確認バージョンリスト

`open5gs_hss_cx`ブランチでVoLTEとSMSの動作を確認した際のシステムバージョンは以下の通りです。

```
docker_open5gs (commit:76206df07ea1571640b71fa25f28cb3ce4265aff) on 2023.08.22
Open5GS v2.6.4 (commit:7f088730ed4bedc12f562e53de44697d5e1f5c6e) on 2023.08.20
```

## 最後に

docker_open5gsを用いて、sXGPでVoLTE通話できるようにするために、docker_open5gsの開発者とやり取りし、pcap等のログを取得、調査し、対応して頂きました。結果的に対応した内容はsXGPに限ったものではなく、VoLTEに対応した一般的な4Gスマートフォンを対象に、IMSと連携する際の改善になります。これにより、以前のdocker_open5gsでは4Gスマートフォンの一部の機種でしかVoLTEを使用できませんでしたが、より多くのスマートフォンでVoLTEを試せるようになったと思います。

本記事のように、sXGPでプライベートLTEを構築する場合、データ通信以外にVoLTEやSMSを試したい方もおられると思います。sXGPが使用する周波数は以前、PHSで使用していたBand39(1.9GHz)ですが、市販されているスマートフォンにはsXGPに対応している機種もありますので、sXGP基地局とオープンソースのOpen5GSとKamailio他で自営網を比較的手軽に試すことができると思います。ただ、sXGP基地局とオープンソースのコア網、IMSとの連携は、実際に試してみないと分からないことが多々あると思います。

また、Band39対応と仕様に記載されたスマートフォンの中には、sXGPでデータ通信はできても、VoLTEやSMS(SMS over IMS)ができない機種があるようです。なお、sXGP対応と明示的に紹介されている製品なら使用できるのではと期待しています。

このように、4Gスマートフォンに別途ソフトフォンをインストールすること無く、標準の通話アプリとメッセージアプリを自営網で試すことができ、興味深いです。なお、sXGPの通信速度は、ULが最大4Mbps、DLが最大12Mbpsと大きくはありません。ですが、周波数が1.9GHzのため、WiFiよりも電波の回り込みが期待でき、また、共有バンドではないため、安定した通信が期待できます。SIMによる高い強度のセキュリティもあります。VoLTEとSMSに加えて、この程度の通信速度に収まるデータ通信をセキュアに安定して使用する用途には適しているように思います。コストも含めて、ローカル5Gとは違う視点で様々なユースケースが考えられそうです。

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

## 主な変更履歴

- [2023.09.02] KamailioのSMSCは文字化けせずにマルチバイト文字を送受信できるようになりました。SMS over SGsを使用せずにSMS over IMSのみを使用する構成を追記しました。
- [2023.01.18] 初版。