目次
前提
2021年に発表された SORACOM Arc(以下、Arc) を利用すると、SORACOM Airを利用した通信回線を利用していなくてもWi-Fi経由でもSORACOMプラットフォームに接続できるようになります。
これは、SORACOMプラットフォームを利用して開発したことある人はわかると思うのですが、手軽にSORACOMプラットフォームにアクセスできるのはめちゃくちゃありがたいです。
さらに Arc はバーチャル SIM(以下、vSIM) として扱われるため、SORACOM Napter(以下、Napter) を利用してリモートアクセスを行えます。
例えば、SORACOMプラットフォームとしか通信できない環境でもリモートアクセスできます。 安定のクラスメソッドさんのBlogでも紹介されてますね。
というわけで、Arc+Napterはいろいろ試してみたいので、今回はArcをDockerコンテナ側に設定してNapterでアクセスしてみたいと思います。
準備
Docker の準備とSORACOM側の準備が必要です。普段使っている人は読み飛ばしてください。
Docker
Docker コンテナ側はubuntu 20.04 (Tag: focal)を利用しました。
インストールしたのは、もちろん必須の WireGuard
あと、接続確認にPythonを利用したので、Pythonが動作する環境を設定しています。 ホスト側はMacで、Rancher DesktopをインストールしてDockerを実行しています。
SORACOM Arc
SORACOMのサービスはドキュメントがとてもよく書かれているので、ドキュメントに沿って設定を行います
vSIM 発行時にWireGuardの設定に必要な情報が確認できますので、メモするなどしておいてください。
試してみる
Docker コンテナを起動して、vSiM発行時にメモした情報をWireGuardの設定ファイル /etc/wireguard/wg0.conf
に記載します。
こちらもArc のドキュメントに記載があるので内容を確認してください。
あとは、Docker コンテナ側でWireGuardを起動して、SORACOMプラットフォームへの接続を確認します。
$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES c4c4884529f0 dev-garden "/bin/sh -c 'echo Co…" About a minute ago Up About a minute dev-garden
$ wg-quick up wg0 [#] ip link add wg0 type wireguard [#] wg setconf wg0 /dev/fd/63[#] ip -4 address add 10.248.37.231/32 dev wg0 [#] ip link set mtu 1420 up dev wg0[#] ip -4 route add 100.127.0.0/16 dev wg0 [#] ip -4 route add 10.128.0.0/9 dev wg0
$ 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=1ttl=64time=10.9 ms 64 bytes from 100.127.100.127(100.127.100.127): icmp_seq=2ttl=64time=11.5 ms 64 bytes from 100.127.100.127(100.127.100.127): icmp_seq=3ttl=64time=10.9 ms ^Z [1]+ Stopped ping pong.soracom.io
今回は接続確認するためにいろいろ設定するのが面倒だったので Dockerコンテナ側で、HTTPサーバーを立ち上げてNapterはこのHTTPサーバにアクセスしてみることにします。 HTTPサーバーも接続確認できるだけでいいので、Pythonのいつものやつで済ませます。
$ python -m http.server 8088 Serving HTTP on 0.0.0.0 port 8088(http://0.0.0.0:8088/) ... 127.0.0.1 - - [18/Jun/2022 08:07:53]"GET / HTTP/1.1"200 -
SORACOM Napter
これでローカルからDockerコンテナへの接続が確認できたので、続いてSORACOMユーザーコンソールからNapterの設定を行います。
デバイスのポートはこのHTTPサーバーのポートを指定してください。今回は8088
を使用しました。
払い出されたURLにブラウザでアクセスして、ローカルからアクセスしたものと同じ画面が見えれば成功です。 Dockerコンテナ側のターミナルにもアクセスログが出ているのを確認できるかと思います。
python -m http.server 8088 Serving HTTP on 0.0.0.0 port 8088(http://0.0.0.0:8088/) ... 127.0.0.1 - - [18/Jun/2022 08:07:53]"GET / HTTP/1.1"200 - 100.127.10.17 - - [18/Jun/2022 08:08:06]"GET / HTTP/1.1"200 - 100.127.10.17 - - [18/Jun/2022 08:08:06] code 404, message File not found 100.127.10.17 - - [18/Jun/2022 08:08:06]"GET /favicon.ico HTTP/1.1"404 - 100.127.10.17 - - [18/Jun/2022 08:08:35]"GET /Dockerfile HTTP/1.1"200 - 100.127.10.17 - - [18/Jun/2022 08:08:41]"GET /memo.json HTTP/1.1"200 - 100.127.10.17 - - [18/Jun/2022 08:08:58]"GET /README.md HTTP/1.1"200 - ^Z [2]+ Stopped python -m http.server 8088
Napter で接続できない時
Napterで接続できない時は、まずはNapter側の設定を再確認してください。
デバイス側ポート
や アクセス元IPアドレスレンジ
など意図したものかどうか。
また、有償となりますが Napter 監査ログ
を利用すると、接続の詳細を確認できます。
今回ちょっとハマったのが
- Dockerコンテナ側からSORACOMへのPingは普通に通る
- SORACOMユーザーコンソールからNapterを設定して、アクセスするとタイムアウトしてアクセスできない
- なぜかDockerコンテナ側でSORACOMへPingしている間は、Napterでのアクセスも通る
調べてみたらWireGuardの設定が足りなさそう
NAT越しの通信の場合は
PersistentKeepalive
の設定をしないとダメらしいArc のドキュメントにも記載がある
毎回書いている気がするが、ドキュメント特に公式のものをよく読んだ方が解決までが早いと思った
- 同様の症状で悩んでる場合はドキュメントを確認して
PersistentKeepalive
の設定を追加してみてください
まとめ
- SORACOM ArcとSORACOM Napter を利用してDockerコンテナにアクセスできた
- ユースケースを考えると、Dockerで開発している画面を一時的に外部の人に見せるとかでワンチャン!
- ngrok ほど自由はないけど時間制限やCIDRでの制限はかけられるので使えるかも? ngrok.com
- Dockerコンテナ側は、WireGuardの設定と起動だけなので
/etc/wireguard/wg0.conf
をコンテナ作成するタイミングでコピーしても良さそう - ArcとNapterの組み合わせはいろいろ試せそうなので、今後も何かあれば試して書き留めようと思った
- Wi-Fiで普通にSORACOMプラットフォームにアクセスできるのは本当に便利で助かる
- SORACOMプラットフォームは
従量課金
なので、利用する前に料金の確認を忘れずに
以上になります。