こんにちは、CRE (Customer Reliability Engineer) の加納(ニックネーム: Kanu)です。
ソラコムの CRE チームは「SORACOM を利用する上でのお客様の不安をゼロにすること」をミッションに、お客様サポートやドキュメントの拡充に努めています。また、多くのお客様のナレッジとできるよう、いただいたお問い合わせを基にした SORACOM サービスの活用方法や利用時の注意点、更新したドキュメントなどについて不定期に紹介しています。SORACOM サービスのご利用にあたって気付きになれば幸いです。
今回は、オンデマンドリモートアクセス「SORACOM Napter」の TLS オプションについてご紹介します。
SORACOM Napter とは
お客様より、インターネット側からIoTデバイスへSSH等によるリモートアクセスを目的に「SORACOM の IoT SIM に、固定のグローバル IP アドレスを付与できますか?」というご質問をいただきます。
FAQ にも掲載されているとおり、SORACOM では不正アクセスリスクの軽減などセキュリティ確保の観点から、 IoT SIMへの固定グローバル IPアドレスを割り当てる仕組みはありません。
一方で、デバイスの保守やデバッグなどで IoT デバイスに遠隔地からアクセスしたいというケースは多いと思います。そんな時のために、SORACOM では必要なときにのみ IoT SIM にグローバル IP アドレスとポートのペアを動的に割り当てる SORACOM Napter というサービスをご用意しています。
SORACOM Napter の TLS オプションとは
SORACOM Napter には IoT デバイスへのリモートアクセス時のセキュリティを高めるための機能がいくつかあります。その内の一つが今回ご紹介する「TLS オプション」です。専門的には「TLS 終端」と呼ばれる機能となります。
このオプションを利用することで、下図の右部のように、インターネット区間を TLS で暗号化できます。そして図の左側、IoT デバイス〜 SORACOM プラットフォームまでの区間は、SORACOM Air for セルラーが提供する閉域網を経由しているため、TLS オプションを利用いただくことで IoT デバイス側が TLS に対応していない場合でも、通信経路全体が保護された状態になります。
例えば、下図のように HTTP で待ち受けているデバイスに対して PC インターネット経由でも安心して通信できる仕組みが構築できます。

通信相手の認証、経路の暗号化、内容の改ざん検知を行えるプロトコルです。ブラウザのアドレスバーに鍵が付く「SSL(セキュア・ソケット・レイヤー)」の後継ではありますが、ほぼ同義です。
TLSオプションのON/OFF方法
TLS オプションの設定はとても簡単です。オンデマンドリモートアクセス作成時に TLS オプションにチェックを入れるだけで、SORACOM NapterがTLSを受け付けられるようになります(TLS終端がONとなる)。

SORACOM Napterは、インターネット側からのIoTデバイスに向けての通信で利用できるサービスです。逆に、IoTデバイス側からインターネット/クラウド向けの通信をTLSで暗号化できるサービスが SORACOM Beam になります。
SORACOM Napter も SORACOM Beam も、インターネット区間を暗号化することでエンドツーエンドで安心な通信を実現するという類似性があります。
SORACOM Napter の TLS オプション利用時の注意点
SORACOM Napter を利用いただいているお客様から「SORACOM Napter 経由でデバイスに接続できない」というお問い合わせをいただくことがあります。その原因の一つとして、TLS オプションが不要なプロトコルの使用時に、TLS オプションを ON としている場合が挙げられます。
TLS オプションは、あくまでも「SORACOM Napter が TLS 通信を受け取り(終端して)、中継する」という宣言です。
よって、TLS 以外の方法で暗号化されているプロトコルを Napter で中継させたい場合は、むしろ Napter には何もさせない= TLS オプションは OFF にすることが求められます。
このように TLS オプションを有効にする際は、対象のプロトコルの暗号化が TLS によるものか否かを確認してください。TLS オプションを OFF にする例としては、SSHやRDP(Remote Desktop Protocol) が挙げられます。これらはすでに他の方法で暗号化済みであるため、TLSオプションは不要です。
【テック向け:1】 TLS 未対応のプロトコル利用時に SORACOM Napter の TLS オプションを有効にすると接続に失敗するのは何故?
ちなみに、SSH などの TLS を使っていないプロトコルに対して TLS オプションを利用すると、具体的にどのような理由で接続に失敗するのでしょうか。ざっくりと申し上げますと、TLS オプションを有効にすると SORACOM Napter 側は TLS のハンドシェイク(初期化)を期待します。一方で、一般的な SSH クライアントは TCP のリクエストを送信するため、それぞれが期待と異なる処理となるため失敗します。
もう少し細かく解説します。以下は、HTTPS(HTTP+TLS) と SSH での挙動の違いをパケットキャプチャで見ています。(時系列は上から下へ流れています)
以下は HTTPS(HTTP+TLS)の例です。
クライアント側 (192.168.0.3) から TLS オプションが ON となっている Napter へ、HTTPS における TLS のハンドシェイク開始 (Client Hello) を送信し(赤枠部分)、Napter 側も対応して応答 (Server Hello) を送信しています。これは期待通りの動きとなります。

以下は SSH の例です。
クライアント側 (192.168.0.3) から TLS オプションが ON となっている Napter へ、Client Hello ではなく普通のパケット (SSHの初期化パケット) を送信しています(赤枠部分)。すると、Napter としては「期待した通信 (Client Hello) ではないので、通信終了」という意味の “FIN” パケットをクライアントに送り返しています。これは接続失敗の挙動となります。

【テック向け:2】 TLS 非対応のプロトコルに対して、TLS オプションを利用したい場合はどうする?
SSH や RDP はプロトコル自体が暗号化されているので TLS オプションを OFF にすれば通信可能です。では、例えば産業の現場で使われる Modbus/TCP といった、暗号化能力が無いプロトコルによるリモートアクセスは、利用を控えるべきなのでしょうか?
答えは NO です。暗号化能力の無いプロトコルでも、技術の組み合わせで暗号化が可能な場合があります。
まず SSH の利用が挙げられます。SSH はリモートアクセスに使うプロトコルですが、暗号化された通信部分を「ポートフォワーディング」という機能で、他のアプリケーションに使わせることができます。例えばパソコンの画面転送をしてリモート制御を実現する VNC では、サーバーとクライアントの組み合わせによっては暗号化されないことがわかっています。そこで、SSH のポートフォワーディングで、どのような条件でも暗号化できるわけです。このポートフォワーディングによる方法は、SORACOMのユーザードキュメントに記載していますのでご覧ください。
また、ほかにも手はあります。TLS 非対応プロトコルを、TLS 化するソフトウェアの利用です。ここでは、オープンソースの TLS 化ソフトウェア「stunnel」をご紹介します。
stunnel と SORACOM Napter の組み合わせ方
ここでは、IoT デバイス側を Raspberry Pi とし、その上で VNC を立ち上げて、リモートアクセスする想定です。リモートアクセス元としては macOS としていますが、stunnel は Windows 等でも動きますので、同様の設定で TLS による暗号化通信が可能です。
1. Raspberry Pi で VNC Server を有効化する
SORACOMユーザードキュメントの 「ステップ 1: デバイスの設定を行う」を参照に、設定してください。
2. SORACOM Napter の利用を開始する
SIM 管理画面から対象の SIM にチェックを入れて、「操作」からオンデマンドリモートアクセスをクリックします。オンデマンドリモートアクセスのダイアログが表示されるので、以下のように設定します。

- デバイス側ポート:デバイスの VNC Server が待ち受けているポート番号 (5900) を指定します。
- アクセス可能時間:リモートアクセスする時間を任意に指定します。指定した時間を経過するとリモートアクセスはできなくなります。最大で 8 時間となります。
- アクセス元 IP アドレスレンジ:リモートアクセスを許可するリモート側の IP アドレスレンジを指定します。(ブランクとした場合、ユーザーコンソールにアクセスした時のソースグローバル IP アドレスがデフォルトで設定されます。)
- TLS オプション:チェックを入れてオプションを有効にします。
上記を入力後、OK をクリックすると IoT デバイスへアクセスする際のグローバル IP アドレスとポート番号のペアが表示されます。
3. アクセス元の PC で stunnel を設定する
今回は macOS を利用した手順をご紹介します。先ず、以下のコマンドを実行して stunnel をインストールします。
brew install stunnel
/usr/local/etc/stunnel/stunnel.conf
を編集して以下を設定します。 AAA.AAA.AAA.AAA
と BBBBB
には前ステップで SORACOM Napter から払い出されたグローバル IP アドレスとポート番号を指定します。CCCC
には PC(macOS) 上で接続を待ち受けるするポート番号を指定します。
[ssh_over_ssl] client = yes accept = CCCC connect = AAA.AAA.AAA.AAA:BBBBB
stunnel を起動します。
stunnel /usr/local/etc/stunnel/stunnel.conf
4. VNC 接続する
VNC クライアントソフトウェアを使い localhost:CCCC
へ接続し、Username/Password を入力すると Raspberry Pi に VNC 接続できます。ここでは PC 側のポート番号 (CCCC
) を 5999 番としています。


通信経路としては以下のようになります。
+------------ クライアントPC(macOS) ------------+---- SORACOM プラットフォーム ---+------ Raspberry Pi ----+ | | | | | VNCクライアント --(非暗号化)--> stunnel --(TLS通信)--> SORACOM Napter --(LTEによる暗号化)--> VNCサーバー |
今回は VNC を利用しましたが、TCP 上のアプリケーションであれば可能な場合があります。SORACOM Napter は、オンラインで即時ご利用いただくことができ、また、無料枠もございます。ぜひお試しください。
最後に
いかがでしたでしょうか。後半がやや長くなってしまいましたが、SORACOM Napter の TLS オプションの活用方法や注意点についてご紹介いたしました。手軽且つセキュアにデバイスへリモートアクセスする手段として SORACOM Napter を是非ご検討ください。
また、Ask SORACOM の過去記事はこちらをご覧ください。
それでは、次回もお楽しみに!
― ソラコム加納 (Kanu)