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自身も日々進化しているので、次回は是非リベンジしたいと思います。

*1:このブログを公開したのは何日だったっけ?

*2:私調べ

*3:一方で下手なセキュリティ設定で運用していると、悪い人たちに悪用されまくりという困った側面もあるので、一概にPrivate IPアドレスが割り振られることがデメリットとも言い難いのですが。