SORACOM Arcで自宅ネットワークをSORACOMプラットフォームに接続する

皆さん 2021年6月22~24日に開催された、SORACOM Discovery 2021はご覧になりましたか?
23日の基調講演では、新サービスである SORACOM Arc が発表されました

当方では下記方法により自宅ネットワークとSORACOMプラットフォームとの接続を行いましたので、速報までご報告します。

背景

SORACOM Arc概要

SORACOMプラットフォームは回線接続サービス(SORACOM Air)だけでなく、本ブログでも度々利用している SORACOM Beam/Funk/Harvest など便利な機能があり、クラウドへの接続やデータ蓄積に利用できます。しかしあくまでこれらのサービスはSORACOM Airでの接続を前提にしており、セルラー等での接続でしか利用できませんでした。

そのため、マイコンデバイスからSORACOMプラットフォームを用いてお手軽にクラウド連携やデータ蓄積をしようとしても、WiFi環境に設置されたデバイスからは別途ゲートウェイデバイス等を利用するなど工夫しないとSORACOMプラットフォームには接続できず利用できませんでした。

そうしたユーザの声を反映する形でSORACOM Arcがリリースされた形です。
SORACOM Arcを用いればWiFi環境からも接続できるようになるため、夢が拡がりますね。

SORACOM Arc - SORACOM
SORACOM Arc セキュアリンクサービス SORACOM Arc は任意の IP ネットワークから SORACOM プラットフォームへのセキュアなリンクを提供するサービスです。 お客様は SORACOM Air だ… 続きを読む

接続方法

ツールとしては最新のVPNツールであるWireGuardが利用できるほか、WireGuardを用いた公式の接続ツールである「soratun」が提供されています。soratunはamd64及びarm64/arm v7アーキテクチャの対応版がリリースされておりますので、Raspberry PiやLinux OSで利用可能です。

しかし元々非力なArduinoデバイスではWireGuardのエージェントをインストールすることはできず直接接続することはできません。そこで自宅ネットワークにゲートウェイ設けて、SORACOMネットワークに直接送信できるようにしたらどうだろう?というのが今回の主旨となります。

速報レベルで記載しているため、まだ荒削りの内容です。
適宜修正いたします。ご了承下さい。

アーキテクチャ

我が家の自宅は(一般のご家庭には無いかもしれませんが)、ヤマハRTX1100(中古)をルーターとして据えたネットワークを構築しており、Dockerがインストールされた自宅サーバが存在しています。
そこでDockerコンテナ内にsoratunを起動し、SORACOMゲートウェイとして機能させることで実現します。

なお、当方のDocker環境は通常とは異なるネットワーク構成となっており、各コンテナが直接表側ネットワークに接続されている構成となっていますので、ご注意下さい。

コンテナ構築手順

SAMユーザーの作成

以下URL手順に基づきSAMユーザーを作成し、認証キーを発行しておきます。
AuthKeyId、AuthKeySecretの値をメモしておきます。(後で利用します)

Getting Started: soratun で SORACOM API の認証キーを使用してバーチャル SIM/Subscriber をブートストラップする | SORACOM Arc | ソラコムユーザーサイト - SORACOM Users
任意のIPネットワーク上に IoT プラットフォーム SORACOM へのセキュアなリンクを提供

コンテナの立ち上げ

今回はCentOS7のベースイメージをもとにコンテナを起動しました。
soratunの起動にSystemdを利用しているため、/sbin/init から起動しています。

動作サポート対象が Ubuntu 20.04.2 LTS であることを見落としていました。
Ubuntuでの手順は改めて確認します。
$ sudo docker pull centos:centos7
$ sudo docker run -d --name soratun --hostname soratun --net shared_nw --ip 192.168.X.X --restart=always -it --privileged centos:centos7 /sbin/init

soratunインストール

コンテナにsoratunをインストールします。

(コンテナに入って作業)
$ sudo docker exec -i -t -u root soratun bash

(必要なパッケージインストール)
# yum install wget -y

(soratunインストール)
# cd /tmp
# wget https://github.com/soracom/soratun/releases/download/v1.0.0/soratun_1.0.0_linux_amd64.tar.gz
# tar xvf soratun_1.0.0_linux_amd64.tar.gz
# cp -p /tmp/soratun*/soratun /usr/local/bin/

bootstrap実行(バーチャルSIM発行・設定ファイル生成)

soratun bootstrapを実行することで、バーチャルSIMの発行から設定ファイルの生成を自動で行うことができます。

# /usr/local/bin/soratun --config /etc/arc.json bootstrap authkey

実行した際に対話式で以下の情報を聞かれますので、入力します。

  • authKeyId
  • authKeySecret
  • カバーレッジ(グローバル or 特定地域[日本])

正しく動作した際には設定ファイルが生成されていますので、確認します。

トンネルデバイスの作成

soratun起動に必要なトンネルデバイスがcentos7コンテナにはありませんので、作成します。

# mkdir -p /dev/net
# mknod /dev/net/tun c 10 200
# chmod 666 /dev/net/tun

自動起動の有効化

上記の通り作業した場合は、soratun標準で用意されている起動設定ファイルがそのまま利用できます。

# cp -p /tmp/soratun*/conf/soratun.service.sample /etc/systemd/system/soratun.service
# systemctl enable soratun
# systemctl start soratun

単体動作確認

ここでコンテナ内部からSORACOMプラットフォームに接続できるようになりましたので、動作を確認します。

[root@soratun /]# ping pong.soracom.io
PING pong.soracom.io (100.127.100.127) 56(84) bytes of data.
64 bytes from 100.127.100.127 (100.127.100.127): icmp_seq=1 ttl=64 time=8.85 ms
64 bytes from 100.127.100.127 (100.127.100.127): icmp_seq=2 ttl=64 time=6.39 ms
64 bytes from 100.127.100.127 (100.127.100.127): icmp_seq=3 ttl=64 time=6.36 ms
64 bytes from 100.127.100.127 (100.127.100.127): icmp_seq=4 ttl=64 time=9.34 ms

ルーティング設定

コンテナのIPマスカレード設定

以下のようなシェルスクリプトを作成し、実行します。

(必要なパッケージインストール)
# yum install iptables -y

スクリプトの内容

#/bin/bash
/bin/echo 1 > /proc/sys/net/ipv4/ip_forward
/bin/echo 0 > /proc/sys/net/ipv4/conf/eth0/rp_filter
/bin/echo 0 > /proc/sys/net/ipv4/conf/soratun0/rp_filter
/sbin/iptables -t nat -A POSTROUTING -s 192.168.0.0/16 -o soratun0 -j MASQUERADE
/sbin/iptables -A FORWARD -i eth0 -o soratun0 -s 192.168.0.0/16 -j ACCEPT
/sbin/iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
soratun自動起動設定との連動が上手く行っておらず確認中です。
当方環境ではコンテナ起動後には問題なく実行できています。

ルータ側の静的ルート設定

RTX1100側に、SORACOMプラットフォーム(100.127.0.0/16)宛の静的ルートを設定します。

# ip route 100.127.0.0/16 gateway 192.168.X.X

動作結果/状況

以上の設定により、自宅ネットワーク全体からSORACOMプラットフォームを利用できるようになりました。
Windows端末からPINGが届くのは、違和感を感じますねw
まだ色々と調整が必要と思いますが、ひとまずご報告でした。

またこの構成を利用すれば、恐らくSORACOM Napterを用いてSORACOMプラットフォーム側から自宅ネットワーク側にリモートアクセスすることも可能になりそうですね。追々試してみたいと思います。
ご参考になれば幸いです。

コメント