SSH端口转发:本地端口转发、远程端口转发、动态端口转发

SSH隧道也可以叫SSH端口转发,这两者并没有什么太大的区别,SSH端口转发竟然实现了正向代理、反向代理和内网穿透三种常用的网络功能,更佩服其功能的强大和使用中的便利。

 

一、SSH本地端口转发

本地端口转发(Local Port Forwarding),是将本地主机某个端口流量转发到远程主机的指定端口。

 

其命令行语法是:

ssh -L [bind_address]:<local port>:[remote host]:<remote port> <SSH hostname>

 

”-L”即“local”的首字母,类似的远程转发的”-R”是“remote”的首字母,动态转发的“-D”是“dynamic”的首字母,很好记。

 

示例1:

ssh -L 5901:5901 username@host

该命令中将本地的5901端口通过ssh隧道转发到远程主机的5901端口,远程连接时输入localhost或者127.0.0.1和5901端口便连到了远程主机的5901端口。通过iptables和ssh的本地转发,实现了他人无法连接,只有自己才能访问的目的。

 

问:本地端口转发命令中的 <remote host> 和 <SSH hostname> 可以是不同的机器么?

答:需要注意的是“-L”选项中的“远程主机”并不特指连接过去的机器(默认是连接上的机器),可以是任何一主机。例如,可以将本机的8080端口流量转发到fujieace.com的80端口:

ssh -L 8080:fujieace.com:80 username@host

 

示例2(实战):

假设Server-A的IP为:192.168.58.101,Server-B的IP是:192.168.58.103

 

在Server-B上执行如下命令:

ssh -f -N -L 9906:192.168.58.101:3306 192.168.58.101

上面的这条命令,就建立了本地端口转发(SSH隧道),本地服务器Server-B发送到9906端口的所有数据都会被转发到远程服务器192.168.58.101的3306端口。

 

SSH隧道已经建立,可以往隧道发送数据,会自动转发到目的服务器和端口。

在本地服务器Server-B(192.168.58.103)上执行如下命令就可以建立到远程服务器Server-A(192.168.58.101:3306)的MySQL连接:

mysql -h127.0.0.1 -P9906 -uroot -p

 

二、SSH远程端口转发

远程端口转发(Remote Port Forwarding),是将远程主机某个端口转发到本地主机的指定端口。

 

其命令行语法是:

ssh -R [bind_address]:<remote port>:[local host]:<local port> <SSH hostname>

 

远程转发最常用的功能是内网穿透。有一个公网ip的主机,便可以借助ssh隧道的远程转发实现内网渗透,达到外网访问内网资源的目的。需要注意的是ssh远程转发默认只能绑定远程主机的本地地址,即127.0.0.1。如果想要监听来自其他主机的连接,需要修改远程主机ssh的配置,将”GatewayPorts”改成“yes”,重启ssh后生效。

 

示例1:

一个将远程的8080端口流量转发到本地80web端口的示例:

ssh -R0.0.0.0:8080:80 username@host

通过远程转发,访问公网ip主机的8080端口便是访问内网web主机的80端口,这样就实现了内网穿透。

 

示例2(实战):

假设Server-A的IP为:192.168.58.101,Server-B的IP是:192.168.58.103

 

在Server-A上执行如下命令:

ssh -f -N -R 9906:192.168.58.101:3306 192.168.58.103

上面的这条命令,就建立了远程端口转发,把远程服务器Server-B的9906端口的所有数据都会被转发到本地服务器Server-A192.168.58.101的3306端口。

 

在Server-B上执行命令:

mysql -h127.0.0.1 -P9906 -uroot -p

就可以连接到Server-A上的MySQL Server了。

 

三、SSH动态端口转发

无论本地转发还是远程转发,都需要指定本地和远程主机的端口,就是前提都是要求有一个固定的应用服务端的端口号,如果没有就不能进行转发。

动态转发(Dynamic Port Forwarding)则摆脱这种限制,只绑定本地端口,远程主机和端口由发起的请求决定。

 

动态转发的语法是:

ssh -D [bind_address]:<local port> <SSH hostname>

 

示例1:

ssh -D 8080 username@host

该命令让ssh监听本地8080端口,经过8080端口的流量都通过ssh隧道由远程服务器代为请求,从而达到获取被屏蔽资源、隐藏真实身份的目的。

 

动态转发实际上实现了正向代理功能,因此可以用来科学上网。本地转发也可以做正向代理,但要对每一个请求的主机和端口做转发,比较繁琐,实践中不会这么用。

 

总结:

从用户端角度看,SSH本地转发是正向代理;从资源提供方角度看,SSH本地转发是反向代理;

ssh连接断开,远程转发或内网渗透便失效。如果希望远程转发一直有效,需要ssh保持一直能活跃连接技术,建议用frp等专注于内网渗透的解决方案;

虽然ssh隧道中的流量都经过了加密,但防火墙对ssh隧道中承载的流量能比较智能的识别,因此用作科学上网很容易受到干扰;

如果仅做端口转发,实践中上述命令经常与”-NT -f”选项结合使用。其中”-f”选项将命令放入后台执行,断开连接需要用kill命令;

从代理角度看,ssh隧道是低效的,建议用专用软件;

ssh隧道的流量都经过了加密,从安全角度是十分可靠的。

    A+
发布日期:2019年12月08日 21:37:17  所属分类:Linux
最后更新时间:2019-12-08 21:51:52
付杰
  • ¥ 39.0元
  • 市场价:39.0元
  • ¥ 199.0元
  • 市场价:199.0元
  • ¥ 388.0元
  • 市场价:388.0元
  • ¥ 129.0元
  • 市场价:199.0元

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: