投稿日

SORACOM Arc によるプライベート接続で、クラウドやオンプレミスのサーバーとIoTデバイスをD2D(Device to Device)で接続する

SORACOM Arc(アーク、以下Arc)は WireGuard という VPN 技術を用いて SORACOM プラットフォームへのプライベート接続を提供します。 VPN 接続はSORACOM上で発行する「バーチャル SIM/Subscriber 」を用いる事で Wi-Fi や光回線といったインターネット接続回線からでも LTE/5G セルラー通信と同様に扱えるセキュアリンクサービスになっています。

そこで本ブログでは任意のクラウドやオンプレミス環境のサーバーにArcを設定し、「デバイス間接続 (D2D; Device to Device) 機能」を持つ SORACOM Gate(以下、Gate)を組み合わせ IoT デバイスからプライベート接続経由でアクセスするIoTバックエンド構成をご紹介します。

SORACOM Arcの特徴

SORACOM Arc は WireGuard のインターネット VPN を基盤とするため、インターネットに接続できる任意のクラウド、オンプレミスのサーバーへのプライベート接続として利用できます。プライベート接続のSORACOMサービスは他にもSORACOM CanalDoorDirectがあり、そのうちArcと同じインターネットVPNを利用するSORACOM Doorとの比較表を↓に作ってみました。ArcはDoorと比べて基本料金が低廉で手軽に利用でき、一方のDoorはデバイスからサーバーへの接続用途により向いていると言えますね。

特徴SORACOM Arc + Gate D2DSORACOM Door
費用VPG Type-Eで利用できるため Door よりも安価VPG Type-F が必要で Arc と比べて高価
VPN実装WireGuard Client のため固定グローバル IP 不要で NAT 配下 OKIPsec Site to Site VPN のため固定グローバルIPアドレスが必要
マルチテナント対応SIM同士の相互接続が可能なため不向きVPG プライバシーセパレータ機能で SIM 同士の接続を制限できる
デバイスへの接続可能Gate C2D(Cloud to Device)のGate Peer(VXLAN)構成が必要

メリット/デメリットがそれぞれあるので用途に応じて使い分けるのがおすすめですし、迷うときはサポートにお問い合わせいただいたり、セールスにご相談ください。また、クラウドのマネージドサービスにプライベートネットワーク経由で連携したいという場合は、SORACOM Beam / Funnel / Funk といったアプリケーション連携サービスからAWS IoT CoreAzure Event HubsGoogle Cloud Pub/Subに連携することも可能です。

設定手順

それでは、実際に設定する手順を見ていきましょう。どのクラウド/オンプレミス環境でも良いのですが、今回はGoogle Cloudで試してみます。

動作確認環境

SORACOM上でVPG(Virtual Private Gateway)の作成とGateの設定

まずはSORACOMユーザーコンソールで設定を進めます。ユーザーコンソールのメニューから[SORACOM Air for Cellular] – [VPG] を選択し、 [+ VPGを追加] をクリックします。以下の要領でVPGを作成します。

  • 名前 : 任意のVPG名(例 : arc-for-backend-vpg
  • タイプ : Type-Eを選択
  • デバイスサブネットIPアドレスレンジ : サーバー側のPrivate IPのレンジと重複しないもの(例 : 192.168.200.0/24 )

作成したVPGをクリックし、 [高度な設定] タブの「Gateを有効にする」のスイッチをオンにし、[保存]をクリックします。

続いて、VPGにSIMを紐付けるSIMグループを作成します。

グループを作成したら、[SORACOM Air for Cellular設定]を開き、[VPG(VIRTUAL PRIVATE GATEWAY)] のスイッチをオン、先ほど作成した VPG を選択して画面をしばらくスクロールさせたところの [保存] ボタンをクリックします。

これでVPGおよびGate D2Dの設定は完了です。クライアントとなるデバイスの SORACOM IoT SIM を SIMグループに追加しておきましょう。

サーバーホストでの soratun(WireGuard) の構成

続いてクラウド/オンプレミスのホストで SORACOM Arc への接続を設定します。Arc への接続はWireGuard を利用するため、 Linux の WireGuard を構成しても良いですが、 Arc の接続設定(バーチャル SIM/Subscriber) の作成と WireGuard クライアントを一括で行う soratun というツールを SORACOM が公開しているので、今回は以下の手順を元に soratun を利用します。

まずは soratun から SORACOM API にアクセスするための SAM(SORACOM Access Management) ユーザーを作成します。 SORACOM ユーザーコンソール右上のメニューから[セキュリティ]をクリックし、[ユーザー] – [SAM ユーザー作成]で任意のユーザー名で SAM ユーザーを作成します。リストから作成した SAM ユーザーをクリックし、[権限設定]タブの直接指定のテキストボックスに以下をコピー&ペーストします。

{
  "statements": [
    {
      "api": [
        "Sim:createSim",
        "Sim:createArcSession"
      ],
      "effect": "allow"
    }
  ]
}

[保存]ボタンで保存します。続いて[認証指定]タブをクリックし[認証キーを生成]ボタンをクリックして表示される 認証キー ID と 認証キー シークレット をコピーしておきましょう。このあと soratun のセットアップ時に利用します。

続いてサーバーホストをセットアップしましょう。 Google Cloud Console の Compute Engine 管理画面 にアクセスし、[VM インスタンス] – [インスタンスを作成]から必要な項目を選択していきます。ブートディスクで Ubuntu 20.04 LTS を選択する以外は、用途に合った任意の項目で問題ありません。

SORACOM Arc は WireGuard クライアントとして SORACOM が提供する WireGuard サーバーに接続する構成のため、 VPC ネットワークのファイヤーウォールで着信(上り)のルールを許可する必要はありません。

作成した VM インスタンスが実行中になったら VM インスタンス一覧から [SSH] をクリックし SSH 接続します。今回は VM インスタンスに Web サーバー (Nginx) をインストールし、デバイスからの接続を受け付けます。

$ sudo apt update
$ sudo apt install nginx
$ sudo service nginx start
$ sudo systemctl enable nginx

以下のコマンドラインで soratun をセットアップします。(コマンドをコピー&ペーストする場合は先頭の $ を省いてください)

soratun の実行プログラムは GitHub のリリースページから実行するアーキテクチャに合わせたファイルの URL を確認してください。GCE の VM インスタンスは x86_64 アーキテクチャのため、バージョン名の後ろが linux_amd64のファイルのURLをコピーします。

$ wget <soratunの実行プログラムのURL>
$ tar xvf soratun_1.0.0_linux_amd64.tar.gz 
$ cd soratun_1.0.0_linux_amd64/
$ sudo cp soratun /usr/local/bin

これで soratun が実行できるようになりました。続いて先ほど控えておいたSAMユーザーの認証キーを用いてArcのバーチャルSIMを生成します。

$ soratun --config arc.json bootstrap authkey
Not enough information to bootstrap. Launching wizard.
SORACOM API auth key ID (starts with "keyId-"): <認証キー IDをペースト>
SORACOM API auth key (starts with "secret-"): <認証認証キー シークレットをペースト>
Coverage to create a new virtual SIM: <VPGを作成したカバレッジ(Japan or Global)を選択>
Virtual subscriber SIM ID: XXXXXXXXXXXXXXXXXX
Created/updated configuration file: /home/<ユーザー名>/soratun_1.0.0_linux_amd64/arc.json
$

SORACOMユーザーコンソールのSIM一覧にバーチャルSIM(サブスクリプションが planArc01 のもの)が追加されているので、バーチャルSIMを選択して[操作] – [所属グループ変更]からVPGを設定したグループ(例 : arc-for-backend)を選択します。

VPGへの接続設定を更新するために、再度soratunコマンドを実行します。

$ soratun --config arc.json bootstrap authkey
Virtual subscriber SIM ID: XXXXXXXXXXXXXXXXXX
Created/updated configuration file: /home/<ユーザー名>/soratun_1.0.0_linux_amd64/arc.json
$

これでArcで接続するための設定情報が arc.json ファイルに書き出されました。今回は Arc 経由で IoT SIM からの接続を受け付けるために、エディタで1箇所設定を追加します。Arc から通知されるルーティング設定には VPG のデバイスサブネット IP アドレスレンジが含まれないため、vim エディタなどで additionalAllowedIPs に追加することでサーバーから IoT SIM への戻りの通信が soratun による WireGuard インターフェースに向くようになります。

{
  : (中略)
  "additionalAllowedIPs": ["192.168.200.0/24"]
}

JSON形式なので、ファイル末尾の } の前の行に挿入することに注意します。

これでOKです。以下のコマンドを実行してArcに接続します。

$ sudo soratun --config arc.json up
(DEBUGメッセージがいっぱい出る)

この状態で Arc に接続し、 Gate 経由で IoT SIM からの通信が着信できる状態です。

動作確認

では、クライアントであるデバイスから接続してみましょう。セルラー接続のルーティングにもVPGのデバイスサブネットIPアドレスレンジを追加しておきます。

$ sudo route add -net 192.168.200.0/24 dev ppp0

では cURL でアクセスしてみます。サーバーの IP アドレスは SORACOM ユーザーコンソールのバーチャル SIM/Subscriber の詳細画面か、 arc.json ファイルの arcClientPeerIpAddress にあります。

$ curl http://192.168.200.41/
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>
$

Webサーバーのレスポンスが返ってきました!

動作確認後はサーバーホストの端末で <Ctrl>+<C> キーを押し soratun を終了します。

セキュリティ対策

クラウドやオンプレミスにはホストを保護するためのやファイヤーウォール機能、セキュリティグループ機能やアプライアンス製品がありますが、SORACOM Arc経由のアクセスは WireGuard VPN 通信によりそれらの対象外になります。Linux の Netfilter (iptables) などホストのファイヤーウォール機能を設定して WireGuard インターフェースでの目的外の通信をフィルターし、サーバーのセキュリティ対策を十分検討しましょう。

次のステップ : 高可用性戦略

サーバーのハードウェア、ソフトウェア障害に備える、高可用性構成も考えたいところですね。クラウドや仮想化基盤であればなんらかの高可用性機能があるので、サービス継続の要件と機能の運用コストが見合う方法を考えるのが良さそうです。デバイスからは1つのIPアドレス宛に通信するためロードバランサを組み込むのは難易度が高く、多少のダウンタイムを許容し1台のホストを維持する仕組みが多くのケースで妥当でしょう。Google Cloudであればマネージドインスタンスグループ機能があります。AWSならばEC2のAuto Scaling、オンプレミス環境だとVMware vSphere HAが候補になりそうです。

構成図にするとこんな感じです。

自動スケーリングをスケールアウトのみにしつつ、インスタンス数1で構成すると良いでしょう。


頑張るならマルチノードでノード間でクラスタを組む構成が考えられます。ただし、 VRRP のような仮想 IP アドレスの仕組みはないため、主系から副系へのフェイルオーバーは DNS など IP 以外の仕組みを検討することになるでしょう。この辺りはまた別の機会で構成例を紹介したいと思っています。

また、一般的な高可用性機能は VM インスタンスを作成、起動するだけなので、 soratun の接続が起動時に自動で行われるように systemd を構成するのが良いでしょう。以下のドキュメントが参考になります。

systemd の設定例では arc.json/etc にあるのが前提なので、 VM インスタンスのテンプレートを作る前に移動しておきましょう。

$ sudo mv arc.json /etc

まとめ

IoT バックエンドをクラウドやオンプレミスのサーバーから SORACOM Arc で繋いで使う構成をご紹介しました。ユーザーサイトに Arc のユースケースをまとめたドキュメントを追加したので、こちらも参考になれば嬉しいです。

SORACOM Arcの使い道はまだまだ広がると思うので、皆さんも思いついたものがあれば SNS やブログで教えてください!

― ソラコム 大瀧(takipone)