技術的雑談-sshのportForwadingってなあに?
環境
- sshのversion:3.6.1p2らしい
- OS:多分何でも大丈夫
目的
- sshのPort Forwadingって何なのか少しだけ説明
sshでは以下のオプションでポートフォワーディング(Port Forwarding)ができるらしい。
ssh -l ユーザ名 -L port:host:port ホスト 又は ssh -l ユーザ名 -R port:host:port ホスト
でも、これだけだとman読んでも良くわからない……(汗)
で、実際に試してみました。
実験
話の流れ上、
- sshdのいるホストを「サーバ」(以下の例ではhost1)
- sshを実行するホストを「クライアント」(以下の例ではhost2)
と呼ばせて頂きます。
-Lって何?
Lオプションはmanによると
Specifies that the given port on the local (client) host is to be forwarded to the given host and port on the remote side. This works by allocating a socket to listen to port on the local side, and whenever a connection is made to this port, the connection is forwarded over the secure channel, and a connection is made to host port hostport from the remote machine. Port forwardings can also be specified in the configuration file. Only root can for- ward privileged ports. 【適当訳:】 これを指定すると、指定されたlocal(client)のポートを指定されたホストの 指定されたサーバに転送する。 local側にlistenするportを用意し、このポートへのアクセスはどこからのもの であっても指定されたportに転送される。云々。以下省略。
らしいので、要は、「クライアント側に1個Portの口をあけて、そこに来たアクセスは全部どこかに転送しまっせ」という事らしい。
(ただし、使えるのはrootだけらしい。)
んなわけで実験。
host2# ssh -l hoge -L 8880:host1:80 host1
を実行すると、
- host2側でnetstat -aすると、localhost:8880がlistenになっている
- host1側は特に変化無し
という変化がおきます。
ここでhost2から、
# telnet localhost 8880
を実行すると、実際にはhost1のport 80(=webサーバ)につながります。
「GET / HTTP/1.0」とEnter2回でhost1のトップページが表示できるでしょう。
また、先の-L 8880:host1:80の代わりに「-L 1234:www.hoge.com:80」なんて指定してsshを起動すると外部のwww.hoge.comに接続することができます。
-Rって何?
先程の-Lでは、sshを使った側のサーバに転送用のPortができましたが、-Rではsshdのある側に転送用のポートができます。
んなわけで再び実験。
host2# ssh -l hoge -R 8880:host1:80 host1
を実行すると、
- host2側は特に変化無し。
- host1側でnetstat -aすると、localhost:8880がlistenになっている。
という変化がおきます。
試しに、
host1# telnet localhost 8880
とすると、host1のwebサーバにつながります。
(いや、自分のwebサーバにポート変えて接続できて何が楽しいんだ?という疑問はありますが…。)
でも、こちらも同じく外部のhostを指定することができます。
履歴
2005/12/27 -- 初版
技術的雑談へ戻る