Metonymical Deflection

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

CentOS7 NextEPCによるEPC構築方法

前回記事のスピンオフとして、CentOS7でのNextEPCの構築方法を記載します。

Redhat系の方が使い慣れている人には最適かなと思います。

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                               : CentOS Linux release 7.7.1908 (Core)
Kernel                           : 3.10.0-1062.el7.x86_64
Installed Environment Groups     : Server with GUI
Add-Ons for Selected Environment : Virtualization Client, Virtualization Hypervisor, Virtualization Tools, development
1-2.全体構成

f:id:metonymical:20191022195027p:plain
緑色の箇所がUbuntu16.04からCentOS7.7に変わっています。
それ以外は全て同じです。

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

2.事前準備

2-1.c77g132:NextEPCのNW設定
nmcli con add type tun mode tun autoconnect yes ifname pgwtun con-name pgwtun
nmcli con mod pgwtun ipv4.method manual ipv4.addresses 25.0.0.1/8
nmcli con mod pgwtun ipv6.method manual ipv6.addresses cafe::1/64
nmcli con up pgwtun

nmcli con add type ethernet autoconnect yes ifname ens33 con-name ens33
nmcli con mod ens33 ipv4.method manual ipv4.addresses 10.10.0.135/24
nmcli con up ens33

nmcli con add type ethernet autoconnect yes ifname ens35 con-name ens35
nmcli con mod ens35 ipv4.method manual ipv4.addresses 10.20.0.132/24
nmcli con mod ens35 ipv4.method manual +ipv4.addresses 10.20.0.133/24
nmcli con mod ens35 ipv4.method manual +ipv4.addresses 10.20.0.134/24
nmcli con mod ens35 ipv4.method manual +ipv4.addresses 10.20.0.135/24
nmcli con mod ens35 ipv4.method manual +ipv4.addresses 10.20.0.136/24
nmcli con up ens35

3.NextEPC設定

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

3-1.MongoDBのインストール
sudo sh -c 'cat << EOF > /etc/yum.repos.d/mongodb-org-3.4.repo
[mongodb-org-3.4]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/\$releasever/mongodb-org/3.4/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-3.4.asc
EOF'

yum -y install mongodb-org && \
systemctl start mongod && \
systemctl enable mongod
3-2.mongo-c-driver-develのインストール
yum -y install epel-release && \
yum -y install mongo-c-driver-devel

<補足>
NextEPCの公式サイトを読むと、外部サイトを参照することになります。
そこでは、

yum install mongo-c-driver

と記載されていますが、これをそのまま真に受けると、makeファイル作成時にエラーを吐いて止まります。
NextEPCのビルドで必要とされるのは、mongo-c-driver-develの方です。*2

3-3.依存関係パッケージのインストール
yum -y install git flex bison autoconf libtool \
lksctp-tools-devel libidn-devel gnutls-devel libgcrypt-devel \
openssl-devel cyrus-sasl-devel libyaml-devel
3-4.ビルド
git clone https://github.com/nextepc/nextepc && \
cd nextepc && \
autoreconf -iv

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

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

#サービス起動
npm run dev

#2回目以降、起動する際はwebuiのディレクトリに入った状態で実行してください。
cd /root/nextepc/webui && \
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は任意で構いません。

3-7.nextepc.conf設定

設定変更箇所のみ抜粋。*3

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; };

#もしくは
sed -i -e /^ListenOn/s/127.0.0.2/10.20.0.132/g \
/root/nextepc/install/etc/nextepc/freeDiameter/mme.conf
sed -i -e /^ConnectPeer/s/127.0.0.4/10.20.0.133/g \
/root/nextepc/install/etc/nextepc/freeDiameter/mme.conf
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; };

#もしくは
sed -i -e /^ListenOn/s/127.0.0.4/10.20.0.133/g \
/root/nextepc/install/etc/nextepc/freeDiameter/hss.conf
sed -i -e /^ConnectPeer/s/127.0.0.2/10.20.0.132/g \
/root/nextepc/install/etc/nextepc/freeDiameter/hss.conf
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; };

#もしくは
sed -i -e /^ListenOn/s/127.0.0.3/10.20.0.135/g \
/root/nextepc/install/etc/nextepc/freeDiameter/pgw.conf
sed -i -e /^ConnectPeer/s/127.0.0.5/10.20.0.136/g \
/root/nextepc/install/etc/nextepc/freeDiameter/pgw.conf
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; };

#もしくは
sed -i -e /^ListenOn/s/127.0.0.5/10.20.0.136/g \
/root/nextepc/install/etc/nextepc/freeDiameter/pcrf.conf
sed -i -e /^ConnectPeer/s/127.0.0.3/10.20.0.135/g \
/root/nextepc/install/etc/nextepc/freeDiameter/pcrf.conf
3-12.ip forwarding設定

最終行に追記

vi /etc/sysctl.d/99-sysctl.conf

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@c77g132:~# /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@c77g132:~#   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などで停止させてください。

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

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

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

4.OAISIM設定

省略します。
前回記事を参照してください。

5.NextEPCの分離

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

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

#c77g135の設定
nmcli con del ens35
nmcli con add type ethernet autoconnect yes ifname ens35 con-name ens35
nmcli con mod ens35 ipv4.method manual ipv4.addresses 10.20.0.135/24
nmcli con mod ens35 ipv4.method manual +ipv4.addresses 10.20.0.136/24
nmcli con up ens35

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

c77g135

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

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

#c77g132の設定
nmcli con mod ens35 ipv4.method manual -ipv4.addresses 10.20.0.135/24
nmcli con mod ens35 ipv4.method manual -ipv4.addresses 10.20.0.136/24
nmcli con up ens35

nmcli con del ens33
nmcli con del pgwtun

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

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

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

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

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

#c77g135のサービス起動:PGW, PCRF
/root/nextepc/install/bin/nextepc-pcrfd -d
/root/nextepc/install/bin/nextepc-pgwd -d

これ以降は前回記事を参照してください。

以上です。

6.最後に

以下のサイトを参考にさせて頂きました。
NextEPC | Installation | CentOS
Installing the MongoDB C Driver (libmongoc) and BSON library (libbson) — MongoDB C Driver 1.15.1

<少し余談な話>
2-1.c77g132:NextEPCのNW設定の項で、UE用インターフェースとしてpgwtunに25.0.0.0/8を設定しましたが、検証用途としてたまに利用させてもらっています。

というのも、
元々25.0.0.0/8のprefixは、英国国防省の機関であるDINSA(Defence Interoperable Network Services Authority)が所有しているそうです。
しかし、既に10年以上(15年くらいだったかも?)、インターネット上にアドバタイズされていないPrefixとなっています。
下記のようなLooking glassサイトで確認しても、フルルート上に載っていないことがわかります。
Looking Glass - NTT - www.gin.ntt.net

この情報ソースは、下記サイトのvirtual-privateの項にNoteとして記載されています。*4
libreswan

そこには、25.0.0.0/8のprefixがあまりにも長期間アドバタイズされていないため、米国のT-MobileやカナダのRogers/Fidoという通信事業者が、CGNATの前で(恐らくUE用として)使用し始めているようだ、と記載されています。

上記のように商用で使うのは、さすがに怖くてできませんが、内部的に閉じられた環境における検証用途*5であれば、Shared Address*6と同様に使ってもよいのかな?と個人的には思います。*7

*1:OAISIMについては、前回記事を参照してください。

*2:よくよく考えれば当たり前なことですし、カーネルのビルドなどをやったことある人であればdevelが必要だと気付けると思うのですが、初めてやる人にとっては、かなり敷居が高いのではないかと個人的には思います。

*3:YAML形式なのでケタ合わせは慎重に。

*4:サイトにアクセス後、25.0で検索すれば見つかります。

*5:一時的に作ってすぐ壊すような環境

*6:100.64.0.0/10として、RFC6598に記載されています。

*7:少なくてもデフォルトで設定されている45.45.0.0/16をそのまま使うのは気が引けたので。