皆さん 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環境からも接続できるようになるため、夢が拡がりますね。
接続方法
ツールとしては最新のVPNツールであるWireGuardが利用できるほか、WireGuardを用いた公式の接続ツールである「soratun」が提供されています。soratunはamd64及びarm64/arm v7アーキテクチャの対応版がリリースされておりますので、Raspberry PiやLinux OSで利用可能です。
しかし元々非力なArduinoデバイスではWireGuardのエージェントをインストールすることはできず直接接続することはできません。そこで自宅ネットワークにゲートウェイ設けて、SORACOMネットワークに直接送信できるようにしたらどうだろう?というのが今回の主旨となります。
アーキテクチャ
我が家の自宅は(一般のご家庭には無いかもしれませんが)、ヤマハRTX1100(中古)をルーターとして据えたネットワークを構築しており、Dockerがインストールされた自宅サーバが存在しています。
そこでDockerコンテナ内にsoratunを起動し、SORACOMゲートウェイとして機能させることで実現します。
コンテナ構築手順
SAMユーザーの作成
以下URL手順に基づきSAMユーザーを作成し、認証キーを発行しておきます。
AuthKeyId、AuthKeySecretの値をメモしておきます。(後で利用します)
コンテナの立ち上げ
今回はCentOS7のベースイメージをもとにコンテナを起動しました。
soratunの起動にSystemdを利用しているため、/sbin/init から起動しています。
$ 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
ルータ側の静的ルート設定
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プラットフォーム側から自宅ネットワーク側にリモートアクセスすることも可能になりそうですね。追々試してみたいと思います。
ご参考になれば幸いです。
コメント