SSH port forwarding の要点


telnet の代わりに ssh を使って外部から ログインする環境は既にできていると仮定します.ここでは,その他に必要性 が高いと思われる pop3, smtp, ftp を,ssh を通して行う方法を説明します. できるだけ原理的な説明をしますので,その他のアプリケーションにも応用が 効くはずです.

逆に言うと,具体的な設定方法等はあまり書く気がないので, 例えば下記のページなどをご覧下さい.

0-1. 準備 (ネットワークごしに接続するとはどういうことか?)

0-1,0-2 はすごく基本的なことなので,読み飛ばして可.

例えば A というマシンから B というマシンに telnet で接続する場合は,A 側で「B というマシン」の「telnet というサービス」という二つの情報を指 定します.前者が IP アドレスで,後者がポート番号です.

telnet の場合,ポート番号は 23 と決まっていますので,相手の IP アドレ スがわかると接続ができることになります.A 側では telnet クライアントが, B 側では telnet サーバが動作し,互いに通信することでリモートログインが 可能となります.

Fig.1: telnet connection
Fig.1: telnet 接続

0-2. 準備 (ssh は何をするのか?)

ところが telnet だとその間の通信は他人から丸見えです.丸見えなのはイン ターネットの仕組み上仕方ないので,見えても大丈夫なようにすべてのデータ を暗号化しようというのが ssh です.暗号化の仕組みについてはここでは触 れません.

telnet がポート 23 と決まっているように,ssh はポート 22 と決まってい ます.B の ssh サーバ(sshd)は telnet サーバと同様のリモートログインの サービスを提供します.A の ssh クライアントがこれと通信することで,暗 号化通信ができるようになります.

Fig.2: SSH connection
Fig.2: ssh による接続

1. port forwarding とは何か

ネットワーク越しに行いたいのはリモートログインだけではありません.メー ルが読みたいときもあれば,ファイルを転送したいときもあります.ssh サー バが telnet の機能を兼ねているように,これらの機能も兼ねてくれれば問題 ないのですが,あらゆるサービスをつめこむわけにはいきません.そのために port forwarding と呼ばれる機能が用意されています.

port forwarding には,「ローカルのポートをフォワードする」と「リモー トのポートをフォワードする」の二種類があります.ここでは使用頻度が高い 思われる前者について説明しますが,後者も考え方は同様です.

A から B に ssh でログインして,このとき

という設定がなされていたとします.この場合,A の ssh クライアントは B の ssh サーバに通常通り(つまりポート 22 に)接続します.さらに A の ssh クライアントはポート N で接続を受け付けているサーバとして振る舞い ます.

Fig.3: ssh client waits for connections to the port N to come.
Fig.3: ssh クライアントはポート N への接続を待つ.

この状態で, ホスト A から localhost (自分自身) の N 番ポートに接続を行うと, A の ssh クライアントはそのことを B の ssh サーバに伝えます. B の ssh サーバはこのとき C の M 番ポートに接続します. そして A・B の ssh クライアント/サーバは協調して, A の N 番ポート ←→ C の M 番ポートの間で通信内容を転送します.

補足: このドキュメントの以前のバージョンでは, もう一つ別のホスト X の存在を仮定して, そこからホスト A の N 番ポートに接続できるような書き方をしていました. しかし,ほとんどの ssh の実装で,これは許されていないようです. (forwarding の受け付け用の socket には, 127.0.0.1 が bind されているようです)

Fig.4: A connection is made to the port N of the host A.
Fig.4: ホスト A の N 番ポートに対する接続が行われた.

Fig.5: ssh clients and sshd forward the connection to the port M of host C.
Fig.5: 接続を知らされた sshd は,ホスト C の M 番ポートに接続する.

結局この時点で, A の N 番ポートに接続しているプロセス(ソフトウェア)から見れば, C の M 番に接続しているのと論理的に同じ状態になります. ただし, そのプロセスは自分は localhost の N 番ポートに接続していると思っていますし, C は自分の M 番ポートに接続しているのは B だと思っています.

Fig.6: ``localhost: N'' at A is logically forwarded to ``Host C: M.''
Fig.6: 論理的には,ホスト C の M 番ポートにつないでいるのと同じ状態になる.

注意して頂きたいのは, ここで A・B 間の通信は ssh による暗号化通信のみである点です, この間で第三者が通信を傍受していてもセキュリティは保たれますし, A・B 間で ssh 以外の通信が許されていない場合 でも,他のサービスが使用できることになります.ただし, B・C 間はまったく暗号化されませんので注意が必要です.

ちなみに,よくあるケースは C が B 自身というような利用法です. この場合,生のデータはネットワークを一切流れないためとても気持ちいい, ということになります. 以下で説明する pop3, smtp, ftp に関しては,この場合について (すなわち,ssh サーバ自身が pop3, smtp, ftp のサーバを兼ね ている場合)説明します.

Fig.7: the case C is identical with B.
Fig.7: B と C が同一の場合.生のデータはホストの外を流れない.

2. pop3 (メール受信)の場合

1. の議論で,A が自宅の PC,B が ssh サーバで,仮に yourserver.example.com とします.pop3 のポート番号は 110 ですので,port forwarding の設定は,

となります.つまり C は B と同一です.ポート番号 Npop3 番は 自分でわかりやすい番号を適当に選んで構いません.Windows の場合フォワー ド先と同じく 110 にするのが楽かもしれません.より正しい OS をお使いの 場合は 1023 以下の番号は使えませんので,8110 とか 10110 とかする人が多 いようです.

メーラの設定では,pop3 のサーバとして, 「localhost の Npop3 番ポートを」を指定します. (Npop3 として 110 を指定していれば, ホスト名の設定だけでよい).

このような設定で ssh で yourserver.example.com に接続した後,おもむろにメールを読みに行く と普通にメールが読めるはずです.

Fig.8: forwarding POP3
Fig.8: POP3 の場合.

3. smtp (メール送信)の場合

1. の議論で,A が自宅の PC,B が ssh サーバで,仮に yourserver.example.com とします.smtp のポート番号は 25 ですので,port forwarding の設定は,

となります.つまり C は B と同一です.ポート番号 Nsmtp 番は 自分でわかりやすい番号を適当に選んで構いません.Windows の場合フォワー ド先と同じく 25 にするのが楽かもしれません.より正しい OS をお使いの場 合は 1023 以下の番号は使えませんので,8025 とか 10025 とかする人が多い ようです.

メーラの設定では,smtp のサーバとして, 「localhost の Nsmtp 番ポートを」を指定します. (Nsmtp として 25 を指定していれば,ホスト名の設定だけでよい).

このような設定で ssh で yourserver.example.com に接続した後,メールを送信すると普通にメー ルが送れるはずです.

Fig.9: forwarding SMTP
Fig.9: SMTP の場合.

4. ftp の場合

ftp の場合は少し話がややこしくなります. ややこしくなる最大の理由は,ftp が, 制御情報の送受信とデータの送受信に, 別の通信路を用いる仕組みになっている点にあります.

というわけで ftp は極めてややこしいので, sshd が動いているところとのファイル交換には, scp を使うことを強くお薦めします. (Windows 用のクライアントもあります.例えば ここに説明があります. )

さて,以下「一般的なケースについて」説明します. 「一般的」という言葉がやや問題ですが, 「まあ,動くとしたらこんな設定にしとけば動くんじゃないの?」 程度の意味で使っています. サーバやクライアントの置かれている状況によっては, このような方法では接続できない場合もあります. 適宜,関係方面に確認して下さい.

pop3 や smtp と同様に 1. の議論で, A が自宅の PC,B が ssh サーバで, 仮に yourserver.example.com とします. ftp の制御用ポート番号は 21 ですので, port forwarding の設定は,

となります.やはりポート番号 Nftp 番は自分でわかりやすい 番号を適当に選んで構いません.Windows の場合フォワード先と同じく 21 に するのが楽かもしれません.より正しい OS をお使いの場合は 1023 以下の番 号は使えませんので,8021 とか 10021 とかする人が多いようです.

ftp クライアントの設定ですが,まず前提として「passive mode」とする 必要があります.これができないクライアントは残念ながら使用できません. その上で,サーバとして, 「localhost の Nftp 番ポートを」を指定します. (Nftp として 21 を指定していれば,ホスト名の設定だけでよい).

これで通常通りファイル転送が可能になりますが,ひとつ重要な注意点が あります.「データ転送は暗号化されません」 ユーザ名,パスワードやコマンドなどは暗号化されますが, データそのものは生のまま流れますので注意して下さい.

気が向いたらもう少し詳しい説明を書きます.

Fig.10: forwarding FTP control connection
Fig.10: FTP の場合(コントロールポートのみ).

5. フォワーディングの設定の実際

メモ程度.

UNIX 用クライアントの場合

ホスト A から,「B に ssh で接続して,ローカルの N 番ポートを C の M 番 ポートにフォワードする」という場合は以下のようになります.詳しくは man 参照のこと.

 hostA% ssh -L N:C:M B

TeraTerm + SSH の場合

気が向いたら書くかも.


Shingo W. Kagami: swk@k2.t.u-tokyo.ac.jp
$Id: forwarding.html.in,v 1.6 2003/06/13 05:55:58 swk Exp $