Metonymical Deflection

ゆるく日々のコト・たまにITインフラ

OAISIM + NextEPCによるE-UTRAN + EPC構築方法

3GPPのお勉強や簡易検証を目的として使えそうなE-UTRAN & EPC構築方法を記載します。
UEとeNBはOAISIMにて構築し、残り*1はNextEPCで構築します。
また、MVNOライクにSGWとPGW間(S5/S8)を分離させます。

というのも、

  • SPGW間にLBを入れてPGWのメンテ検証や移行設計したり
  • QCIによる帯域制御検証したり

と色々遊べそうなので。

1.環境

1-1.VMWare
筐体                             : 自作PC(Win10pro)
CPU                           : Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz
VMWare              : VMware(R) Workstation 15 Pro 15.1.0 build-13591040  
OS                               : Ubuntu 16.04.6 LTS
Kernel                           : 4.4.0-142-generic
1-2.全体構成

f:id:metonymical:20191021014131p:plain

1-3 .全体の流れ ~概要~
  1. 事前準備
  2. NextEPC設定
  3. OAISIM設定
  4. NextEPCの分離*2

2.事前準備

2-1.u16c132:NextEPCのNW設定

NextEPCは後ほど分離しますが、まずはまとめて設定だけしておきます。*3
そして、ワンコール確認まで完了した後、分離します。

vi /etc/network/interfaces

auto ens33
iface ens33 inet static
    address 192.168.11.132
    netmask 255.255.255.0
    gateway 192.168.11.1
    dns-nameserver 192.168.11.1

auto ens34
iface ens34 inet static
    address 10.10.0.135
    netmask 255.255.255.0

auto ens35
iface ens35 inet static
    address 10.20.0.132
    netmask 255.255.255.0

auto ens35:3
iface ens35:3 inet static
    address 10.20.0.133
    netmask 255.255.255.0

auto ens35:4
iface ens35:4 inet static
    address 10.20.0.134
    netmask 255.255.255.0

auto ens35:5
iface ens35:5 inet static
    address 10.20.0.135
    netmask 255.255.255.0

auto ens35:6
iface ens35:6 inet static
    address 10.20.0.136
    netmask 255.255.255.0
2-2.u16c131:OAISIMのNW設定
vi /etc/network/interfaces

auto ens33
iface ens33 inet static
    address 192.168.11.131
    netmask 255.255.255.0
    gateway 192.168.11.1
    dns-nameserver 192.168.11.1

auto ens35
iface ens35 inet static
    address 10.20.0.131
    netmask 255.255.255.0

3.NextEPC設定

分離するまでは、u16c132のみで設定を行っていきます。

3-1.MongoDBのインストール
apt-get -y update && \
apt-get -y install mongodb && \
systemctl enable mongodb && \
systemctl start mongodb

systemctl status mongodb
3-2.pgwtunの設定

PGWのGTP終端インターフェースを作成します。

sh -c "cat << EOF > /etc/systemd/network/99-nextepc.netdev
[NetDev]
Name=pgwtun
Kind=tun
EOF"

sh -c "cat << EOF > /etc/systemd/network/99-nextepc.network
[Match]
Name=pgwtun
[Network]
Address=25.0.0.1/8
Address=cafe::1/64
EOF"

systemctl enable systemd-networkd && \
systemctl restart systemd-networkd
3-3.依存関係パッケージのインストール
apt-get -y install autoconf libtool gcc pkg-config git flex bison libsctp-dev \
libgnutls28-dev libgcrypt-dev libssl-dev libidn11-dev libmongoc-dev libbson-dev libyaml-dev
3-4.ビルド
git clone https://github.com/nextepc/nextepc && \
cd /root/nextepc && \
autoreconf -iv

./configure --prefix=`pwd`/install && \
make -j `nproc` && \
make install
3-5.WebUIのインストール
apt-get -y install curl && \
curl -sL https://deb.nodesource.com/setup_10.x | sudo -E bash - && \
apt-get -y install nodejs

cd /root/nextepc/webui/ && \
npm install

#サービス起動
npm run dev

#アクセス先URL
http://192.168.11.132:3000/

インストール完了後、以下のページが表示されればOKです。
Username/Passwdは以下の通り。
admin/1423
f:id:metonymical:20191020140814p:plain

3-6.SIM情報の登録

上記のアクセス先URLから以下のSIM情報を登録します。

IMSI 001010100001111
Subscriber Key(Ki) 8baf473f2f8fd09487cccbd7097c6862
Operator Key(OPc) e734f8734007d6c5ce7a0508809e7e9c
USIM Type OPc
APN lte.md.jp
MSISDN 33611123456
IMSI 001010100001112
Subscriber Key(Ki) 8baf473f2f8fd09487cccbd7097c6862
Operator Key(OPc) e734f8734007d6c5ce7a0508809e7e9c
USIM Type OPc
APN lte.md.jp
MSISDN 33611123457

f:id:metonymical:20191021014216p:plain
IMSI, Subscriber Key(Ki), Operator Key(OPc), USIM Typeが必須項目となります。
APNは任意で構いません。
MSISDNは、ここでは設定不要ですが、OAISIMのビルド前に必要となりますので、念のため記載しています。

3-7.nextepc.conf設定

設定変更箇所のみ抜粋。

vi /root/nextepc/install/etc/nextepc/nextepc.conf

追記:青 コメントアウト&追記:緑

db_uri: mongodb://localhost/nextepc

logger:
    file: /root/nextepc/install/var/log/nextepc/nextepc.log
    trace:
        app: 1
        s1ap: 1
        nas: 1
        diameter: 1
        gtpv2: 1
        gtp: 1

parameter:
    no_ipv6: true

mme:
    freeDiameter: mme.conf

    s1ap:
      - addr: 10.20.0.132

    gtpc:
      - addr: 10.20.0.132

    gummei:
      plmn_id:
        mcc: 001
        mnc: 01
      mme_gid: 2
      mme_code: 1

    tai:
      plmn_id:
        mcc: 001
        mnc: 01
#      tac: 12345
      tac: 1

    security:
        integrity_order : [ EIA1, EIA2, EIA0 ]
        ciphering_order : [ EEA0, EEA1, EEA2 ]

    network_name:
        full: NextEPC

hss:
    freeDiameter: hss.conf

sgw:
    gtpc:
#      addr: 127.0.0.2
      addr: 10.20.0.134

    gtpu:
      - addr: 10.20.0.134

pgw:
    freeDiameter: pgw.conf

    gtpc:
      addr:
#        - 127.0.0.3
        - 10.20.0.135
        - ::1

    gtpu:
#      - addr: 127.0.0.3
      - addr: 10.20.0.135
      - addr: ::1

    ue_pool:
#      - addr: 45.45.0.1/16
      - addr: 25.0.0.1/8
      - addr: cafe::1/64

    dns:
      - 8.8.8.8
      - 8.8.4.4
      - 2001:4860:4860::8888
      - 2001:4860:4860::8844

pcrf:
    freeDiameter: pcrf.conf

3-8.mme.conf設定

設定変更箇所のみ抜粋。

vi /root/nextepc/install/etc/nextepc/freeDiameter/mme.conf

追記:青 コメントアウト&追記:緑

#ListenOn = "127.0.0.2";
ListenOn = "10.20.0.132";

#ConnectPeer = "hss.localdomain" { ConnectTo = "127.0.0.4"; No_TLS; };
ConnectPeer = "hss.localdomain" { ConnectTo = "10.20.0.133"; No_TLS; };
3-9.hss.conf設定

設定変更箇所のみ抜粋。

vi /root/nextepc/install/etc/nextepc/freeDiameter/hss.conf

追記:青 コメントアウト&追記:緑

#ListenOn = "127.0.0.4";
ListenOn = "10.20.0.133";

#ConnectPeer = "mme.localdomain" { ConnectTo = "127.0.0.2"; No_TLS; };
ConnectPeer = "mme.localdomain" { ConnectTo = "10.20.0.132"; No_TLS; };
3-10.pgw.conf設定

設定変更箇所のみ抜粋。

vi /root/nextepc/install/etc/nextepc/freeDiameter/pgw.conf

追記:青 コメントアウト&追記:緑

#ListenOn = "127.0.0.3";
ListenOn = "10.20.0.135";

#ConnectPeer = "pcrf.localdomain" { ConnectTo = "127.0.0.5"; No_TLS; };
ConnectPeer = "pcrf.localdomain" { ConnectTo = "10.20.0.136"; No_TLS; };
3-11.pcrf.conf設定

設定変更箇所のみ抜粋。

vi /root/nextepc/install/etc/nextepc/freeDiameter/pcrf.conf

追記:青 コメントアウト&追記:緑

#ListenOn = "127.0.0.5";
ListenOn = "10.20.0.136";

#ConnectPeer = "pgw.localdomain" { ConnectTo = "127.0.0.3"; No_TLS; };
ConnectPeer = "pgw.localdomain" { ConnectTo = "10.20.0.135"; No_TLS; };
3-12.ip forwarding設定

設定変更箇所のみ抜粋。

vi /etc/sysctl.conf

追記:青 コメントアウト&追記:緑

#net.ipv4.ip_forward=0
net.ipv4.ip_forward=1

即時反映させる場合は以下のコマンド。

sh -c "echo 1 > /proc/sys/net/ipv4/ip_forward"
3-13.NextEPC起動

「-d」オプションはDaemonとして起動させます。

/root/nextepc/install/bin/nextepc-epcd -d

出力例
以下のようにDaemonが起動していればOKです。

root@u16c132:~# /root/nextepc/install/bin/nextepc-epcd -d
NextEPC daemon v0.3.10 - Oct 20 2019 23:04:44

[10/20 23:18:44.126] WARN: pid file /root/nextepc/install/var/run/nextepc-epcd/pid overwritten -- Unclean shutdown of previous NextEPC run? (application.c:133)
  PID[2136] : '/root/nextepc/install/var/run/nextepc-epcd/pid'
root@u16c132:~#   File Logging : '/root/nextepc/install/var/log/nextepc/nextepc.log'
  MongoDB URI : 'mongodb://localhost/nextepc'
  Configuration : '/root/nextepc/install/etc/nextepc/nextepc.conf'
[10/20 23:18:44.129] PCRF try to initialize
[10/20 23:18:44.148] PCRF initialize...done
[10/20 23:18:44.148] PGW try to initialize
[10/20 23:18:44.207] PGW initialize...done
[10/20 23:18:44.207] gtp_server() [10.20.0.135]:2123
[10/20 23:18:44.208] gtp_server() [10.20.0.135]:2152
[10/20 23:18:44.208] SGW try to initialize
[10/20 23:18:44.209] INFO: CONNECTED TO 'pgw.localdomain' (TCP,soc#7): (fd_logger.c:93)
[10/20 23:18:44.210] INFO: CONNECTED TO 'pcrf.localdomain' (TCP,soc#10): (fd_logger.c:93)
[10/20 23:18:44.217] SGW initialize...done
[10/20 23:18:44.218] gtp_server() [10.20.0.134]:2123
[10/20 23:18:44.218] gtp_server() [10.20.0.134]:2152
[10/20 23:18:44.218] HSS try to initialize
[10/20 23:18:44.268] HSS initialize...done
[10/20 23:18:44.268] MME try to initialize
[10/20 23:18:44.380] gtp_server() [10.20.0.132]:2123
[10/20 23:18:44.380] gtp_client() [10.20.0.134]:2123
[10/20 23:18:44.380] MME initialize...done


[10/20 23:18:44.380] INFO: NextEPC daemon start (main.c:177)
[10/20 23:18:44.381] INFO: CONNECTED TO 'mme.localdomain' (TCP,soc#7): (fd_logger.c:93)
[10/20 23:18:44.381] INFO: CONNECTED TO 'hss.localdomain' (TCP,soc#10): (fd_logger.c:93)
[10/20 23:18:44.387] s1ap_server() [10.20.0.132]:36412

終了させるときは、kill -9などで停止させてください。


分離させた後は以下のコマンドで個別に起動させますが、後ほど詳しく紹介します。

#u16c132:MME,HSS,SGW
/root/nextepc/install/bin/nextepc-sgwd -d
/root/nextepc/install/bin/nextepc-hssd -d
/root/nextepc/install/bin/nextepc-mmed -d

#u16c135:PGW,PCRF
/root/nextepc/install/bin/nextepc-pcrfd -d
/root/nextepc/install/bin/nextepc-pgwd -d

4.OAISIM設定

4-1.git リポジトリの取得
apt-get install git && \
git clone https://gitlab.eurecom.fr/oai/openairinterface5g.git && \
cd /root/openairinterface5g && \
git reset --hard 67df8e0e7b46200b2ee43a2705def3340ddfd719
4-2.SIM情報の設定

変更箇所のみ抜粋。UEを2台アタッチさせられるように1台追加しています。

vi /root/openairinterface5g/openair3/NAS/TOOLS/ue_eurecom_test_sfr.conf

#画面下の方にスクロール

追記:青 コメントアウト&追記:緑

UE0:
{
    USER: {
        IMEI="356113022094149";
        MANUFACTURER="EURECOM";
        MODEL="LTE Android PC";
        PIN="0000";
    };

    SIM: {
        MSIN="0100001111";
        USIM_API_K="8baf473f2f8fd09487cccbd7097c6862";
        OPC="e734f8734007d6c5ce7a0508809e7e9c";
        MSISDN="33611123456";
    };

    # Home PLMN Selector with Access Technology
#    HPLMN= "20893";
    HPLMN= "00101";

    # User controlled PLMN Selector with Access Technology
    UCPLMN_LIST = ();

    # Operator PLMN List
    OPLMN_LIST = ("00101", "20810", "20811", "20813", "20893", "310280", "310028");

    # Operator controlled PLMN Selector with Access Technology
    OCPLMN_LIST = ("22210", "21401", "21406", "26202", "26204");

    # Forbidden plmns
    FPLMN_LIST = ();

    # List of Equivalent HPLMNs
#TODO: UE does not connect if set, to be fixed in the UE
#    EHPLMN_LIST= ("20811", "20813");
    EHPLMN_LIST= ();
};

UE1:
{
    USER: {
        IMEI="356113022094150";
        MANUFACTURER="EURECOM";
        MODEL="LTE Android PC";
        PIN="0000";
    };

    SIM: {
        MSIN="0100001112";
        USIM_API_K="8baf473f2f8fd09487cccbd7097c6862";
        OPC="e734f8734007d6c5ce7a0508809e7e9c";
        MSISDN="33611123457";
    };

    # Home PLMN Selector with Access Technology
    HPLMN= "00101";

    # User controlled PLMN Selector with Access Technology
    UCPLMN_LIST = ();

    # Operator PLMN List
    OPLMN_LIST = ("00101", "20810", "20811", "20813", "20893", "310280", "310028");

    # Operator controlled PLMN Selector with Access Technology
    OCPLMN_LIST = ("22210", "21401", "21406", "26202", "26204");

    # Forbidden plmns
    FPLMN_LIST = ();

    # List of Equivalent HPLMNs
#TODO: UE does not connect if set, to be fixed in the UE
#    EHPLMN_LIST= ("20811", "20813");
    EHPLMN_LIST= ();
};
4-3.ビルド
cd /root/openairinterface5g/cmake_targets && \
./build_oai -I --oaisim --install-system-files

ビルドの最後の方で、以下のように文字化けしますが、ビルドは正常に完了している(ハズなので)ので、exitで抜けて、再度ログインし直してください。

出力例
文字化けしますが、前項で修正したue_eurecom_test_sfr.confの変更点が反映されていることが確認できます。
赤文字箇所

Log file for compilation has been written to: /root/openairinterface5g/cmake_targets/log/usim.Rel14.txt
usim compiled
Log file for compilation has been written to: /root/openairinterface5g/cmake_targets/log/nvram.Rel14.txt
nvram compiled
Log file for compilation has been written to: /root/openairinterface5g/cmake_targets/log/conf2uedata.Rel14.txt
conf2uedata compiled
generate .ue_emm.nvram .ue.nvram

UE's non-volatile data:

IMEI            = 356113022094149
manufacturer    = EURECOM
model           = LTE Android PC
PIN             = 0000
UE identity data file: /root/openairinterface5g/targets/bin/.ue.nvram0

EMM non-volatile data:

IMSI            = 001.010.100001111
RPLMN           = 00101
EPS Mobility Management data file: /root/openairinterface5g/targets/bin/.ue_emm.nvram0

UE's non-volatile data:

IMEI            = 356113022094150
manufacturer    = EURECOM
model           = LTE Android PC
PIN             = 0000
UE identity data file: /root/openairinterface5g/targets/bin/.ue.nvram1

EMM non-volatile data:

IMSI            = 001.010.100001112
RPLMN           = 00101
EPS Mobility Management data file: /root/openairinterface5g/targets/bin/.ue_emm.nvram1
generate .usim.nvram

USIM data:

Administrative Data:
        UE_Operation_Mode       = 0x00
        Additional_Info         = 0xffff
        MNC_Length              = 2

IMSI:
        length  = 8
        parity  = Odd
        digits  = 15
        digits  = 001010100001111

Ciphering and Integrity Keys:
        KSI     : 0x07
        CK      : ""
        IK      : ""

        usim_api_k: 8b af 47 3f 2f 8f d0 94 87 cc cb d7 09 7c 68 62
        opc       : e7 34 f8 73 40 07 d6 c5 ce 7a 05 08 80 9e 7e 9c

EPS NAS security context:
        KSIasme : 0x07
        Kasme   : ""
        ulNAScount      : 0x00000000
        dlNAScount      : 0x00000000
        algorithmID     : 0x02

MSISDN  = 336 1112 3456

PNN[0]  = {Test network, OAI4G}
PNN[1]  = {SFR France, SFR}
PNN[2]  = {SFR France, SFR}
PNN[3]  = {SFR France, SFR}
PNN[4]  = {OAI LTEBOX, OAIALU}
PNN[5]  = {T-Mobile USA, T-MobileCニノテヤノヤノマユモ ユモチ
ミホホロカン  ス 鈼ノテヤノヤノマユモ ユモチャ ニノテヤノヤノマ
ミホホロキン  ス 譿 

マミフローン  ス ーーアーアャ ヤチテ ス ローーーア ュ 跏趾ンャ 胥゚鱠 ス ー
マミフロアン  ス イークアーャ ヤチテ ス ローーーア ュ 跏趾ンャ 胥゚鱠 ス ア

~~~ 中略 ~~~

ホチモテマホニノヌコ
        ホチモ゚モ鱸髜・鴃醪・鴟・         コ ーー
        ホヘマ゚ノ゚ツ裴磋鴆                 コ ーー
        チ矼鞅鴟靄炫・                 コ ーア
        ヘ鴃鳫ミ褪鴆蓚耨裔靫鳫褪      コ ーー
        ナ褓蒟菽聽褫碪鰀           コ ーー
        ヤ鳫褪゚ヤウイエオ゚ツ裴磋鴆           コ ーー
ユモノヘ 蓊 跌・コ ッ・ッ・褓硅ⅵ褪趁肄オ遽襁粳鉧ョ鳫ョⅷ敎
フ・ 跌・ 跣・胥瀇鴈磑鴆・鞦・粢褓 鴟・コ ッ・ッ・褓硅ⅵ褪趁肄オ遽肬硴裃襁・遽・鱇襁鞜碚ョメ褌アエョ・
・鱇襁鞜碚 胥瀇鴈裝
・糀硅゚碚ョ 鴣 ・鸙裝  ナヤネナメホナヤ ・糘碪・
アーョ ツ碯鰀 ・ヤ褫 ョョョ
・タカ羈ウアコッ・褓硅ⅵ褪趁肄オ遽肬硴裃襁

<補足1>
ビルド実行時、バイナリ化されたnvramファイル*4にSIM情報が書き込まれ、以下のパスに保存されます。*5

/openairinterface5g/targets/bin

SIM情報を追加・変更・削除したい場合は、以下のファイルを再度編集の上、

vi /root/openairinterface5g/openair3/NAS/TOOLS/ue_eurecom_test_sfr.conf

以下のコマンドで再ビルドしてください。

./build_oai -c --oaisim

<補足2>
以前*6は、以下のコマンドにてSIM情報の書き換えが可能でした。

cd ~/openairinterface5g/targets/bin/
./conf2uedata -c /root/openairinterface5g/openair3/NAS/TOOLS/ue_eurecom_test_sfr.conf -o ./

しかし、今回利用したリポジトリ

git reset --hard 67df8e0e7b46200b2ee43a2705def3340ddfd719

では、
conf2uedataコマンドを実行しても変更したSIM情報がnvramファイルに反映されなかったので、再ビルドしたところ正常に反映されました。

4-4.S1インターフェース周りの設定
vi /root/openairinterface5g/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_mme.conf

修正箇所

    mobile_country_code =  "001";

    mobile_network_code =  "01";

#画面下の方までスクロール

    ////////// MME parameters:
    mme_ip_address      = ( { ipv4       = "10.20.0.132";
                              ipv6       = "192:168:30::17";
                              active     = "yes";
                              preference = "ipv4";
                            }
                          );

    NETWORK_INTERFACES :
    {
        ENB_INTERFACE_NAME_FOR_S1_MME            = "ens35";
        ENB_IPV4_ADDRESS_FOR_S1_MME              = "10.20.0.131/24";

        ENB_INTERFACE_NAME_FOR_S1U               = "ens35";
        ENB_IPV4_ADDRESS_FOR_S1U                 = "10.20.0.131/24";
        ENB_PORT_FOR_S1U                         = 2152; # Spec 2152
    };
4-5.UEの起動台数変更
vi /root/openairinterface5g/cmake_targets/tools/run_enb_ue_virt_s1

修正箇所

#vi上で、「AAWG」で検索してください。

#  exe_arguments="$exe_arguments -s15 -AAWGN -y1 -b1 -u1 -Q0"
  exe_arguments="$exe_arguments -s15 -AAWGN -y1 -b1 -u2 -Q0"
4-6.eNB起動

以下のコマンドでeNBを起動させます。

/root/openairinterface5g/cmake_targets/tools/run_enb_ue_virt_s1

もし、u16c132:NextEPC側でEPC関連サービスを起動していない場合は、先に以下のコマンドを実行してから、上記のeNB起動を行ってください。

/root/nextepc/install/bin/nextepc-epcd -d

出力例1
u16c132:EPC側の出力例

root@u16c132:~# /root/nextepc/install/bin/nextepc-epcd -d
NextEPC daemon v0.3.10 - Oct 20 2019 23:04:44

[10/21 00:16:27.288] WARN: pid file /root/nextepc/install/var/run/nextepc-epcd/pid overwritten -- Unclean shutdown of previous NextEPC run? (application.c:133)
root@u16c132:~#   PID[2495] : '/root/nextepc/install/var/run/nextepc-epcd/pid'
  File Logging : '/root/nextepc/install/var/log/nextepc/nextepc.log'
  MongoDB URI : 'mongodb://localhost/nextepc'
  Configuration : '/root/nextepc/install/etc/nextepc/nextepc.conf'
[10/21 00:16:27.290] PCRF try to initialize
[10/21 00:16:27.344] PCRF initialize...done
[10/21 00:16:27.346] PGW try to initialize
[10/21 00:16:27.418] PGW initialize...done
[10/21 00:16:27.418] gtp_server() [10.20.0.135]:2123
[10/21 00:16:27.418] gtp_server() [10.20.0.135]:2152
[10/21 00:16:27.420] SGW try to initialize
[10/21 00:16:27.420] INFO: CONNECTED TO 'pgw.localdomain' (TCP,soc#7): (fd_logger.c:93)
[10/21 00:16:27.421] INFO: CONNECTED TO 'pcrf.localdomain' (TCP,soc#13): (fd_logger.c:93)
[10/21 00:16:27.426] SGW initialize...done
[10/21 00:16:27.427] gtp_server() [10.20.0.134]:2123
[10/21 00:16:27.427] gtp_server() [10.20.0.134]:2152
[10/21 00:16:27.427] HSS try to initialize
[10/21 00:16:27.462] HSS initialize...done
[10/21 00:16:27.462] MME try to initialize
[10/21 00:16:27.583] MME initialize...done


[10/21 00:16:27.584] INFO: NextEPC daemon start (main.c:177)
[10/21 00:16:27.584] INFO: CONNECTED TO 'mme.localdomain' (TCP,soc#7): (fd_logger.c:93)
[10/21 00:16:27.584] INFO: CONNECTED TO 'hss.localdomain' (TCP,soc#10): (fd_logger.c:93)
[10/21 00:16:27.584] gtp_server() [10.20.0.132]:2123
[10/21 00:16:27.584] gtp_client() [10.20.0.134]:2123
[10/21 00:16:27.584] s1ap_server() [10.20.0.132]:36412

#NextEPC起動時はここまで出力されます。
eNBが起動しS1の通信が開始&アタッチ処理が正常に完了すると、さらに以下のログが出力されます。
UEにアドレスがアサインされていることが確認できます。

[10/21 00:18:07.933] eNB-S1 accepted[10.20.0.131]:36412 in s1_path module
[10/21 00:18:07.934] eNB-S1 accepted[10.20.0.131] in master_sm module
[10/21 00:18:13.416] gtp_client() [10.20.0.132]:2123
[10/21 00:18:13.416] gtp_client() [10.20.0.135]:2123
[10/21 00:18:13.416] gtp_client() [10.20.0.134]:2123
[10/21 00:18:13.416] UE IPv4:[25.0.0.2] IPv6:
[10/21 00:18:13.416] gtp_client() [10.20.0.134]:2152
[10/21 00:18:13.419] gtp_client() [10.20.0.135]:2152
[10/21 00:18:13.821] gtp_client() [10.20.0.131]:2152
[10/21 00:18:14.204] UE IPv4:[25.0.0.3] IPv6:

出力例2
u16c131:eNB側の出力例
以下のようなログが最終的に出力している、かつ、UEのIPアドレスが確認できれば、アタッチは正常に完了しています。
ちなみに、eNB側のログは不定期に出力し続けます。また、ErrorやWarning、Fatalといったメッセージも、ちらほら見受けられますが、あまり気にしないでください。
eNB起動時のログは大量に出力されるため、こちらにアップしました。

[SCTP][I][4][50] Msg of length 62 received from port 36412, on stream 1, PPID 18
[S1AP][I]Decoding message S1ap_DownlinkNASTransportIEs (/root/openairinterface5g/cmake_targets/oaisim_build_oai/build/CMakeFiles/R10.5/s1ap_decoder.c:3150)
[RRC][I][eNB 0] Received S1AP_DOWNLINK_NAS: ue_initial_id 0, eNB_ue_s1ap_id 116541
[PDCP][I][FRAME 00000][eNB][MOD 00][RNTI c745]Received RRC_DCCH_DATA_REQ from TASK_RRC_ENB: instance 0, rb_id 2, muiP 6, confirmP 0, mode 1
[RLC][I][FRAME 00000][eNB][MOD 00][RNTI c745][SRB AM 02] RLC_AM_DATA_REQ size 44 Bytes,  NB SDU 1 current_sdu_index=0 next_sdu_index=1 conf 0 mui 6 vtA 0 vtS 0
[MAC][I][eNB 0], Frame 72, DCCH1->DLSCH, CC_id 0, Requesting 125 bytes from RLC (RRC message)
[PHY][E]Format1A Retransmission but TBS are different: consider it as new transmission !!!
[OSA][E]Mismatch found in integrity for algorithm 2,
        got 60.38.89.c0, expecting 00.00.00.00
[PDCP][E][OSA][RB 2] UE failed to validate MAC-I of incoming PDU
[RRC][N][UE 0] Frame 72: received a DCCH 2 message on SRB 2 with Size 39 from eNB 0
[RRC][E][UE 0] Frame 72: Received message on DL-DCCH (SRB2), should not have ...
[MAC][I][eNB 0], Frame 73, DCCH1->DLSCH, CC_id 0, Requesting 125 bytes from RLC (RRC message)
bad DCI 1A !!!
[PHY][I]bad dci mcs + round
bad DCI 1 !!!
[PHY][E][UE  0] Frame 287, subframe 8: Problem in DCI!
[PHY][E]frame 681, subframe 7, rnti c745, format 0: FATAL ERROR: generate_ue_ulsch_params_from_dci, rb_alloc[450] > RIV_max[324]
[PHY][E]Wrong DCI0 detection, do not transmit PUSCH for HARQID: 5
[PHY][I][UE  0] frame 683, subframe 2: received DCI 0 with RNTI=0 (C-RNTI:c745, CBA_RNTI 0) and format 2!
[PHY][I]bad dci rballoc rballoc 7346  RIV_max 324
bad DCI 1 !!!
[PHY][E][UE  1] Frame 795, subframe 9: Problem in DCI!
4-7.UEアドレス確認

oip1というインターフェースに25.0.0.x/8のアドレスがアサインされていれば、UEのアタッチ成功です。
今回はUE0とUE1の2台分のIPアドレスアサインされています。

ip add show

root@u16c131:~# ip add show
1: lo:  mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: ens33:  mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:41:02:e1 brd ff:ff:ff:ff:ff:ff
    inet 192.168.11.131/24 brd 192.168.11.255 scope global ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fe41:2e1/64 scope link
       valid_lft forever preferred_lft forever
3: ens34:  mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether 00:0c:29:41:02:eb brd ff:ff:ff:ff:ff:ff
4: ens35:  mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:41:02:f5 brd ff:ff:ff:ff:ff:ff
    inet 10.20.0.131/24 brd 10.20.0.255 scope global ens35
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fe41:2f5/64 scope link
       valid_lft forever preferred_lft forever
65: oip0:  mtu 1500 qdisc noop state DOWN group default qlen 100
    link/generic 00:00:00:00:00:00:00:00 brd 00:00:00:00:00:00:00:00
66: oip1:  mtu 1500 qdisc pfifo_fast state UNKNOWN group default qlen 100
    link/generic 00:00:00:00:00:00:00:00 brd 00:00:00:00:00:00:00:00
    inet 25.0.0.5/8 brd 25.255.255.255 scope global oip1
       valid_lft forever preferred_lft forever
67: oip2:  mtu 1500 qdisc pfifo_fast state UNKNOWN group default qlen 100
    link/generic 00:00:00:00:00:00:00:00 brd 00:00:00:00:00:00:00:00
    inet 25.0.0.4/8 brd 25.255.255.255 scope global oip2
       valid_lft forever preferred_lft forever
68: oip3:  mtu 1500 qdisc noop state DOWN group default qlen 100
    link/generic 00:00:00:00:00:00:00:00 brd 00:00:00:00:00:00:00:00
~~~ 中略 ~~~
84: oip19:  mtu 1500 qdisc noop state DOWN group default qlen 100
    link/generic 00:00:00:00:00:00:00:00 brd 00:00:00:00:00:00:00:00

SGiのGWアドレスにoip1を指定して、Pingを飛ばしてみてください。*7

root@u16c131:~# ping 10.10.0.254 -I oip1
PING 10.10.0.254 (10.10.0.254) from 25.0.0.5 oip1: 56(84) bytes of data.
64 bytes from 10.10.0.254: icmp_seq=1 ttl=63 time=131 ms
64 bytes from 10.10.0.254: icmp_seq=2 ttl=63 time=86.7 ms
64 bytes from 10.10.0.254: icmp_seq=3 ttl=63 time=98.3 ms
64 bytes from 10.10.0.254: icmp_seq=4 ttl=63 time=83.4 ms
^C
--- 10.10.0.254 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3001ms
rtt min/avg/max/mdev = 83.452/99.940/131.223/18.888 ms
4-8.route追加

うまくPingが飛ばない場合は、u16c131側にDefaultGWアドレスを設定し、既存のDefaultGWアドレスは削除してみてください。

DefaultGWアドレスの設定

route add default gw 25.0.0.1

既存DefaultGWアドレスの削除

vi /etc/network/interfaces

削除箇所

auto ens33
iface ens33 inet static
    address 192.168.11.131
    netmask 255.255.255.0
    gateway 192.168.11.1
    dns-nameserver 192.168.11.1

auto ens35
iface ens35 inet static
    address 10.20.0.131
    netmask 255.255.255.0

systemctl restart networking

ここまでで、ほぼ完成です。
あとは、MVNOライクにS5/S8でSPGWを分離する手順となります。

Pingが飛ばなかったり、IPアドレスアサインされない場合は、u16c132のens35とens34をtcpdumpしてみてください。*8

5.NextEPCの分離

5-1.クローン作成&u16c135の起動

u16c132をシャットダウン後、u16c132のクローンをu16c135として作成してください。
u16c135を起動後、ネットワーク設定やホスト名を以下のように変更します。

#u16c135の設定

vi /etc/network/interfaces

追記箇所 修正箇所 削除箇所

auto ens33
iface ens33 inet static
    address 192.168.11.135
    netmask 255.255.255.0
    gateway 192.168.11.1
    dns-nameserver 192.168.11.1

auto ens34
iface ens34 inet static
    address 10.10.0.135
    netmask 255.255.255.0
    gateway 10.10.0.254

auto ens35
iface ens35 inet static
    address 10.20.0.135
    netmask 255.255.255.0

auto ens35:3
iface ens35:3 inet static
    address 10.20.0.133
    netmask 255.255.255.0

auto ens35:4
iface ens35:4 inet static
    address 10.20.0.134
    netmask 255.255.255.0

auto ens35:5
iface ens35:5 inet static
    address 10.20.0.135
    netmask 255.255.255.0

auto ens35:6
iface ens35:6 inet static
    address 10.20.0.136
    netmask 255.255.255.0

#ホスト名の変更 
vi /etc/hostname

u16c135

#再起動
reboot 
5-2.u16c132のネットワーク設定変更

u16c132を起動してください。そして、以下の通りネットワーク設定を変更してください。

#u16c132の設定

vi /etc/network/interfaces

削除箇所

auto ens33
iface ens33 inet static
    address 192.168.11.132
    netmask 255.255.255.0
    gateway 192.168.11.1
    dns-nameserver 192.168.11.1

auto ens34
iface ens34 inet static
    address 10.10.0.135
    netmask 255.255.255.0

auto ens35
iface ens35 inet static
    address 10.20.0.132
    netmask 255.255.255.0

auto ens35:3
iface ens35:3 inet static
    address 10.20.0.133
    netmask 255.255.255.0

auto ens35:4
iface ens35:4 inet static
    address 10.20.0.134
    netmask 255.255.255.0

auto ens35:5
iface ens35:5 inet static
    address 10.20.0.135
    netmask 255.255.255.0

auto ens35:6
iface ens35:6 inet static
    address 10.20.0.136
    netmask 255.255.255.0

#再起動
reboot 
5-3.各種サービス起動

S5/S8でSPGW間を分離していますので、

/root/nextepc/install/bin/nextepc-epcd -d

は使用せず、それぞれ個別にサービスを起動します。

u16c132 MME, HSS, SGW
u16c135 PGW, PCRF
#u16c132のサービス起動:MME, HSS, SGW
/root/nextepc/install/bin/nextepc-sgwd -d
/root/nextepc/install/bin/nextepc-hssd -d
/root/nextepc/install/bin/nextepc-mmed -d

#u16c135のサービス起動:PGW, PCRF
/root/nextepc/install/bin/nextepc-pcrfd -d
/root/nextepc/install/bin/nextepc-pgwd -d
5-4.eNBの起動

以下のコマンドで再度eNBを起動します。
S5/S8で分離されても、「4-6.eNB起動」以降で動作確認したのと同様に疎通確認してください。

#u16c131で実行

/root/openairinterface5g/cmake_targets/tools/run_enb_ue_virt_s1
5-5.起動時のログ

eNB起動時の

  • u16c132:MME,HSS,SGW
  • u16c135:PGW,PCRF

におけるログとPcapファイルをアップしておきます。
なお、u16c131:UE,eNBの出力ログは4-6の出力例2に載せたものと同様です。

#u16c132の出力例

root@u16c132:~# /root/nextepc/install/bin/nextepc-sgwd -d
root@u16c132:~# /root/nextepc/install/bin/nextepc-hssd -d
root@u16c132:~# /root/nextepc/install/bin/nextepc-mmed -d
NextEPC daemon v0.3.10 - Oct 20 2019 23:04:44
  PID[1857] : '/root/nextepc/install/var/run/nextepc-sgwd/pid'
  File Logging : '/root/nextepc/install/var/log/nextepc/nextepc.log'
  MongoDB URI : 'mongodb://localhost/nextepc'
  Configuration : '/root/nextepc/install/etc/nextepc/nextepc.conf'
[10/21 00:59:10.412] SGW try to initialize
NextEPC daemon v0.3.10 - Oct 20 2019 23:04:44
  PID[1860] : '/root/nextepc/install/var/run/nextepc-hssd/pid'
  File Logging : '/root/nextepc/install/var/log/nextepc/nextepc.log'
  MongoDB URI : 'mongodb://localhost/nextepc'
  Configuration : '/root/nextepc/install/etc/nextepc/nextepc.conf'
[10/21 00:59:10.421] HSS try to initialize
NextEPC daemon v0.3.10 - Oct 20 2019 23:04:44
[10/21 00:59:10.463] HSS initialize...done
[10/21 00:59:10.464] INFO: NextEPC daemon start (main.c:177)
  PID[1873] : '/root/nextepc/install/var/run/nextepc-mmed/pid'
  File Logging : '/root/nextepc/install/var/log/nextepc/nextepc.log'
  MongoDB URI : 'mongodb://localhost/nextepc'
  Configuration : '/root/nextepc/install/etc/nextepc/nextepc.conf'
[10/21 00:59:10.466] MME try to initialize
[10/21 00:59:10.478] SGW initialize...done
[10/21 00:59:10.478] INFO: NextEPC daemon start (main.c:177)
[10/21 00:59:10.478] gtp_server() [10.20.0.134]:2123
[10/21 00:59:10.478] gtp_server() [10.20.0.134]:2152
[10/21 00:59:10.607] gtp_server() [10.20.0.132]:2123
[10/21 00:59:10.607] gtp_client() [10.20.0.134]:2123
[10/21 00:59:10.607] MME initialize...done
[10/21 00:59:10.607] INFO: NextEPC daemon start (main.c:177)
[10/21 00:59:10.608] INFO: CONNECTED TO 'mme.localdomain' (TCP,soc#8): (fd_logger.c:93)
[10/21 00:59:10.608] INFO: CONNECTED TO 'hss.localdomain' (TCP,soc#11): (fd_logger.c:93)
[10/21 00:59:10.615] s1ap_server() [10.20.0.132]:36412

~~~以下はeNBが接続してきた際に出力されるログ~~~
[10/21 01:00:41.550] eNB-S1 accepted[10.20.0.131]:36412 in s1_path module
[10/21 01:00:41.550] eNB-S1 accepted[10.20.0.131] in master_sm module
[10/21 01:00:46.461] gtp_client() [10.20.0.132]:2123
[10/21 01:00:46.461] gtp_client() [10.20.0.135]:2123
[10/21 01:00:46.466] gtp_client() [10.20.0.135]:2152
[10/21 01:00:46.868] gtp_client() [10.20.0.131]:2152

#u16c135の出力例

root@u16c135:~# /root/nextepc/install/bin/nextepc-pcrfd -d
root@u16c135:~# /root/nextepc/install/bin/nextepc-pgwd -d
NextEPC daemon v0.3.10 - Oct 20 2019 23:04:44
  PID[1870] : '/root/nextepc/install/var/run/nextepc-pcrfd/pid'
  File Logging : '/root/nextepc/install/var/log/nextepc/nextepc.log'
NextEPC daemon v0.3.10 - Oct 20 2019 23:04:44
MongoDB URI : 'mongodb://localhost/nextepc'
  Configuration : '/root/nextepc/install/etc/nextepc/nextepc.conf'
[10/21 00:59:23.198] PCRF try to initialize
  PID[1873] : '/root/nextepc/install/var/run/nextepc-pgwd/pid'
  File Logging : '/root/nextepc/install/var/log/nextepc/nextepc.log'
  MongoDB URI : 'mongodb://localhost/nextepc'
  Configuration : '/root/nextepc/install/etc/nextepc/nextepc.conf'
[10/21 00:59:23.199] PGW try to initialize
[10/21 00:59:23.235] PCRF initialize...done
[10/21 00:59:23.236] INFO: NextEPC daemon start (main.c:177)
[10/21 00:59:23.352] PGW initialize...done
[10/21 00:59:23.352] INFO: NextEPC daemon start (main.c:177)
[10/21 00:59:23.352] gtp_server() [10.20.0.135]:2123
[10/21 00:59:23.352] gtp_server() [10.20.0.135]:2152
[10/21 00:59:23.354] INFO: CONNECTED TO 'pgw.localdomain' (TCP,soc#9): (fd_logger.c:93)
[10/21 00:59:23.355] INFO: CONNECTED TO 'pcrf.localdomain' (TCP,soc#13): (fd_logger.c:93)

~~~以下はUEにIPアドレスアサインされた際に出力されるログ~~~
[10/21 01:00:46.409] gtp_client() [10.20.0.134]:2123
[10/21 01:00:46.409] UE IPv4:[25.0.0.2] IPv6:
[10/21 01:00:46.409] gtp_client() [10.20.0.134]:2152
[10/21 01:00:46.573] UE IPv4:[25.0.0.3] IPv6:

eNB起動時のPcapファイルはこちらにアップしました。
u16c135のens35でpcapしています。

以上です。

6.最後に

以下のサイトを参考にさせて頂きました。
【プライベートLTE】 第3回:プライベートLTE設備の構築 ~Open Air Interface(OAISIM)による端末(UE)・基地局(eNB)擬似環境の紹介~
LTEを自作してみる(Part2) - Qiita
LTEを自作してみる(Part3) - Qiita

最初の記事が@m0ch1_m0ch1さん、残り2つの記事が@K5Kさんによって書かれています。
お二方はE-UTRANやEPCに関して造詣が深く、大変よくまとめられた記事となっており、これらのサイトが無ければ、今回の記事は書けなかったので、ぜひぜひ読んでみてください。

私個人的にですが、モバイルネットワークの技術は、もっとコモディティ化してもよいと考えています。
最近、プライベートLTEやローカル5Gといった言葉(キーワード)をよく耳にしますが、誰でも簡単に扱えるか?というと、まだもう少し時間がかかるのだろうと思います。
とはいえ、ただただ時間が経つのを待っていれば扱えるようになるか?といえば、それもまた違うと思うで、自ら積極的かつ能動的にこれらの技術を獲りに行ける環境を、まずは構築してみるのが良いのでは?と考えています。

今回の記事はまだ初期段階ですが、次のステップとしては、最初に書いたようなことに加えて、

  • LXC/LXDやDockerなどでコンテナ化してみる
  • SGi側でBGPがしゃべれるようにQuaggaを入れてみる
  • OAISIMが重く不安定なのでリッチな物理サーバに換装してみる

など、色々できることはあるのかなと考えています

*1:MME,HSS,SGW,PGW,PCRF

*2:S5/S8でMME, HSS, SGWとPGW, PCRFを2つのNextEPCに分離します。

*3:分離する際に削除すればいいので。

*4:出力例に表示されている通り、.ue.nvram0とか.ue.nvram1など

*5:本来はUSRPなどでH/W処理されるプロセスをOAISIMとしてS/Wでシミュレートするためバイナリ化するのだと考えています。実際、バイナリ化していても、UE&eNodeBを起動すると、4CoreのCPU使用率が30~40%くらいで推移するため、S/Wでシミュレートするには相当負荷が掛かる処理のようです。

*6:v0.6.1のbranchでは大丈夫でした。

*7:GWアドレスを持つL3デバイスに25.0.0.0/8宛の戻り経路を忘れずに設定してください。

*8:出力例2にも記載しましたが、Phy層でFatal Errorなどのログが出力されていてもPingが飛びます。このため、一度でも成功したことがないと、どういう状態になっていればOKか?の判断が極めて困難だと思います。私自身も最初は勘所が全く掴めなかったので苦労しました。