[新サービス] #SORACOM GateでIoTゲートウェイにアクセスする #scd2016

2016.07.13

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

ども、大瀧です。
本日開催されているイベント「SORACOM Discovery 2016」にて発表された新サービスSORACOM Gateを早速試してみたので、そのレポートをしたいと思います。

本記事はテストフェーズの環境で検証したものです。サービスのベータ/プレビューフェーズとは仕様が異なる場合があります

SORACOM Gateとは

SORACOM GateはSORACOMモバイル閉域網とAmazon VPCを接続するSORACOM Canalのオプションとして利用するサービスです。

SORACOM Canalでは、下図のようにSIM→VPCへのトラフィックがCanalの中継サーバーである仮想プライベートゲートウェイ(以下VPG)でNATされるため、VPC→SIMへの通信ができません

gate01

そこでGateは、VPGとVPCに接続するEC2インスタンス間にVXLANによるL2トンネルを提供することでEC2インスタンスにSORACOMモバイル閉域網のIPアドレス(10.X.X.X)を付与し、VPC→SIMへの通信を可能にします

gate02

SIMをセットするIoTゲートウェイなどのメンテナンスに利用できそうな便利なサービスですね。今回は試しませんが、Gateを有効にするとSIM-SIM同士の通信もVPG経由で行えるようになるとのことです。別の記事でレポートしたいと思います。

設定手順

SORACOM Gateの設定は、soracom-cliを利用します。あらかじめインストールと認証キーの設定を済ませておきましょう。

soracom-cliはバージョン0.1.0以上が必須です。必要に応じて最新バージョンをダウンロードし、上書きしましょう。

また、GateはCanalのオプションとして動作しますので、Canalの構成(VPGの作成とVPCとのピア接続)も済ませておきます。手順はこちらのエントリーを参考にしてください。最近ユーザーコンソールの[閉域網接続]からも設定出来るようになったので、コンソールで作成してもOKです。

1. VXLANインスタンスの準備

Canalで接続したVPCに、VXLANトンネルの接続先となるEC2インスタンスを作成します。OSはVXLANに対応するものであれば特に問いません、今回はAmazon Linuxを利用しました。起動したら、インスタンスのPrivate IPをメモしておきます(このあとのVXLANの構成で利用)。今回は172.21.0.100でした。

また、セキュリティグループでVPG(100.64.0.0/16)からのVXLAN接続(UDP/4789)を許可しておきましょう。

gate05

2. Gateピアの確認

VPGを作成すると、VXLANの接続元となるGateピアが自動で割り当てられます。Gateピアは冗長のために2つ割り当てられ、soracom vpg list-gate-peersで確認します。

suzaku:~ ryuta$ soracom vpg list-gate-peers --vpg-id XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
[
	{
		"innerIpAddress": "10.192.158.132",
		"netmask": "255.128.0.0",
		"outerIpAddress": "100.64.158.132",
		"ownedByCustomer": false
	},
	{
		"innerIpAddress": "10.192.158.4",
		"netmask": "255.128.0.0",
		"outerIpAddress": "100.64.158.4",
		"ownedByCustomer": false
	}
]
suzaku:~ ryuta$

2つのouterIpAddressをメモしておきましょう。このあとVXLANの設定で利用します。

3. Gateピア(EC2インスタンス)の登録

続いて、VXLANトンネルの接続先となるEC2インスタンスをGateピアに登録します。登録はsoracom vpg register-gate-peerコマンドで実行し、--outer-ip-addressオプションにEC2のPrivate IPを指定します。

suzaku:~ ryuta$ soracom vpg register-gate-peer --vpg-id XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX \
                                               --outer-ip-address 172.21.0.100
{
	"innerIpAddress": "10.225.194.171",
	"netmask": null,
	"outerIpAddress": "172.21.0.100",
	"ownedByCustomer": true
}
suzaku:~ ryuta$

レスポンスには、登録したピアのプロパティが返ってきます。先ほどと似たような表示になりますが、ownedByCustomertrueになっていることからユーザーが登録したピアということがわかります。再度soracom vpg list-gate-peersを実行します。

suzaku:~ ryuta$ soracom vpg list-gate-peers --vpg-id XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
[
	{
		"innerIpAddress": "10.192.158.132",
		"netmask": "255.128.0.0",
		"outerIpAddress": "100.64.158.132",
		"ownedByCustomer": false
	},
	{
		"innerIpAddress": "10.192.158.4",
		"netmask": "255.128.0.0",
		"outerIpAddress": "100.64.158.4",
		"ownedByCustomer": false
	},
	{
		"innerIpAddress": "10.225.194.171",
		"netmask": "255.128.0.0",
		"outerIpAddress": "172.21.0.100",
		"ownedByCustomer": true
	}
]
suzaku:~ ryuta$

登録したGateピアのinnerIpAddressnetmaskがEC2インスタンスに設定するVXLANトンネルのIPアドレスとネットマスクになるので、これらもメモしておきましょう。各ピアのouterとinnerが入り乱れてわかりにくいので、以下の図にまとめました。

gate03

4. Gateの有効化

では、 Gateを有効化します。soracom vpg open-gateコマンドを実行します *1

suzaku:~ ryuta$ soracom vpg open-gate --vpg-id XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
{
	"createdTime": 1468221131058,
	"gateOpened": true,
	"lastModifiedTime": 1468223283319,
	"operatorId": "OP0067881737",
	"primaryServiceName": "Canal",
	"status": "running",
	"tags": {
		"name": "Gate-Verification2"
	},
	"type": 12,
	"ueSubnetCidrRange": "10.128.0.0/9",
	"useInternetGateway": true,
	"virtualInterfaces": null,
	"vpcPeeringConnections": {
		"pcx-2055f349": {
			"destinationCidrBlock": "172.21.0.0/16",
			"id": "pcx-2055f349",
			"peerOwnerId": "XXXXXXXXXXXX",
			"peerVpcId": "vpc-1a3b667f"
		}
	},
	"vpgId": "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"
}
$

レスポンスはオプションで指定したVPGのプロパティですが、gateOpenedプロパティが追加され、trueになっていることから、Gateが有効になっていることがわかります。SORACOM側の設定はこれでOKです。

VXLANトンネルの構成

それでは、EC2インスタンスからSORACOMのGateピアとVXLANトンネルを確立します。今回は、以下のシェルスクリプトを利用しました。VXLANを利用するためのカーネルモジュールはAmazon Linuxではインストール済みのため、特に事前構成は必要ありません。

/opt/init_vxlan.sh

#!/bin/bash
PHY_IF=$1
PHY_ADDR=$2
VXLAN_IF=$3
VXLAN_ADDR=$4
VXLAN_NETMASK=$5
shift 5
PEERS=$*
VXLAN_PORT=4789
VXLAN_ID=10

rmmod vxlan
modprobe vxlan udp_port=$VXLAN_PORT
echo "Creating vxlan interface $VXLAN_IF"
ip link add $VXLAN_IF type vxlan local $PHY_ADDR id $VXLAN_ID port $VXLAN_PORT $VXLAN_PORT dev $PHY_IF
echo "Flushing previously added fdb entries"
bridge fdb show dev $VXLAN_IF > /tmp/fdb_entries.txt
while read entry; do
  bridge fdb delete $entry dev $VXLAN_IF
done < /tmp/fdb_entries.txt
# Configure IP address for the vxlan interface
if [ "x$VXLAN_ADDR" != "x" ]; then
  echo "Setting IP address of $VXLAN_IF to $VXLAN_ADDR"
  ifconfig ${VXLAN_IF} ${VXLAN_ADDR} netmask $VXLAN_NETMASK up
fi
# Register peers
for PEER in $PEERS
do
  echo "Registering $PEER as a peer"
  bridge fdb append 00:00:00:00:00:00 dev ${VXLAN_IF} dst $PEER
done
  • 15行目 : VXLANインターフェースの有効化。VNIはGate側で10で決め打ちで、ユニキャストモードでセットします。
  • 30行目 : for文で2回、GateピアをFDB(LinuxブリッジのMACアドレステーブル)に登録

このスクリプトをLinuxの起動時に実行するよう、/etc/rc.localに追記します。スクリプトのchmod +xを忘れずに!

/etc/rc.local

  :
/opt/init_vxlan.sh eth0 172.21.0.100 vxlan0 10.225.194.171/9 10.255.255.255 100.64.158.4 100.64.158.132 >> /opt/init_vxlan.log 2>&1

以下の引数を先ほどメモしておいたIPアドレスき置き換えます。

  • 第1引数 : EC2インスタンスのENI(今回はeth0)
  • 第2引数 : EC2インスタンスのPrivate IP(今回は172.21.0.100)
  • 第4引数 : EC2インスタンスのinnerIpAddressnetmask(今回は10.225.194.171/9)
  • 第6引数 : 1つ目のGateピアのouterIpAddress(今回は100.64.158.4)
  • 第7引数 : 2つ目のGateピアのouterIpAddress(今回は100.64.158.132)

上記コマンドを一度実行し、問題がなさそうであれば再起動しましょう。再起動してきたら、ifconfigでネットワークインターフェースvxlan0を確認します。

[ec2-user@ip-172-21-0-100 ~]$ ifconfig vxlan0
vxlan0    Link encap:Ethernet  HWaddr AA:A0:6F:BA:66:89
          inet addr:10.225.194.171  Bcast:10.255.255.255  Mask:255.128.0.0
          inet6 addr: fe80::a8a0:6fff:feba:6689/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:8951  Metric:1
          RX packets:24 errors:0 dropped:0 overruns:0 frame:0
          TX packets:10 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:1608 (1.5 KiB)  TX bytes:736 (736.0 b)

[ec2-user@ip-172-21-0-100 ~]$

VXLANトンネルが有効になっていますね。MTUが大きめになっているので、大きいデータなどをやり取りする場合は、フラグメントを防ぐためのMTUの調整が必要になるかもしれません。

この状態でSIMを差したデバイスのIP(SORACOMユーザーコンソールのSIM管理で確認できます。)に向けてpingやSSH接続を試行すると正常に接続できるはずです。多くのIoTゲートウェイでは、セキュリティ対策としてSSHログインが既定で禁止されていますので、許可しつつ試しましょう。以下はOpenBlocks BX1のSSH許可設定画面です。

soracom-gate01

注意事項

VXLANトンネルを確立するEC2インスタンスでIP転送を有効しVPCのルーティングテーブルをインスタンスに向ける *2ことで、他のEC2インスタンスからVXLANインスタンス経由でIoTゲートウェイにデータを送出することが可能です。ただし、Gateの既定の構成では、行きと帰りで経路が異なることになります。下図のように、SIM→VPCは引き続きNAT経由になるので、双方向通信のために利用する場合は注意が必要です。

gate04 (1)

まとめ

IoTゲートウェイのリモートメンテナンスは、これまでゲートウェイとリモートホスト間でVPNを構築したり、メンテナンス用エージェントソフトをIoTゲートウェイで常時実行するなど、IoTゲートウェイの負荷が大きいソリューションが一般的でした。SORACOM Gateを利用することで、閉域網によるセキュリティは確保しつつ、IoTゲートウェイに負担をかけないメンテナンス手法として有用と考えます。

参考URL

脚注

  1. サブコマンド名(扉よ開け!)はこうせざるを得ないとなにかを感じたのでしょうね(笑)
  2. 厳密には送信元/送信先の変更チェックの無効化も必要