2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

SORACOM ArcとGateで作るデバイス / クラウド / オンプレ統合ネットワーク

Last updated at Posted at 2021-07-18

はじめに

IoTプラットフォームのSORACOMには様々なサービスがありますが、プライベートネットワークに簡単に接続できるネットワークサービスも用意されています。

などです。これらを使うことによって、デバイスから自社が利用するプライベートネットワークに、インターネットを介さずにアクセスできるようになります。

ただし、このサービスだけではオンプレ / クラウドからデバイスに直接アクセスすることはできません。

デバイスLAN接続サービス SORACOM Gateというサービスを利用することにより、オンプレ / クラウド / デバイスを一つの仮想ネットワークに入れ、相互にアクセスすることができるようになります。

クラウドからデバイスにアクセスしてメンテする、みたいな時に便利そうですよね。

一方このプライベート接続にはまあまあコストがかかります。例えばAWSのVPCと接続するSORACOM Canalを利用する場合は、

  • VPG Type-F:55 円/時間 (40,920 円/月) (1000回線まで)
  • VPCピアリング:11 円/時間 (8,184 円/月) (1接続目は無料)

くらいの料金はかかってしまいます。
また、DirectやDoorは申請も必要で、ちょっとやってみよう、というくらいで使うには大掛かりです。(料金は以前はVPG Type-Dが245,520 円/月だったのが、Transit Gatewayを利用したType-Fが使えるようになり大幅に値下げされた)

そこで今回はSORACOM Discovery 2021 Onlineにて発表されました「セキュアリンクサービス SORACOM Arc」を利用して、比較的簡単・安価にオンプレ / クラウド / デバイスを統合したネットワークを作ってみたいと思います。

ネットワーク構成

image.png

VPG Type-Eを使うのがポイントです。VPG Type-Eはインターネット接続用のVPG(Virtual Private Gateway: これ自体の説明はしません)で、Type-Fのようにクラウドやオンプレとの閉域接続はできないのですが、インターネットへ出る際のIPを固定したり、IPアドレスでフィルタしたりできる他、SORACOM Gateと組み合わせることでこのVPGに接続したデバイス間通信ができます。

そして料金が安い!
VPG Type-Fの1/5である、11 円/時間(8,184 円/月)です。
これは1000回線まで同一金額です。ということは、1000回線で使うと1回線あたり8円/月になります。しかもBeam / Funnel / Funkの利用料が30回/秒まで無料になるというおまけ付きです。(あれ?BeamやFunnelをよく使うのであれば、VPGを使わない時より安くなるのでは?仮に100台のデバイスが1分に1回Funnelにデータを上げたとして8035円/月が無料になる。みんなもVPG Type-Eを使ってみよう!)

それ以外はネットワーク構成というほど大したものではありません。とにかくSORACOM Arc、もしくはSORACOM Airに接続してしまいます。SORACOM ArcはIoTデバイスの他、PCやスマートフォン、オンプレのサーバーやクラウドの仮想サーバー、コンテナなど様々な環境で動作することがわかっていますので、それらを同じLANに入れて相互に接続できてしまいます。とても簡単に幅広い対応ができます。

ただし、SORACOM Arcへの接続ができる、つまりインターネット接続が必要になりますので、その点は注意しましょう。インターネットへの接続ができない場合はSORACOM CanalやSORACOM Directを使う必要があります。

さて、やっていきましょう。以下の手順で進めます。

  • VPGを作る
  • SIMグループを作る
  • SORACOM Arc接続を作り、SIMグループに所属させる
  • 接続確認

VPGを作る

ソラコムのコンソールにログインし、左のメニューから「VPG」を選択します
スクリーンショット 2021-07-18 17.56.49.png

「+VPGを追加」をクリックします
スクリーンショット 2021-07-18 18.00.16.png

適当なVPG名を入力し、タイプに「Type-E」を選んで「作成」をクリックします(実行すると初期費用 217.8円、11円/時間かかることに注意)
スクリーンショット 2021-07-18 18.01.57.png

作成されたVPGを選択します
スクリーンショット 2021-07-18 18.10.52.png

「高度な設定」タブを開き、「Gateを有効にする」をONにし、「保存」をクリックします
スクリーンショット 2021-07-18 19.02.38.png

これだけです。簡単ですね。

SIMグループを作る

左のメニューから「SIMグループ」を選択します
スクリーンショット 2021-07-18 19.10.11.png

グループ名を入力し、「グループ作成」をクリック
スクリーンショット 2021-07-18 19.40.46.png

SORACOM Airのメニューを開き、「VPG」をONにして、VPGとして先ほど作成したVPGを選択し、「保存」をクリックする
スクリーンショット 2021-07-18 19.50.09.png

これで終わりです。こちらも特に難しい設定はなく、簡単ですね。

SORACOM Arc接続を作り、SIMグループに所属させる

さて、Arcの接続をしていきましょう。
以下のような感じで接続できることを確かめます。

環境 接続方法
Amazon EC2 soratun
mac macOS用WireGuardクライアント
スマホ(Android) Android用WireGuardクライアント
ラズパイ SORACOM Air

オンプレのサーバーはEC2と同じものと考えられるので、とりあえずこのくらいやっておけば良いでしょう。

Amazon EC2 + soratun

EC2を立ち上げます。外向きにインターネットに接続できる必要がありますので、インターネットゲートウェイかNATゲートウェイ(NATインスタンス)へのルートを入れましょう。

ログインしたらsoratunをダウンロード、展開、バイナリとサービスファイルの移動をします。

wget https://github.com/soracom/soratun/releases/download/v1.0.0/soratun_1.0.0_linux_amd64.tar.gz
tar zxf soratun_1.0.0_linux_amd64.tar.gz
cp soratun_1.0.0_linux_amd64/soratun /usr/local/bin
cp soratun_1.0.0_linux_amd64/conf/soratun.service.sample /etc/systemd/system/soratun.service

ブートストラップを実行しますが、その前にブートストラップに必要な権限を持つSAMユーザーを作成する必要があります。
以下の記事を参考に、SAMユーザーを作りましょう。
https://users.soracom.io/ja-jp/docs/arc/bootstrap-authkey/

準備できたら、ブートストラップを実行します。

[root@ip-10-0-0-68 ~]# soratun bootstrap authkey --config /etc/arc.json
Not enough information to bootstrap. Launching wizard.
SORACOM API auth key ID (starts with "keyId-"): **************************************
SORACOM API auth key (starts with "secret-"): ***********************************************************************
✔ Japan coverage (api.soracom.io)
Virtual subscriber SIM ID: 890000xxxxxxxxxxxxx
Created/updated configuration file: /etc/arc.json

通常はこれでよいのですが、Gateでの通信に対応するにはもう一手間あります。接続設定の中に、GateのデバイスIPアドレスレンジを許可する設定が必要です。以下のように、additionalAllowedIPsという項目を追加しましょう。これがないと、GateのIPアドレスがArcにルーティングされません。

{
  "privateKey": "XXXX",
  "publicKey": "XXXX",
  "simId": "890000XXXXXXXXXXXXX",
  "logLevel": 2,
  "enableMetrics": true,
  "interface": "soratun0",
  "profile": {
    "authKey": "secret-XXXX",
    "authKeyId": "keyId-XXXX",
    "endpoint": "https://api.soracom.io"
  },
  "arcSessionStatus": {
    "arcServerPeerPublicKey": "XXXX",
    "arcServerEndpoint": "XX.XX.XX.XX:11010",
    "arcAllowedIPs": [
      "100.127.0.0/16"
    ],
    "arcClientPeerIpAddress": "10.XX.XX.XX"
  },
  "additionalAllowedIPs": ["10.128.0.0/9"]
}

これで接続はできるのですが、グループ設定と「Arcのセッションをリセットする」必要があります。
(グループIDを指定してブートストラップできないものかな〜、と思ったりします)

グループ設定はともかく、なぜセッションのリセットが必要なのか?が疑問と思います。VPGはセッションの確立ごとに設定されるのですが、ArcのセッションはWireGuardの接続がされる時ではなく、ブートストラップされた時に確立され、コンソールやCLIでリセットされるまではオンラインのままです。従って、VPGが変わる変更をした際には、「Arcのセッションをリセットする」という操作が必要になります。(ドキュメントに記載あり)

なお、仮想SIMの操作は「サブスクリプションコンテナに対応した新しい SIM 管理画面」でのみ可能です。
その画面になっていない場合は、画面上部のリンクにて切り替えましょう。
スクリーンショット 2021-07-18 22.13.03.png

作成されたSIM IDをコンソールで検索し、該当SIMにチェックを入れ、「詳細」をクリックします。
スクリーンショット 2021-07-18 21.48.43.png

グループを先ほど作成したグループに変更し、バーチャルSIMのタブを開いて「バーチャルSIMセッションをリセット」をクリックします。
スクリーンショット 2021-07-18 21.50.56.png

これで準備OKです。soratunを起動しておきましょう。

systemctl start soratun

なお、soratunの状況はsoratun statusコマンドで確認することができます。

[root@ip-10-0-0-68 ~]# soratun status
interface: soratun0 (userspace)
  public key: XXXX
  private key: (hidden)
  listening port: 56276

peer: XXXX
  endpoint: XX.XX.XX.XX:11010
  allowed ips: 100.127.0.0/16, 10.128.0.0/9
  latest handshake: 2021-07-18 12:56:57.113543172 +0000 UTC
  transfer: 30524 B received, 4356 B sent

ちゃんと10.128.0.0/0が許可されていることがわかりますね。
これでEC2でのArc接続は完了です!

mac + WireGuard

次はmac + WireGuardです。

まず仮想SIMを作成しましょう。メニューにて「+SIM登録」をクリックします。
スクリーンショット 2021-07-18 22.19.44.png

「バーチャルSIMを登録」タブを選択し、「登録」ボタンをクリックします。
スクリーンショット 2021-07-18 22.21.17.png

作成された設定をコピーしておきます。
スクリーンショット 2021-07-18 22.23.09.png

先ほどと同じく、ここで作成された仮想SIMのグループ変更と、セッションのリセットをします。これでSORACOM側の準備は完了です。

次にApp StoreでWireGuardを検索し、インストールしましょう。
https://apps.apple.com/us/app/wireguard/id1451685025

インストールできたらWireGuardクライアントを起動します。
左下の「+」メニューを開き、「設定が空のトンネルを追加」をクリックします。
スクリーンショット 2021-07-18 22.29.37.png

仮想SIM作成時にコピーした設定を貼り付けます。さらにデバイスLANにアクセスできるよう、AllowedIPsに「, 10.128.0.0/9」を追加、接続が維持されるようPersistentKeepalive = 25を追加します。
スクリーンショット 2021-07-18 22.32.17.png

VPNの追加について許可を求められますので、許可します。
スクリーンショット 2021-07-18 22.36.48.png

接続を有効化します。
スクリーンショット 2021-07-18 22.38.04.png

有効になったら完了です。

Android + WireGuard

Google Play StoreからWireGuardのクライアントをインストールしておきます。

macの時と同様に、バーチャルSIMを作成します。この際、QRコードを読むとおおよその設定はされます。便利ですね。
スクリーンショット 2021-07-18 22.23.09 2.png

macの時と同様に、Allowed IPsとキープアライブを追加しておきます。(キープアライブは足さない方が良いとアプリには記載されるので、しない方が良いのかもしれません)
image.png

あとはSIMグループの変更、セッションのリセットを実施してから、WireGuard接続を有効にするだけです。
Screenshot_20210718_233905_com.wireguard.android.jpg

ラズパイ + SORACOM Air

SORACOM Airの物理SIMをArc GateのSIMグループに入れて、接続します。
3G対応データ通信端末 AK-020に特定地域向け IoT SIM (plan-D)を挿し、ラズパイのUSBポートに挿します。
その後公式の接続ツールであるsetup_air.shを使えば接続されます。

curl -O https://soracom-files.s3.amazonaws.com/setup_air.sh
sudo bash setup_air.sh

ppp0という接続ができていればOKです。

さて、これでさまざまな環境でArc、もしくはAirで接続されました。相互接続できるかどうか試してみましょう。

接続実験

まずmac → EC2から見てみましょう。
EC2に適当にhttpdをインストールして、そのページがアクセスできるかをみます。

スクリーンショット 2021-07-18 23.47.21.png

OKですね。10で始まるプライベートIPアドレスなのに、なぜかアクセスできています。今回はインターネットゲートウェイに直接アクセスするEC2としましたが、NAT以下のサーバーでもOKなはずです。またEC2ではなくオンプレのサーバーや他のクラウドでもOKだと考えられますね。

逆にEC2 → macを見てみます。
とりあえずリモートログインでもしてみますか。macのシステム環境設定 → 共有からリモートログインをオンにすると、sshでログインできるようになります。

sh-4.2$ ssh 1stship@10.180.200.5
The authenticity of host '10.180.XX.XX (10.180.XX.XX)' can't be established.
ECDSA key fingerprint is SHA256:XXXX
ECDSA key fingerprint is MD5:XXXX
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '10.180.XX.XX' (ECDSA) to the list of known hosts.
Password:
Last login: Sun Jul 18 22:41:06 2021
1stship@MacBookAir ~ % ls
Applications                            Movies                                  draw                                    soratun_1.0.0_darwin_arm64
Desktop                                 Music                                   gate                                    soratun_1.0.0_darwin_arm64.tar.gz
Documents                               Pictures                                github
Downloads                               Public                                  ruby
Library                                 button                                  soratun

お〜、普通にログインできました。macは完全にNAT下に入っていますが、それがプライベートIPでアクセスできましたね。これは良い。

次にAndroid → EC2を見てみます。同じくHTTPでアクセスしてみましょう。

Screenshot_20210718_235813_com.android.chrome.jpg

ちゃんとアクセスできますね。Android → macは、macでDockerのgetting-startedを起動して、そこにアクセスさせてみました。

Screenshot_20210719_000109_com.android.chrome.jpg

はい、ちゃんと表示されました。

EC2 → Android、mac → Androidはとりあえずpingでの通信確認をしました。(Android用のサーバーアプリとかもあるはずですが)

EC2 → Android

[root@ip-10-0-0-68 ~]# ping 10.150.XX.XX -c 4
PING 10.150.XX.XX (10.150.XX.XX) 56(84) bytes of data.
64 bytes from 10.150.XX.XX: icmp_seq=1 ttl=62 time=234 ms
64 bytes from 10.150.XX.XX: icmp_seq=2 ttl=62 time=208 ms
64 bytes from 10.150.XX.XX: icmp_seq=3 ttl=62 time=228 ms
64 bytes from 10.150.XX.XX: icmp_seq=4 ttl=62 time=108 ms

--- 10.150.XX.XX ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3003ms
rtt min/avg/max/mdev = 108.681/195.107/234.511/50.780 ms

mac → Android

1stship@MacBookAir draw % ping 10.150.XX.XX -c 4
PING 10.150.XX.XX (10.150.XX.XX): 56 data bytes
64 bytes from 10.150.XX.XX: icmp_seq=0 ttl=63 time=61.570 ms
64 bytes from 10.150.XX.XX: icmp_seq=1 ttl=63 time=59.394 ms
64 bytes from 10.150.XX.XX: icmp_seq=2 ttl=63 time=74.056 ms
64 bytes from 10.150.XX.XX: icmp_seq=3 ttl=63 time=69.142 ms

--- 10.150.XX.XX ping statistics ---
4 packets transmitted, 4 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 59.394/66.040/74.056/5.874 ms

特に問題なくアクセスできました。というかAndroid端末ってping応答返してくれるんですね。

最後にAirで接続しているデバイスへ、デバイスからのアクセスを確認してみましょう。
デバイスはラズパイを使い、ラズパイはLAN接続もなしでSORACOM Airのみで通信しています。

まずmac → ラズパイへのSSH接続を試します。

1stship@MacBookAir ~ % ssh pi@10.170.XX.XX
The authenticity of host '10.170.XX.XX (10.170.XX.XX)' can't be established.
ECDSA key fingerprint is SHA256:TIyTXXXX
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '10.170.XX.XX' (ECDSA) to the list of known hosts.
pi@10.170.XX.XX's password: 
Linux raspberrypi 5.10.17-v7+ #1414 SMP Fri Apr 30 13:18:35 BST 2021 armv7l

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Fri Jul 16 13:21:03 2021

Wi-Fi is currently blocked by rfkill.
Use raspi-config to set the country before use.

pi@raspberrypi:~ $ ls
ping  pong  routen  setup_air.sh  soratun_1.0.0_linux_armv7  soratun_1.0.0_linux_armv7.tar.gz  soratun_log  test.sh

はい、普通にアクセスできました。これはいいですね。EC2 → ラズパイでも同じです。

[root@ip-10-0-0-68 ~]# ssh pi@10.170.XX.XX
The authenticity of host '10.170.XX.XX (10.170.XX.XX)' can't be established.
ECDSA key fingerprint is SHA256:TIyXXXX
ECDSA key fingerprint is MD5:5d:39:XXXX.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '10.170.XX.XX' (ECDSA) to the list of known hosts.
pi@10.170.XX.XX's password:
Linux raspberrypi 5.10.17-v7+ #1414 SMP Fri Apr 30 13:18:35 BST 2021 armv7l

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Sun Jul 18 16:13:36 2021 from 10.180.XX.XX

Wi-Fi is currently blocked by rfkill.
Use raspi-config to set the country before use.

pi@raspberrypi:~ $ ls
ping  pong  routen  setup_air.sh  soratun_1.0.0_linux_armv7  soratun_1.0.0_linux_armv7.tar.gz  soratun_log  test.sh

当然こちらもOKです。Arcができたことによって、クラウドからのメンテもできるようになりました。(VPG Type-FでC2D接続すれば今までもできていましたが、より手軽にできるようになった)

Android → ラズパイは、ラズパイに適当にapache2を入れて、その画面を見ることにします。

Screenshot_20210719_002450_com.android.chrome.jpg

OKですね。Androidアプリから遠隔でデバイスのコントロールとかもできるかも。

ラズパイ → EC2と、ラズパイ → mac、ラズパイ → Androidはとりあえずpingでの通信確認くらいにしておきます。

ラズパイ → EC2

pi@raspberrypi:~ $ ping 10.144.XX.XX -c 4
PING 10.144.229.146 (10.144.XX.XX) 56(84) bytes of data.
64 bytes from 10.144.XX.XX: icmp_seq=1 ttl=254 time=91.4 ms
64 bytes from 10.144.XX.XX: icmp_seq=2 ttl=254 time=79.9 ms
64 bytes from 10.144.XX.XX: icmp_seq=3 ttl=254 time=78.8 ms
64 bytes from 10.144.XX.XX: icmp_seq=4 ttl=254 time=76.9 ms

--- 10.144.XX.XX ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 8ms
rtt min/avg/max/mdev = 76.877/81.741/91.442/5.711 ms

ラズパイ → mac

pi@raspberrypi:~ $ ping 10.180.XX.XX -c 4
PING 10.180.XX.XX (10.180.200.5) 56(84) bytes of data.
64 bytes from 10.180.XX.XX: icmp_seq=1 ttl=62 time=152 ms
64 bytes from 10.180.XX.XX: icmp_seq=2 ttl=62 time=194 ms
64 bytes from 10.180.XX.XX: icmp_seq=3 ttl=62 time=218 ms
64 bytes from 10.180.XX.XX: icmp_seq=4 ttl=62 time=141 ms

--- 10.180.XX.XX ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 4ms
rtt min/avg/max/mdev = 140.767/176.247/218.229/31.488 ms

ラズパイ → Android

pi@raspberrypi:~ $ ping 10.150.XX.XX -c 4
PING 10.150.67.102 (10.150..XX.XX) 56(84) bytes of data.
64 bytes from 10.150.XX.XX: icmp_seq=1 ttl=62 time=334 ms
64 bytes from 10.150.XX.XX: icmp_seq=2 ttl=62 time=128 ms
64 bytes from 10.150.XX.XX: icmp_seq=3 ttl=62 time=127 ms
64 bytes from 10.150.XX.XX: icmp_seq=4 ttl=62 time=134 ms

--- 10.150.XX.XX ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 7ms
rtt min/avg/max/mdev = 126.833/180.608/333.617/88.377 ms

ということで、クラウドのサーバー、PC、スマホ、セルラーのデバイスがそれぞれ相互に通信できることを確認できました。やったことはSORACOM ArcもしくはSORACOM Airで接続しただけです。(SIMグループの切り替え、およびそれに伴うセッションのリセットが面倒といえば面倒だけど事前に用意しておけます)

これはかなり簡単にデバイス / (マルチ)クラウド / オンプレの統合ネットワークができたと言っても良いのではないでしょうか?

おわりに

SORACOM Arc + Gateを使って、さまざまな環境のマシンを一つのLAN内に入れて相互通信してみました。なかなか面白いです。

実用性はどうか、という感じがしますが、サーバーやPCを自分で管理しているような状況では結構使えるのではないかと思っております。soratunやWireGuardクライアントを入れるのはそれほど大変じゃないですからね。オンプレのサーバーと在宅勤務中のPCに適用するのは面白いかもしれません。

一方自己管理ではない、たとえばクラウドのマネージドサービスに接続する場合は、そのマネージドサービス自体にWireGuardのクライアントを入れるのができないため、ルーターとなるサーバーを用意してポート転送する、などの対応が必要になります。できないわけではないですが、そのルーターは自己管理しないといけなくてマネージドサービスの良さがなくなってしまうので、この構成はいまいちかもしれません。そういう場合は今まで通りSORACOM CanalやDirectを使う方が良いかと思います。マネージドWireGuardゲートウェイとか用意してくれないかな。

ということで、SORACOMで元々できたことと、SORACOM Arcでできるようになったことを組み合わせると、アーキテクチャの幅が広がりますね。引き続き色々考えてみます。

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?