エコーウエアではLinuxサーバーの構築・導入・運用・管理等を行っています。Linuxサーバーの遠隔保守にはルータに管理用sshポートの穴開けが必須でしたが、最近穴開けに問題のあるルーターが出たのでちょっと見直しました。

 立て続けに2件です。どちらも1拠点で外部へは非公開なのでNTTフレッツ終端装置のルータ機能に穴開け設定して運用してました。それが移転やら回線更新やらで終端装置が変更された後、穴開け設定しているにもかかわらず突然アクセスできなくなる問題が発生しました。終端装置の再起動で復旧するのですが1か月前後で再発します。(機種は OG410Xa と OG810Xi です)

 その都度お客様に再起動お願いするのも申し訳ないので対策です。ルーターの穴が塞がって外から見えないのですから内側から弊社サーバーにセッションを張り、そのセッションを通してアクセスすればイイ訳です。具体的にはsshのリモートフォワードでトンネル掘ります。コマンドは↓こんな感じ。
ssh -N -f -R 10022:localhost:22 hoge@ex.echowear.co.jp

 上のコマンドをルーター内側のお客様サーバーで実行しておけば、弊社サーバーの ex.echowear.co.jp (仮名です、このドメインでは運用してません) から
ssh -p 10022 user@localhost
でお客様サーバーにログインできます。実際の運用にはコマンドを実行後にセッション監視し切れたら再接続するスクリプト組む必要があるのですが、それを全部やってくれる便利なコマンドがありました。

 autossh です。 ↓こんな風に使います。( yum か apt-get でインストールできます)
autossh -M 19003 -f -p 443 -N -R 18003:localhost:22 hoge@ex.echowear.co.jp

ps aux | grep ssh で様子を見ると監視用のポート転送付きでsshを起動するようです。
/usr/bin/ssh -L 19003:127.0.0.1:19003 -R 19003:127.0.0.1:19004 -p 443 -N -R 18003:localhost:22 hoge@ex.echowear.co.jp

-M オプションはセッション監視用ポートの指定でリモート側で指定ポート1個、ローカル側で指定ポートと連番で2個ポートを消費します。raspbianでは省略すると適当なポートを当ててくれましたが、centosでは指定しないとエラーになりました。対象が複数なのでポート番号はちゃんと管理して指定した方がよさそうです。
-f はバックグラウンド実行でそれ以外のオプションはそのまま子プロセスのsshへ渡されます。
なお自動でssh接続してくれるわけですから鍵認証必須です。

 弊社サーバー ex.echowear.co.jp (しつこいですが、仮名です)側にもそれなりの準備が必要です。sshd 設定でパスワード認証を禁止し鍵認証のみにするのは当然として、ポートフォワード専用ユーザー hoge のシェルを rbash にして実行できるコマンドを制限します。あと今後のファイアウォール対策?として sshd の待ち受けに 443ポートを追加してみました。