SSH提供了三种转发模式:本地端口转发、远程端口转发以及动态端口转发,本文将介绍这三种转发模式的用法。
本地主机:SSH客户端所在的主机。
远程主机:相对于本地主机的概念,在本地主机之外的主机叫远程主机。
SSH命令行参数解释
-C:压缩传输,提高传输速度
-f:将ssh转入后台执行
-N:建立静默连接(连接后看不到具体会话)
-g:允许远程主机连接本地用于转发的端口
-L:本地端口转发
-R:远程端口转发
本地端口转发,即将本地端口转发到远程主机上,命令格式:ssh -L <local port>:<remote host>:<remote port> <username>@<SSH hostname>
举例:
SSH Client IP:x.x.x.x
SSH Server IP:a.b.c.d
在SSH Client运行命令ssh -CfNg -L 127.0.0.1:1313:127.0.0.1:1313 root@a.b.c.d ,将127.0.0.1:1313端口转发到SSH Server的127.0.0.1:1313端口上。此时SSH Client访问127.0.0.1:1313的结果跟访问在SSH Server端的127.0.0.1:1313结果一样。
在SSH Client上
![]()
此时在SSH Client上的ssh会监听127.0.0.1:1313这个端口,该端口的TCP数据通过ssh隧道传输到SSH server上。

在SSH Server上,先监听127.0.0.1:1313端口,本文监听使用hugo 启动一个server。
![]()
在SSH Client上使用curl 127.0.0.1:1313命令时返回的内容即为SSH Server上127.0.0.1:1313的内容

同时本地端口转发命令中remote ip不止限制在127.0.0.1上,remote ip可以是任何一个SSH Server能够连接的host,实际上本地端口转发过程中,实际上是把SSH Server当作跳板机,连通SSH Client和SSH Server另外一端的主机,如下:
|SSH Client| <------------->|SSH Server| <-------------->|SSH Client不能访问但是SSH Server能访问的主机|
本地端口转发一般应用场景为在渗透测试过程中控制了目标网络中带有SSH Server的一台机器,通过这台机器做为跳板机来访问内网其他主机上的服务。一定程度上规避防火墙的流量告警(因为ssh流量为加密流量)
远程端口转发即和本地端口转发是相反的概念,本地端口转发是将本地端口转发到远程端口上,连接本地端口即跟连接远程端口一个效果。而远程端口转发即将远程端口转发到本地,使得连接远程端口即跟连接本地端口一样。命令格式:ssh -R <remote port>:<local ip>:<local port> <username>@<SSH hostname>
举例:
SSH Client IP:x.x.x.x
SSH Server IP:a.b.c.d
本次我们将SSH Client的3389端口转发到SSH Server(公网服务器)上,使得另外一台机器能够通过SSH Server的端口连接到位于局域网的SSH Client的远程桌面。
在ssh client上运行命令
![]()
此时任何连接SSH Server:9898的请求都会被转发到SSH Client的58989端口上,该端口监听的服务为远程桌面服务。在另外一台电脑(不同于SSH Server和SSH Client)使用远程桌面连接SSH Server:9898


同本地端口转发一样,远程端口转发命令中的local ip可以是任何一个SSH Client能够连接的host,此时SSH Client被当作跳板机,连通SSH Client另外一端和SSH Server端的主机。
|SSH Serve能够连通的主机| <--------------> |SSH Client| <--------------> |SSH Client能访问但是SSH Server不能访问的主机|
远程端口转发应用场景一般是将局域网的某些服务通过SSH隧道暴露在公网上,或者在渗透测试过程中,控制了内网的某台主机,通过远程端口转发,将该主机作为跳板机来访问内网其他服务,因为此时SSH是从内网连接到外网,在流量上没有那么可疑。
在本地端口转发和远程端口转发过程中,一次性只能转发一个端口,在某些场景下效率太低了,而动态端口转发没有指定目的端口,相对于前两种来说更灵活。实际上动态端口转发即为SSH实现的SOCKS协议。命令格式:ssh -D port <username>@<SSH host>。
在SSH Client执行命令即可在SSH Client和SSH Server之间建立socks5隧道,SSH Client可以连接该隧道来传输数据。
![]()

在一些情况下可以通过组合上面三种转发来达到意想不到的效果。
例如,有两台位于互不相通的局域网主机,如果一台想要访问另外一台能够访问的服务时,可以以下面的方式达到目的
在主机1上执行命令 ssh -CfNg -R 9898:192.168.50.1:22 root<SSH Server> 将主机1的ssh端口转发到公网服务器的9898端口。
在主机2执行命令ssh -D 12222 -p 9898 <username>@<SSH Server> 此时ssh连接的是主机1,且建立了socks隧道,通过该隧道主机2可以方便的使用主机1能访问而主机2不能直接访问的服务。