はじめに
OSS LTE(その1)の続きです。前回OAI EPCをセットアップし、起動しました。
今回はOAI SIMでUEとeNodeBをシミュレートして、OAI EPCと接続してみます。
本当ならEUTRAN(enodeB)をセットアップして、UE(スマホ)-EUTRAN-EPCといったような実際にスマホを自作したLTE網を経由してインターネットに接続させるということを
想定していまいsた。しかしEUTRANをセットアップする場合、無線HWを機器に取り付ける必要があるようです。手元に使えそうな無線機器がなかったので今回はOAI SIMをセットアップして、OAI EPCと接続するというおままごとで我慢することにします。
OAI SIM
UEとeNodeBをエミュレートするシュミレータ。ソースファイルはOAI EUTRANのものを使用し、途中のビルド時にOAI SIMをセットアップするオプションを指定するとOAI SIMになるっぽいです(公式のドキュメントには記載ありませんでしたが、触っているとそのような造りになっていることがわかりました)
セットアップ(OAI SIM)
Tutorialにセットアップ手順が記載されていますが、ほぼガン無視でやりました。Ubuntuの推奨バージョンであったり、カーネルのバージョンアップだったり、CPUのチューニング等について記載されていますが、やっておりません。それでも動いたのでヨシとしています。
1.VM作成
以下の通りUbuntu VMを作成します。
- ホスト名: sim01
- OS: Ubuntu 16.04.5
- Spec
- CPU : 4vcore
- Memory : 4GB
- Disk : 50GB
- Network
2.ソースファイルのダウンロード
以下のコミットがスムーズにうごくという噂を聞いたため、ソースファイルのダウンロード後にそのコミットまでロールバックする。
# apt-get install git
# git clone https://gitlab.eurecom.fr/oai/openairinterface5g.git
# cd openairinterface5g
# git reset --hard 67df8e0e7b46200b2ee43a2705def3340ddfd719
3.ビルド
# ./build_oai -I --oaisim --install-system-files
実行後にターミナルが文字化けしてしまいますが、ビルドは成功しています。
一度ターミナルから抜けて、再びログインしてください。
4.設定ファイルの編集
OAI SIMとOAI EPC(もしくはEUTRAN)はデフォルトで接続できるように設定されています。そのためインターフェース設定のみ変更します。
# vi /root/openairinterface5g/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.oaisim.local_mme.conf
141 mme_ip_address = ( { ipv4 = "172.16.0.52";
142 ipv6 = "192:168:30::17";
143 active = "yes";
144 preference = "ipv4";
145 }
146 );
148 NETWORK_INTERFACES :
149 {
150 ENB_INTERFACE_NAME_FOR_S1_MME = "ens9";
151 ENB_IPV4_ADDRESS_FOR_S1_MME = "172.16.0.115/24";
152
153 ENB_INTERFACE_NAME_FOR_S1U = "ens9";
154 ENB_IPV4_ADDRESS_FOR_S1U = "172.16.0.115/24";
155 ENB_PORT_FOR_S1U = 2152; # Spec 2152
5.OAI SIM起動確認
# cd /root/openairinterface5g/cmake_targets/tools/
# ./run_enb_ue_virt_s1
[S1AP][W]Received unsuccessful result for SCTP association (3), instance 0, cnx_id 1
[ENB_APP][I][eNB 0] Received S1AP_REGISTER_ENB_CNF: associated MME 0
[ENB_APP][W] 1 eNB is not associated with a MME, retrying registration in 10 seconds ...
^C
このコマンド実行時、OAI EPCを起動していないため、MMEと接続できないという旨のメッセージが出力されます。そのため一度起動できることを確認したらctrl + Cで抜けてください。
接続(OAI SIM <----> OAI EPC)
1.OAI EPCの起動
# cd openair-cn/scripts/
# ./run_hss
# ./run_mme
# ./run_spgw
SPGW起動後にVMのインターフェースを確認すると、以下のようにgtp0という仮想IFが存在しています。これはPGWのインターフェースであり、接続されたUEはこのインターフェースを経由してインターネットへ接続します。
なおこのインターフェースのIPアドレスはSPGWで設定しているIPV4_LIST(UEのIPアドレスプールレンジ)の先頭アドレスが割り当てられるはずです。
gtp0 Link encap:UNSPEC HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
inet addr:1.1.1.1 P-t-P:1.1.1.1 Mask:255.255.255.0
inet6 addr: fe80::9046:6240:b838:9cfc/64 Scope:Link
UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:3 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
2.OAI SIMの起動
※それぞれの起動は別のターミナルで行ってください。
# cd /root/openairinterface5g/cmake_targets/tools
# ./run_enb_ue_virt_s1
ErrorとかWarningがでてきますが、気にしないでおきましょう。
3.接続確認
MMEを起動したらStatisticsテーブルが出力されます。
OAI SIMとOAI EPCが正しく接続できていれば、StatisticsテーブルのCurrent Status列のカウンターはすべて1になります。
======================================= STATISTICS ============================================
| Current Status| Added since last display| Removed since last display |
Connected eNBs | 1 | 0 | 0 |
Attached UEs | 1 | 0 | 0 |
Connected UEs | 1 | 0 | 0 |
Default Bearers| 1 | 0 | 0 |
S1-U Bearers | 1 | 0 | 0 |
======================================= STATISTICS ============================================
4.インターネットへ接続
OAI SIMのインターフェースを確認するとoip1という仮想インターフェースが存在していることがわかります。これがOAI SIMのUEのインターフェースであり、IPV4_LIST内のIPアドレスが割り当てられていることがわかります。
oip1 Link encap:AMPR NET/ROM HWaddr
inet addr:1.1.1.2 Bcast:1.255.255.255 Mask:255.0.0.0
UP BROADCAST RUNNING NOARP MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:100
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
このIFからPINGを8.8.8.8(Google Public DNSサーバ)に送信して、インターネットとの接続を確認します。ただ今のままではインターネットへのルーティング情報がないため、デフォルトゲートウェイをPGWに向ける必要があります。
以下の通り、PGWにデフォルトゲートウェイを向けるようにします。
# route add default gw 1.1.1.1
# netstat -rn
Kernel IP routing table
Destination Gateway Genmask Flags MSS Window irtt Iface
0.0.0.0 1.1.1.1 0.0.0.0 UG 0 0 0 oip1
1.0.0.0 0.0.0.0 255.0.0.0 U 0 0 0 oip1
10.0.0.0 0.0.0.0 255.255.255.0 U 0 0 0 ens3
172.16.0.0 0.0.0.0 255.255.255.0 U 0 0 0 ens9
これで準備が整いました。それではPINGを送信します。
# ping 8.8.8.8 -I oip1
PING 8.8.8.8 (8.8.8.8) from 1.1.1.2 oip1: 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=49 time=449 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=49 time=169 ms
64 bytes from 8.8.8.8: icmp_seq=3 ttl=49 time=146 ms
64 bytes from 8.8.8.8: icmp_seq=4 ttl=49 time=165 ms
64 bytes from 8.8.8.8: icmp_seq=5 ttl=49 time=185 ms
64 bytes from 8.8.8.8: icmp_seq=6 ttl=49 time=124 ms
64 bytes from 8.8.8.8: icmp_seq=7 ttl=49 time=182 ms
インターネットと接続することができました!
(ちょっと)詳しく見てみる
OAI SIMとOAI EPCが接続されて、OAI SIM内のUEがインターネットと接続できるようになりました。ではOAI SIMとOAI EPC間およびOAI EPC内でどういう通信をしているかパケットキャプチャを行い、通信フローを詳しく見てみます。
OAI SIM-OAI EPCの接続時、OAI EPCのens9とループバックインターフェースでパケットキャプチャを行ってみます。
# tcpdump -i ens9 -w /tmp/epc_ens9.pcap
# tcpdump -i lo -w /tmp/epc_lo.pcap
いくつかのパケットを以下に載せておきます。
Initial UE Message
Authentication-Information Request
Create Session Response
PING(U-Plane通信)
PingのパケットがGTPでカプセリングされていることがわかります。
最後に
これでOAI SIMとOAI EPCを接続することができました。
次回はOAI EPCをdocker上にセットアップしてみようかと思います。
もしくはOAI以外のOSS(NextEPC, srsLTE)をOAI SIMと接続させてみようかと思います。