SSH: MacOSでロカールポート転送

日常的にやり残している作業が山積みで、三連休、TVも見ないでジョブの片付けをしているところです。

今回は主にサーバーのメンテナンスを行っていて何台かのFreeBSD OSをバージョンアップしています。
リモートに置いてあるサーバーのメンテナンスは事前に注意しておくところが多くいろいろと面倒です。
ターミナルからコマンドを送ってバージョンアップしますが、ターミナル画面がしばらく更新されないと、リモートアクセスセッションがぶった切られてしまうことがあります。

具体的には、ssh でサーバーにログインして、freebsd-update コマンドを実行しますが、サーバーのパフォーマンスとパッケージのインストール具合によっては、途中で画面が更新されない時間が1時間くらい続くことがあります。(src をインストールしていると、バージョンチェックにやたらと時間が掛かります。遅いCPUなら尚更。)
その間、ターミナルセッションにパケットが流れないので、途中のルーターがセッションをぶった切ってしまうわけです。こうなると、途中まで進んでいた OSバージョンアップ作業が強制終了されてしまい、また最初からとなります。

これを防ぐためには、時々キータイプしてすればいいのですが、キータイプは、次のプロンプト待ちの時に間違った先行キータイプとして認識される可能性があるので危険。

こういう時に便利なのが、SSHトンネル。
1本のリモートアクセスセッションを複数のコネクションに時分割し、そのうち一つに画面が更新されるプログラムを動かしておけば、セッションを維持できます。問題はそれをどうやって実現するか。

幸い、リモートアクセスセッションを張っている私のパソコンは、MacOS Snow Leopard なのでデフォルトでsshが使えます。

ssh コマンドの -L オプションを使うと、自分が使っているMacの指定ポートをサーバーの待機ポートと接続することが出来ます。

単純にサーバーへ接続する場合、

ssh user@server

で接続します。これだと、普通の1対1接続。コマンド一つに対して1本のセッションが張られます。このコマンドにオプションを付ける形で、

ssh -L 1023:server:23 user@server

とすると、サーバーにsshでログインするとともに、自分のMacのポート1023(1023 は空きポートであれば何でもいいがわかりやすさのため +1000としています。23はtelnetのポート。)を叩くと、サーバーのport 23へパケットが流れるという具合です。
以降、上記sshセッションが閉じられるまで「telnet localhost 1023」 とすると、

telnet server

を発行したのと同じ結果になります。(サーバー側も port 23 を開いてtelnet可能にしておく必要があります)ただし通信回線上は新しいセッションは張られず、前の ssh セッションが再使用されますので、途中のルーターにはこのtelnetセッションは見えませんし、複数の telnet セッションを張ることが出来ます。

なぜ、sshではなく telnet かというと ssh -L でセッションを暗号化してあるのに、その中を更に暗号化してCPUを無駄に使う必要はないためです。

残念ながら、この「ssh -L」コマンドは、(ローカルポートを管理出来る)管理者権限で発行しないとエラーとなります。

Privileged ports can only be forwarded by root.

管理者権限で実行するために Snow Leopard では、頭に sudo を付ける必要があります。

sudo ssh -L 1023:server:23 user@server

その後、常に画面が更新されるように、SSHセッションには、ping や top などを発行しておきます。これで、ロカールPCとサーバーの間には常にパケットが流れ続けるため、画面を放置したり、画面が長時間更新されなくてもセッションがぶった切られることはなくなり、じっくり freebsd-update コマンドを使用できるようになります。

ssh コマンドがデフォルトで入っていないWindowsの場合、私は、port fowarder のようなユーティリティを使っていました。64bit Windows 10の場合は、オプションではありますが WSL(Windows subsystem for Linux) を入れれば Unix系コマンドを使用できるようになりますので、Macと同じ事が出来るようになるはず。

コメントを残す