ssh ポート転送(port forwarding) SSHのポート(22番)に別サービスを通過させる機能。
ポート転送とは ssh ポート転送とは他マシンにあるIPポートを、自マシンのポートとして扱うための技のひとつといえよう。つまり、自マシンの特定ポートへの接続が sshサーバを介しての他マシンの指定ポートへの接続となる。
具体的な例を挙げると、sshサーバのアドレスが192.168.111.1、プロキシサーバのアドレス・ポート番号が192.168.111.200:8080 であるとする。ここで、あるマシン192.168.222.10からsshサーバに接続し、ポート転送の設定で localhost:8080を192.168.111.200:8080へ転送するように設定していたとする。 192.168.222.10マシンのWebブラウザのプロキシ設定を「localhost:8080 (127.0.0.1:8080)」としたとき、それは、192.168.111.200を介してのブラウジングとなる。イメージは下図(100%MS-ペイント製なので見にくいですが)。
なぜこんなことをするのかというと、ファイヤーウォールの"穴"を通るためである場合が多いだろう。上記の192.168.222.10から192.168.111.200へ直接アクセスできるのであればこんなことする必要はないし、しないほうが速度も速いだろう。つまり、「学内専用ページ」などにアクセスできるようにするためにssh用の"穴"を利用するのである。sshでは暗号化通信が行えるため、"穴"があけられていることが多い。(なお、県大計算機センターシステムにも学外からのssh接続が可能である。ただし学生が利用する場合、登録が必要である。詳しくはセンターのページを参照のこと。)
Windowsでssh接続する場合、ssh社の"Secure Shell"やttsshを使うのだろうか?(ワタシはこの2つしか使ったことがないので・・・)とにかく、どちらを使ってもポート転送は実現できる。それぞれ、設定用のウインドウを開き、設定を行う。
Linuxの場合、"open-ssh"を使うのだろうか、詳しく知らないけど、「ssh コマンド」を使えば実現できる。
ポート転送する 上述のプロキシの例を実現する場合、クライアントマシン(上記 192.168.222.10)で以下のようなコマンドを実行すればよい。
$ ssh -L 8080:192.168.111.200:8080 [ユーザ名@]192.168.111.1
「-L」オプションで「ローカルホスト --> リモート(転送先)ホスト」のポート転送の設定ができる。「-L」に続けて、(ローカルのポート番号):(転送先のIPアドレス (またはマシン名)):(転送先ポート番号) を入れる。後は、通常ssh接続と同様に [ユーザ名@]接続先マシン を入れる。
「-R」もポート転送のオプションである。こちらは「リモートホスト --> ローカルホスト」のポート転送をするオプションである。つまり、指定したホストの指定ポートへの接続が、あたかも自マシンへの接続のようになる(と思う)。
ただし、このオプションではssh接続したマシンのみがポートを利用でき、他のマシンからはこのポートを利用できない。
他のマシンからの利用 -L オプションだけではローカルでしかポートが使えない。他のマシンからも利用するためには「-g」オプションをつける。
$ ssh -g -L 8080:192.168.111.200:8080 [ユーザ名@]192.168.111.1
これで他マシンからの利用が可能となる。
/.ssh/config 上記のようにすればポート転送ができるのはご理解いただけたであろう。ただ、これではポート転送しようとするたびにコマンドラインに長々と オプションをつけることになる。毎回、いつもこんなことするのは嫌である。そもそも、「ユーザ名@」や長ったらしいIPアドレスを毎回入力するのさえ嫌気が差す。
そんなとき使えるのが「~/.ssh/config」ファイルである。例えば、ファイルの内容は次のようになる。
$ cd ~/.ssh $ cat config
Host univHostName 192.168.111.1User user01GatewayPorts yesLocalForward 8080 192.168.111.200:8080LocalForward 5900 192.168.111.123:5901Host aaaHostName 192.168.135.79User taro
"Host"から、次の"Host"までが1つの接続に関する設定情報となる。まず、Hostはただのニックネームのようなもの(適当に名前を付ける)、HostNameはグローバルなマシン名・IPアドレス、Userは接続時のユーザ名、GatewayPortsは(「-g」オプションに対応する)他マシンからのポート転送接続の可/不可(yes/no、GatewayPorts省略時は no)、LocalForwardは(「-L」オプション に対応する)ポート転送先の設定で、(localのポート番号) と (転送先のIPアドレス(またはマシン名)):(転送先ポート番号)で示す。これで、
$ ssh univ
と
$ ssh -g -L 8080:192.168.111.200:8080 -L 5900:192.168.111.123:5901 [email protected]
は同じ意味を持つようになる。もっと楽をしたいなら「alias univ="ssh univ"」とでも ~/.bashrc に書けばいいだろう( いっそのこと、「alias univ="ssh -g -L 8080:192....."」とかでもいいのだろうが・・・)。
ご注意を 勘のいい方も、悪い方も気付いているかと思うが、要するに「トンネリング」である。「-g」オプションなどで他ホストからの接続を許可し、かつ、そのマシンがファイヤーウォールなどで外と遮断されていない場合、先の場合のプロキシサーバは結局、全世界に公開されていることになる。プロキシなら微妙な感じだが、telnet接続ポート(23か?)へのポート転送だと考えると・・・、ちょっと怖い。もちろん、sshサーバの管理者は誰が「変なの」を招いたかわかるだろうから、結局、sshユーザ(トンネル掘ったヤツ)が怒られる(くらいならいいが)ことになる。「-g」オプションを使う場合、その点の注意が必要である。