はじめに
IoTプラットフォームのSORACOMには様々なサービスがありますが、プライベートネットワークに簡単に接続できるネットワークサービスも用意されています。
- AWSのVPCに接続するSORACOM Canal
- 専用線でクラウドやオンプレに接続するSORACOM Direct
- インターネットVPNでクラウドやオンプレに接続するSORACOM Door
などです。これらを使うことによって、デバイスから自社が利用するプライベートネットワークに、インターネットを介さずにアクセスできるようになります。
ただし、このサービスだけではオンプレ / クラウドからデバイスに直接アクセスすることはできません。
デバイス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」を利用して、比較的簡単・安価にオンプレ / クラウド / デバイスを統合したネットワークを作ってみたいと思います。
ネットワーク構成
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」を選択します
適当なVPG名を入力し、タイプに「Type-E」を選んで「作成」をクリックします(実行すると初期費用 217.8円、11円/時間かかることに注意)
「高度な設定」タブを開き、「Gateを有効にする」をONにし、「保存」をクリックします
これだけです。簡単ですね。
SIMグループを作る
SORACOM Airのメニューを開き、「VPG」をONにして、VPGとして先ほど作成したVPGを選択し、「保存」をクリックする
これで終わりです。こちらも特に難しい設定はなく、簡単ですね。
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 管理画面」でのみ可能です。
その画面になっていない場合は、画面上部のリンクにて切り替えましょう。
作成されたSIM IDをコンソールで検索し、該当SIMにチェックを入れ、「詳細」をクリックします。
グループを先ほど作成したグループに変更し、バーチャルSIMのタブを開いて「バーチャルSIMセッションをリセット」をクリックします。
これで準備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登録」をクリックします。
「バーチャルSIMを登録」タブを選択し、「登録」ボタンをクリックします。
先ほどと同じく、ここで作成された仮想SIMのグループ変更と、セッションのリセットをします。これでSORACOM側の準備は完了です。
次にApp StoreでWireGuardを検索し、インストールしましょう。
https://apps.apple.com/us/app/wireguard/id1451685025
インストールできたらWireGuardクライアントを起動します。
左下の「+」メニューを開き、「設定が空のトンネルを追加」をクリックします。
仮想SIM作成時にコピーした設定を貼り付けます。さらにデバイスLANにアクセスできるよう、AllowedIPsに「, 10.128.0.0/9」を追加、接続が維持されるようPersistentKeepalive = 25を追加します。
有効になったら完了です。
Android + WireGuard
Google Play StoreからWireGuardのクライアントをインストールしておきます。
macの時と同様に、バーチャルSIMを作成します。この際、QRコードを読むとおおよその設定はされます。便利ですね。
macの時と同様に、Allowed IPsとキープアライブを追加しておきます。(キープアライブは足さない方が良いとアプリには記載されるので、しない方が良いのかもしれません)
あとはSIMグループの変更、セッションのリセットを実施してから、WireGuard接続を有効にするだけです。
ラズパイ + 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をインストールして、そのページがアクセスできるかをみます。
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でアクセスしてみましょう。
ちゃんとアクセスできますね。Android → macは、macでDockerのgetting-startedを起動して、そこにアクセスさせてみました。
はい、ちゃんと表示されました。
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を入れて、その画面を見ることにします。
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でできるようになったことを組み合わせると、アーキテクチャの幅が広がりますね。引き続き色々考えてみます。