跳到主要内容

7. TCP/IP Port Forwarding (TCP/IP 端口转发)

7. TCP/IP Port Forwarding (TCP/IP 端口转发)

7.1. Requesting Port Forwarding (请求端口转发)

一方不必显式请求从自身一端向另一方向的转发. 但是, 若希望将对端某端口的连接转发到本地, 则必须显式请求.

byte      SSH_MSG_GLOBAL_REQUEST
string "tcpip-forward"
boolean want reply
string address to bind (e.g., "0.0.0.0")
uint32 port number to bind

address to bindport number to bind 指定接受转发连接的 IP 地址 (或域名) 与端口. address to bind 的某些字符串具有特殊语义.

  • "" 表示在 SSH 实现支持的所有协议族上接受连接.

  • "0.0.0.0" 表示监听所有 IPv4 地址.

  • "::" 表示监听所有 IPv6 地址.

  • "localhost" 表示仅在回环地址上监听, 且涵盖 SSH 实现支持的所有协议族 ([RFC3330] 与 [RFC3513]).

  • "127.0.0.1""::1" 分别表示在 IPv4 与 IPv6 的回环接口上监听.

注意客户端仍可根据打开请求中传递的信息过滤连接.

仅当用户已被认证为特权用户时, 实现才应允许转发特权端口.

客户端实现应拒绝这些消息; 它们通常仅由客户端发送.

若客户端将要绑定的端口传 0 且 want reply 为 TRUE, 则服务器分配下一个可用的非特权端口号, 并以下列消息应答; 否则无响应特定数据.

byte     SSH_MSG_REQUEST_SUCCESS
uint32 port that was bound on the server

可用下列消息取消端口转发. 注意在收到对此消息的应答之前, 仍可能收到信道打开请求.

byte      SSH_MSG_GLOBAL_REQUEST
string "cancel-tcpip-forward"
boolean want reply
string address_to_bind (e.g., "127.0.0.1")
uint32 port number to bind

客户端实现应拒绝这些消息; 它们通常仅由客户端发送.

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 address that was connected
uint32 port that was connected
string originator IP address
uint32 originator port

除非先前已用给定端口号请求远端 TCP/IP 端口转发, 否则实现必须拒绝这些消息.

当连接到达本地转发的 TCP/IP 端口时, 向对端发送下列数据包. 注意对于未显式请求转发的端口, 也可能发送这些消息. 接收方必须决定是否允许转发.

byte      SSH_MSG_CHANNEL_OPEN
string "direct-tcpip"
uint32 sender channel
uint32 initial window size
uint32 maximum packet size
string host to connect
uint32 port to connect
string originator IP address
uint32 originator port

host to connectport to connect 指定接收方应将信道连接到的 TCP/IP 主机与端口. host to connect 可以是域名或数字 IP 地址.

originator IP address 是发起连接请求的机器的数值 IP 地址, originator port 是发起连接的主机上的端口.

转发的 TCP/IP 信道独立于任何会话; 关闭会话信道绝不意味着应关闭已转发的连接.

出于安全原因, 客户端实现应拒绝 direct TCP/IP 打开请求.