enebularをSORACOM SIMをさしたゲートウェイで動かそうとしたけどうまくいかなかったのでSSH Port forwardingの小ネタ
サブタイトル:フルスケールエンジニアへの道は険しい
これはソラコム(https://soracom.jp/)のSoftware Design 誌 巻頭特集記念リレーブログ(https://blog.soracom.jp/relay-blog/2016-04/) 5/2分です*1。
SORACOM SIMを使っていて困ることあるあるランキング第一位*2は、なんといってもPrivate IPアドレスしか割り振られないことでしょう。Global IPアドレスが割り振られるSIMであれば、SIMをさしたデバイス自身がサーバー(WebサーバーやSSHサーバー)になれるので、リモートから簡単にアクセスすることができます*3。しかし、Private IPアドレスしか割り振られないSIMを使用している場合は、一工夫が必要となります。
例えば、SSHによりリモートログインをしたいという場合、SSHの"踏み台サーバー"を立てて、それを経由してログインする方法が公開されています。
SORACOM AirとBeamと時々NAT越え - SORACOM Blog
Soracom Airで繋がったデバイスにリモートからSSHする | Developers.IO
これらのブログに書いてある通りにやってみたところ、微妙に上手くいかなかったので、それを回避するTIPSを紹介します。
使用したデバイス
今回は、SORACOM SIMがさせるデバイス(ゲートウェイ)として、アットマークテクノ社のArmadillo-IoT G1を使用しました。Armadillo-IoT G1で使用されている3GモジュールはSierraWireless社のMC8090というものです。
LAN経由は問題ないけど、3G経由だと上手くいかない
前述のブログに記載してある手順通りに、ゲートウェイ側では下記コマンドを実行しました。Armadillo-IoT G1は、標準ではSSHサーバーが起動していないので、事前にSSHサーバーを起動させておいてください。
# ssh -N -f -R <remote port>:localhost:22 <remote server>
そして、サーバーから下記コマンドで接続を試みてみましたが、上手くいきません。
$ ssh <user name>@localhost -p <remote port>
正確には、ゲートウェイを有線LANでネットワークに接続しているときにはうまくいきますが、SORACOM SIMを使った3G回線の時はうまくいかないようでした。サーバーから接続するときに、ssh -vvv としてデバッグメッセージを表示しながらやってみると、下記の部分で止まっているようです。
... debug1: expecting SSH2_MSG_KEX_DH_GEX_REPLY Connection closed by <IP address>
ワークアラウンド
今回は、ゲートウェイのネットワークインターフェースのMTUを小さくすることで回避しました。
$ ifconfig wwan0 mtu 576
パケットフラグメンテーションを回避することで、症状が緩和されるようです。
SSH Frequently Asked Questions
問題は回避できましたが、これで正しい対処なのか、イマイチ自身がありません。実はネットワークの深い仕組みをよく知らないという、自分自身の課題が浮き彫りになった形です。
懺悔
今回のリレーブログでは、本当はenebularのagentをSORACOM SIMが刺さったデバイスに送り込むというネタをやるつもりでした、そこでもネットワークの課題が解決できずに没になったのでした。。。フルスケールエンジニアへの道は険しいですね。enebular自身も日々進化しているので、次回は是非リベンジしたいと思います。