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 bind 与 port 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 connect 与 port to connect 指定接收方应将信道连接到的 TCP/IP 主机与端口. host to connect 可以是域名或数字 IP 地址.
originator IP address 是发起连接请求的机器的数值 IP 地址, originator port 是发起连接的主机上的端口.
转发的 TCP/IP 信道独立于任何会话; 关闭会话信道绝不意味着应关闭已转发的连接.
出于安全原因, 客户端实现应拒绝 direct TCP/IP 打开请求.