ssh備忘録

提供: Eospedia
移動: 案内検索

クライオ電顕備忘録に属する記事です。

ローカルポートフォワード

ローカルマシンの特定のポートを、sshプロトコルを用いて特定のIPアドレスの特定のポートへ繋げる手段。sshを介してリモートへの通路を作るという意味で、「(ssh)トンネルを掘る」とか言われたりする。

コマンドは以下。

> ssh -fNL <Local port>:<Target address>:<Target port> <Remote machine user>@<Remote machine>

<Local port>は、ローカルマシンで繋げたいポート番号。<Remote machine user>は、ssh接続先のリモートマシンにおけるユーザー名、<Remote machine>はssh接続先のリモートマシンのIPアドレス(DNSが有効な場合は、ホスト名)。<Target address>は接続先のマシンのIPアドレスだが、これは<Remote machine>から見たときのIPアドレスを意味する。<Target port>は<Target address>のどのポートに繋げるかを指定する。例えば8888:localhost:8888と指定すれば、<Remote machine>から見てlocalhostは<Remote machine>自身のことなので、つまりローカルの8888番ポートを<Remote machine>の8888番ポートへ接続することを意味する。あるいは20020:192.168.4.9:22と指定すれば、ローカルの20020番ポートを<Remote machine>から見てIPアドレス192.168.4.9のマシンの22番ポートへ接続することを意味する。

-fはバッググラウンドでの実行を指定、-Nはssh接続したあとに何も実行せずにおくことを指定(普通は端末に繋げてシェル起動するとかする)、-Lはローカルポートフォワードの実行を指定。

sshコンフィグファイル(~/.ssh/config)に書く場合は、例えばまず以下の様にconfigに書き、

Host hoge
    HostName <Remote machine>
    LocalForward <Local port> <Target address>:<Target port>

からの、

> ssh -fN hoge

でオッケー。

例えばこんなことに: リモートのJupyter Notebookを利用する
例えばJupyter( https://jupyter.org/ )はデフォルトでは8888番ポートをリッスンしており、これをリモートマシンで立ち上げたとする。リモートマシンの側で8888番ポートをネットワークへ開放すれば、http://<リモートマシンのホスト名>:8888 でJupyterへ接続できはするが、セキュリティ上の懸念が増えるため宜しくないし、ポートの開閉の管理をするのも面倒である。そこでsshローカルポートフォワードを用い、ローカルマシンの8888番ポートをリモートマシンの8888番ポートへsshを介してつなげてあげれば、通信はsshで暗号化されるし、ポート開閉を考える必要も無く、便利である。http:://localhost:8888 へアクセスすればリモートマシンのJupyterへ繋げられる。

例えばこんなことに: 踏み台サーバー越しで一発アクセス
例えばローカルマシン→リモートマシンA(133.6.xx.yy)→リモートマシンB(192.168.4.zz) みたいに、間に少なくとも1台挟まないとリモートへたどり着けない場合がある(外部から研究室のLANに接続する場合に、研究室LANのゲートウェイを突破しないといけない、とか)。わざわざリモートマシンAにsshで入り、それからリモートマシンBにsshで入る、という段取りをしないといけない。

でもこれを一発でできるんですよ。そう、ローカルポートフォワードを使えばね。

> ssh -fNL 20020:192.168.4.zz:22 user@133.6.xx.yy

(userは133.6.xx.yyにおけるユーザー名)

で、

> ssh user@localhost -p 20020

とやれば、一発でリモートマシンBに入ることができる。

このときリモートマシンAのことを踏み台サーバー(Jump server)と呼んだりする。

...こんな説明で伝わるのだろうか?