LTEを自作してみる(Part1)

# はじめに

## プライベートLTEって??

5Gに期待が膨らんでいく今日この頃、プライベートLTEという言葉が注目されています。LTE(簡単に言うとスマホがインターネットと通信するためのネットワーク)はドコモやソフトバンクなどの通信事業者が所有しているLTE設備により実現できており、それを自分たちで作っちゃおうというのがプライベートLTEです。

プライベートLTEはさまざまな分野での利用が期待されています。
- Wi-Fiよりセキュリティに優れた無線ネットワークの実現
- 災害時における迅速な通信網の復旧 

プライベートLTEが普及するキーとなってくるのがオープンソース(OSS)です。
今まではLTEの設備というと特定のメーカーが製造している高価なネットワーク機械により構成されていました。それが仮想化(NFVとか言ったりもしますね)により汎用機器とソフトウェアで構成できるようになりました。これにオープンソースが加わることにより、LTE設備を安価に構成することが可能となりました。

## OSS LTE

現在、さまざまなOSS LTEが開発されています。その中で有名なものとしては

- OpenAirInterface
- srsLTE
- NextEPC

今回はOpenAirInterface(以後 OAI)を実際にセットアップして、動かしてみます。

## OpenAirInterface

- OpenAirInterface Software Alianceが提供するEUTRANおよびEPCのアプリケーション
- ソース(※1)
    - [EUTRAN](https://gitlab.eurecom.fr/oai/openairinterface5g)
    - [EPC](https://gitlab.eurecom.fr/oai/openair-cn)
- C言語でできている
- 機能
    - EUTRAN
        - eNodeB
        - シミュレータ(※2)
    - EPC
        - MME
        - HSS
        - SPGW(SGW + PGW)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354136/11c49f1e-b699-a2e8-4320-d299d628cc4e.png)


※1 
gitlabへのリンクですが、OAIはgithubでもソースを管理しているようです。どちらがメインなのかはよくわかりません。

※2
EUTRANのシミュレータはOAI SIMと呼ばれ、[ UE ] or [ eNodeB ] or [ UE & eNodeB ]をシミュレートすることが可能です。


# セットアップ(EPC)

では実際にUbuntu VM上にEPCをセットアップしてみましょう。

セットアップ手順はGitLabのWikiに[Tutorial](https://gitlab.eurecom.fr/oai/openairinterface5g/wikis/HowToConnectCOTSUEwithOAIeNBNew)として記載されています。


## 1.VM作成

以下の通りUbuntu VMを作成します。

* ホスト名: epc01
* OS: Ubuntu 16.04
* Spec
 - CPU : 2vcore
 - Memory : 4GB
 - Disk : 50GB
* Network
 - ens3 : 管理用インターフェース
 - ens9 : 内部通信(EUTRAN-EPC)用インターフェース
 - ens10 : インターネット接続インターフェース
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354136/af4be7db-396e-a2db-57a0-0aef76772b8e.png)




## 2.カーネルUpgrade

カーネルのバージョンアップが要件となっています。

```
# uname -a
Linux epc01 4.4.0-131-generic #157-Ubuntu SMP Thu Jul 12 15:51:36 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
# git clone https://gitlab.eurecom.fr/oai/linux-4.7.x.git
# cd linux-4.7.x
# dpkg -i linux-headers-4.7.7-oaiepc_4.7.7-oaiepc-10.00.Custom_amd64.deb linux-image-4.7.7-oaiepc_4.7.7-oaiepc-10.00.Custom_amd64.deb
# reboot

# uname -a
Linux epc01 4.7.7-oaiepc #1 SMP Sun Oct 16 22:45:31 CST 2016 x86_64 x86_64 x86_64 GNU/Linux
```

## 3.ホスト名設定

ホスト名を変更し、/etc/hostsを編集します。
/etc/hostsには自信とmmeとhssのエントリーを追加します。
mmeとhssのエントリーにはFQDNも登録しておきます。(ドメイン名は任意のものを付けてください。)

```
# cat /etc/hostname
epc01

# cat /etc/hosts
127.0.0.1       localhost
127.0.1.1       epc01
127.0.1.1       mme.epc.lte             mme
127.0.1.1       hss.epc.lte             hss
```

## 4.ソースファイルのダウンロード
ソースファイルをダウンロードする際にバージョンを指定します。(今回は0.5.0)
(OAIはリリース/バージョンによって挙動が変わったり、安定感に欠けているような気がします。そのため再現性確保のためにバージョンを指定していた方がよいです。)

```
# git clone --depth 1 -b v0.5.0  https://gitlab.eurecom.fr/oai/openair-cn.git
# cd openair-cn
```

## 5.HSSのインストール

```
# pwd
/root/openair-cn
# cd scripts/
# ./build_hss -i
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/354136/aab5080e-8375-ffd1-1aa7-7dfc504400d4.png)
MySQLのrootパスワードの設定を求められるので、任意のパスワードを入力します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/354136/c817bb97-0d0b-fbca-4c07-6c1b5e14291d.png)
apache2を選択します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/354136/13fbc605-7601-ff5a-2bae-5990fac7425e.png) Noを選択します。

```
HSS not compiled, to compile it, re-run build_hss without -i 
```

上記の出力が表示されるため、-iなしでもう一度ビルドを実行します。

```
# ./build_hss

oai_hss installed
```


## 6.MMEのインストール

```
# ./build_mme -i
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/354136/0442d861-4aec-8efd-8dd0-3d34fd1c9e6f.png)
Yesを選択します。

```
MME not compiled, to compile it, re-run build_mme without -i option
```

-iなしで再び実行します。

```
# ./build_mme 

mme installed
```


## 7.SPGWのインストール

```
# ./build_spgw -i

SPGW not compiled, to compile it, re-run build_spgw without -i option
```


```
# ./build_spgw 

spgw installed
```

## 8.設定ファイルの配置

設定ファイルのテンプレートを/usr/local/etc/oaiへコピーします。

```
# cd /root/openair-cn/etc
# cp ./mme.conf /usr/local/etc/oai/
# cp ./hss.conf /usr/local/etc/oai/
# cp ./spgw.conf /usr/local/etc/oai/
# cp ./acl.conf /usr/local/etc/oai/freeDiameter/
# cp ./mme_fd.conf /usr/local/etc/oai/freeDiameter/
# cp ./hss_fd.conf /usr/local/etc/oai/freeDiameter/
```

## 9.設定ファイルの編集

### ① mme.conf

MMEの設定ファイルの以下の箇所を変更します。

```text:/usr/local/etc/oai/mme.conf
24   REALM                                 = "epc.lte";                # YOUR REALM HERE

153  MME_INTERFACE_NAME_FOR_S1_MME         = "ens9";                         # YOUR NETWORK CONFIG HERE
154  MME_IPV4_ADDRESS_FOR_S1_MME           = "172.16.0.52/24";                 # YOUR NETWORK CONFIG HERE
```

|item|value|description|
|:---|:----|:----------|
|REALM|epc.lte|/etc/hostsに登録したMMEのドメイン名|
|MME_INTERFACE_NAME_FOR_S1_MME |ens9|EUTRANと接続するIFのIF名|
|MME_IPV4_ADDRESS_FOR_S1_MME  |172.16.0.52/24|上記IFのIPアドレス|


### ② spgw.conf

SPGWの設定ファイルの以下の箇所を変更します。

```text:/usr/local/etc/oai/spgw.conf
30  SGW_INTERFACE_NAME_FOR_S1U_S12_S4_UP    = "ens9";                       # STRING, interface name, YOUR NETWORK CONFIG HERE, USE "lo" if S-GW run on eNB host
31  SGW_IPV4_ADDRESS_FOR_S1U_S12_S4_UP      = "172.16.0.52/24";             # STRING, CIDR, YOUR NETWORK CONFIG HERE

79  PGW_INTERFACE_NAME_FOR_SGI            = "ens10";                        # STRING, YOUR NETWORK CONFIG HERE
80  PGW_MASQUERADE_SGI                    = "yes";                           # STRING, {"yes", "no"}. YOUR NETWORK CONFIG HERE, will do NAT for you if you put "yes".

90  IPV4_LIST = (
91                   "1.1.1.0/24"                                           # STRING, CIDR, YOUR NETWORK CONFIG HERE.
92               );
``` 

|item|value|description|
|:---|:----|:----------|
|SGW_INTERFACE_NAME_FOR_S1U_S12_S4_UP|ens9|EUTRANと接続するIFのIF名|
|SGW_IPV4_ADDRESS_FOR_S1U_S12_S4_UP|172.16.0.52|上記IFのIPアドレス|
|PGW_INTERFACE_NAME_FOR_SGI|ens10|インターネットと接続するIFのIF名|
|PGW_MASQUERADE_SGI|yes|SGIと通信する際にNATするか|
|IPV4_LIST|1.1.1.0/24|UEに割り当てるアドレスのアドレス範囲|

### ③ hss.conf

HSSの設定ファイルの以下の箇所を変更します。

```text:/usr/local/etc/oai/hss.conf
25  MYSQL_user   = "root";  # Database server login
26  MYSQL_pass   = "rootroot";  # Database server password
```
|item|value|description|
|:---|:----|:----------|
|MYSQL_user|root|mysqlのrootユーザ名|
|MYSQL_pass|rootroot|mysqlのrootユーザのパスワード|

### ④ mme_fd.conf

MMEのDiameter設定ファイルの以下の箇所を変更します。

※fd = FreeDiamater

```text:/usr/local/etc/oai/freeDiameter/mme_fd.conf
4    Identity = "mme.epc.lte";
5    Realm = "epc.lte";

103  ConnectPeer= "hss.epc.lte" { ConnectTo = "127.0.1.1"; No_SCTP ; No_IPv6; Prefer_TCP; No_TLS; port = 3868;  realm = "epc.lte";};
```
|item|value|description|
|:---|:----|:----------|
|Identity|mme.epc.lte|MMEのFQDN|
|Realm|epc.lte|MMEのドメイン名|
|ConnectPeer|hss.epc.lte|接続先HSSのFQDN|
|ConnectTo|127.0.1.1|接続先HSSのIPアドレス|
|realm|epc.lte|接続先HSSのドメイン名 |

### ⑤ hss_fd.conf

```text:/usr/local/etc/oai/freeDiameter/hss_fd.conf
7   Identity = "hss.epc.lte";
11  Realm = "epc.lte";
```
|item|value|description|
|:---|:----|:----------|
|Identity|hss.epc.lte|HSSのFQDN|
|Realm|epc.lte|HSSのドメイン名|


## 10.証明書のインストール

```
# cd /root/openair-cn/scripts
# ./check_hss_s6a_certificate /usr/local/etc/oai/freeDiameter/ hss.lte.epc
# ./check_mme_s6a_certificate /usr/local/etc/oai/freeDiameter/ mme.lte.epc
```

## 11.ビルド

```
./build_hss -c
./build_mme -c
./build_spgw -c
```

## 12.MySQLへのデータ登録
HSSは自身のデータベースとしてMySQLを使用します。そのためMySQLにOAI EPC関連のデータを登録する必要があります。

```
# ./run_hss -i ~/openair-cn/src/oai_hss/db/oai_db.sql
<Ctrl + C>
```

## 13.MySQLのアップデート
前の手順でOAI EPC関連のデータがMySQLに登録されましたが、まだデフォルト状態のためアップデートする必要があります。

oai_dbデータベースのmmedidentityテーブルに以下のようにデータを追加します。

```
# mysql -u root -p

mysql> use oai_db;
mysql> insert into mmeidentity values(7, "mme.epc.lte","epc.lte", 0);
mysql> select * from mmeidentity;
+---------------+------------------------+---------------+-----------------+
| idmmeidentity | mmehost                | mmerealm      | UE-Reachability |
+---------------+------------------------+---------------+-----------------+
|             2 | mme2.openair4G.eur     | openair4G.eur |               0 |
|             1 | nano.openair4G.eur     | openair4G.eur |               0 |
|             5 | abeille.openair4G.eur  | openair4G.eur |               0 |
|             4 | yang.openair4G.eur     | openair4G.eur |               0 |
|             3 | mme3.openair4G.eur     | openair4G.eur |               0 |
|             6 | calisson.openair4G.eur | openair4G.eur |               0 |
|             7 | mme.epc.lte            | epc.lte       |               0 |
+---------------+------------------------+---------------+-----------------+
```

## 14.HSSの起動

```
# pwd
/root/openair-cn/scripts
# ./run_hss

....................................................

Initializing s6a layer: DONE
```

## 15.MMEの起動

```
# ./run_hss

....................................................

000261 00030:842323 7F70057FA700 DEBUG MME-AP src/mme_app/mme_app_statistics.c:0033    ======================================= STATISTICS ============================================

000262 00030:842336 7F70057FA700 DEBUG MME-AP src/mme_app/mme_app_statistics.c:0034                   |   Current Status| Added since last display|  Removed since last display |
000263 00030:842338 7F70057FA700 DEBUG MME-AP src/mme_app/mme_app_statistics.c:0036    Connected eNBs |          0      |              0              |             0               |
000264 00030:842341 7F70057FA700 DEBUG MME-AP src/mme_app/mme_app_statistics.c:0038    Attached UEs   |          0      |              0              |             0               |
000265 00030:842343 7F70057FA700 DEBUG MME-AP src/mme_app/mme_app_statistics.c:0040    Connected UEs  |          0      |              0              |             0               |
000266 00030:842346 7F70057FA700 DEBUG MME-AP src/mme_app/mme_app_statistics.c:0042    Default Bearers|          0      |              0              |             0               |
000267 00030:842348 7F70057FA700 DEBUG MME-AP src/mme_app/mme_app_statistics.c:0044    S1-U Bearers   |          0      |              0              |             0               |
```

上記のようにSTATISTICSテーブルが定期的に表示されるようになれば、起動成功です。

## 16.SPGWの起動

```
# ./run_spgw

....................................................
000099 00000:866227 7F49E90FF700 DEBUG UDP    /src/udp/udp_primitives_server.c:0356    Initializing UDP task interface
000100 00000:867361 7F49E90FF700 DEBUG UDP    /src/udp/udp_primitives_server.c:0364    Initializing UDP task interface: DONE
000101 00000:867376 7F49E90FF700 DEBUG S11    oot/openair-cn/src/s11/s11_sgw.c:0259    Initializing S11 interface
....................................................

```

これでMME/HSS/SPGWが起動しました。

一度ここでVMの中でOAI EPCがどのように稼働しているか整理してみました。(もしかしたら間違えてるかも)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354136/1627d098-1ec1-6576-f967-e68d5a578296.png)

MME/HSS/SPGW各プロセスが上記のようにループバックインターフェースで接続しています。各プロセスが独立しているので、コンテナによるマイクロサービス化もやってみたいなーとか思ったり。。。

長くなったので今回はここまでとします。

# 最後に

今回はOAIのEPCをセットアップしました。
次回はOAI SIMをセットアップしてOAI EPCに接続させてみます。