メインコンテンツまでスキップ

7. TCP/IP Port Forwarding (TCP/IP ポート転送)

7. TCP/IP Port Forwarding (TCP/IP ポート転送)​

このセクションでは, TCP/IP または X11 ポートへの接続を安全なトンネルで転送する方法について説明する. この機能は, 電子メール, ウェブ, およびデータベース接続といったアプリケーションプロトコルで用いられることが多い. 転送される接続は, 暗号化トンネルの中であっても, 終端システム間では必ずしも安全ではない.

7.1. Requesting Port Forwarding (ポート転送の要求)​

TCP/IP ポート転送を要求するには, 次のメッセージを送る.

byte      SSH_MSG_GLOBAL_REQUEST
string "tcpip-forward"
boolean want reply
string bind address
uint32 bind port

プログラムがクライアント側の特定のポートに到着した接続をリッスンする場合, それはサーバに対して, 接続をクライアントに転送するよう要求する. サーバはそのポートでのリッスンを開始し, それ以降のクライアントへの転送要求を許可する. 到着した接続は, サーバからクライアントへ, 以下の TCP/IP 転送チャネル (セクション 7.2) で転送される.

bind address が空の文字列の場合, サーバはすべてのプロトコルファミリとアドレスに対してポートをリッスンすべきである. そうでなければ, 指定されたアドレスのみに対してリッスンすべきである.

プログラムがサーバ側のポートへの接続をリッスンしたい場合, それは SSH_MSG_CHANNEL_OPEN メッセージを direct-tcpip チャネンル型とともにサーバに送る. (セクション 7.2 参照)

「ポート転送を要求する」とは, クライアントまたはサーバがもう一方の側でリッスンを開始するよう要求することを意味する. クライアントは, 自身が送信する TCP/IP 接続の転送を要求するためにも, 同じメッセージを使用してよい (セクション 7.2 参照).

実装は, 新しいポート転送の要求ごとに, 応答を要求し検査することが強く推奨される. 可能な場合は SSH_MSG_REQUEST_FAILURE が返される.

7.2. TCP/IP Forwarding Channels (TCP/IP 転送チャネル)​

サーバ側でリッスンされたポートへの接続が到着した場合, サーバはクライアントにチャネルを開くよう要求する. このチャネルは, クライアントが自身の側で対応するポートへの接続を開くまで, 開いたままにしておくべきである.

チャネルを開くメッセージは次のとおり.

byte      SSH_MSG_CHANNEL_OPEN
string "forwarded-tcpip"
uint32 sender channel
uint32 initial window size
uint32 maximum packet size
string connected address (e.g., "192.168.7.38")
uint32 connected port
string originator address (e.g., "192.168.7.38")
uint32 originator port

クライアント側からサーバ側のポートへの接続を転送する要求は, 次のメッセージ型で行う.

byte      SSH_MSG_CHANNEL_OPEN
string "direct-tcpip"
uint32 sender channel
uint32 initial window size
uint32 maximum packet size
string host to connect (e.g., "192.168.7.38")
uint32 port to connect
string originator address (e.g., "192.168.7.38")
uint32 originator port

実装は, これらの開かれたチャネル上のすべてのデータを, 適切なローカルソケットに転送しなければならない.