概述
SSH端口转发可以用来加密数据或是穿透防火墙。在具体的使用场景中,可以被细分为本地端口转发、
远程端口转发、动态端口转发等
应用客户端和应用服务端不在直接建立通信,而是通过ssh隧道来完成数据的转发操作
实验拓扑
VLAN可以互通,VLAN10可以通外网,外网主机ping通内网
VLAN10中有一台xp,一台metasploitable2,两台rhel。VLAN20中有一台server2003,运行着IIS
端口转发
本地端口转发
ssh -L <local port>:<remote host>:<remote port> <SSH hostname>
主机A为应用客户端,主机B为应用服务端。同时在主机A的一侧存在SSH的客户端,主机B的一侧存在
SSH的服务端。这样就构成了本地端口转发的条件
倘若主机B上的服务仅监听本地端口,那么就可以用本地端口转发的方式,将这个端口“映射”给主机A,
主机A通过访问自己本地的端口就可以访问主机B的服务
例1:
- metasploitable主机的apache服务只监听本地的80端口
要让VLAN中的所有主机均可访问metasploitable主机的apache服务。
那么我们就可以使用ssh -fNg -L 23333:localhost:80 [email protected]
将主机A的23333端口转发至<remote>:<port>
上。这里的localhost和<SSHhostname>
表示同一台主机-L
指本地转发,即后面的端口开在本地-f
在执行命令前退至后台-N
不执行远程命令,用于转发端口-g
允许远端主机连接本地转发的端口
例2:
- server 2003只能由rhel6主机访问
- 要让VLAN中的所有主机均能访问server 2003上的IIS
那么我们就让rhel7主机和rhel6主机建立SSH,通过rhel6主机访问server 2003
ssh -fNg -L 23334:10.0.1.100:80 [email protected]
命令详解:可以将
<remote>:<port>
形象的理解成最终访问的目标,将-L <local port>
与<SSH hostname>
理解成建立ssh隧道的两端。这也就能形象的解释上个例子中localhost
与`<SSH
hostname> `指同一台主机。需要注意的是,只有在建立SSH隧道的通道中数据是加密传输的,其他地方的数据传输并没有经过SSH的加密
远程端口转发
如果应用客户端和SSH服务端在一侧,应用服务端和SSH客户端在令一侧,那么这种端口转发就是远程端口转发
ssh -fN -R <local port>:<remote host>:<remote port> <SSH hostname>
与本地转发的格式类似,但是远程转发不支持参数-g
例子:
- 外网中有台kali主机,ip为192.168.111.128,已经开启了ssh服务,端口22。外网主机无法主动访问内网
通过远程端口转发实现内网穿透,使得Kali可以访问到metasploitable主机的apache服务
那么我们就可以在metasploitable主机上使用ssh -fN -R 23333:localhost:80 [email protected]
- -R 指远程转发,即后面的端口开在远程
这里的localhost指metasploitable主机
- -R 指远程转发,即后面的端口开在远程
关于-g
参数,可以修改/etc/ssh/sshd_config
配置文件中GatewayPorts yes
即可实现远程主机连
接本机的转发端口
究其原因,SSH的服务端在远程转发中只会监听本地的环回口
在配置完之后便会监听所有网卡
动态端口转发
动态端口转发的对比就是静态端口转发。本地端口转发与远程端口转发都属于静态端口转发,他们的特点就是应用服务端的ip地址和监听端口号都是固定的。倘若这些都是变化的,那么这就是动态端口转发
SSH 动态端口转发是通过Socks协议实现的,创建动态端口转发时SSH服务器就类似一个Socks代理服务器,所以这种转发方式也叫Socks转发
ssh -D <local port> <SSH hostname>
需要注意的是,不需要指定目标ip与端口号。这时SSH客户端就会开始监听本地端口<local port>
,当配置完需要Socks代理的服务后,请求会被转发到SSH服务端上