SSH端口转发(ssh隧道)

在打DarkHole2靶机的时候,使用到了ssh端口转发,在网上搜集了很多资料,特此记录下来,以便后续查找

ssh端口转发

      • SSH 隧道
    • 本地端口转发
    • 远程端口转发
    • 动态端口转发

当我们需要访问一台主机(host2)的某个端口,但我们使用的主机(host1)无法和它直接通信,与此同时还有一台主机(host3),它可以和host2进行通信,也开启了ssh服务,这时ssh端口转发就可以帮助我们突破网络隔离,实现host1对host2的访问

SSH 隧道

  • ssh是一种应用层协议,它的传输层协议是tcp。
  • 隧道是一种把一种网络协议封装进另外一种网络协议进行传输的技术。
  • ssh隧道又被称作端口转发,通常会绑定一个本地端口,比如22端口,所有发向这个端口的数据包,都会被加密并透明地传输到远端系统。

本地端口转发

首先是daikhole2所用到的本地端口转发
SSH端口转发(ssh隧道)_第1张图片
host1可以和host3相互通信,host3可以和host2相互通信,但host1和host2之间不能直接通信
现在需要实现host1和host2之间的通信(前提是要知道host3的用户账号密码)
在host1上执行

ssh -fNg -L  6666:host2:80  host3
  • -L 本地端口转发
  • -f 后台转发
  • -g 网关作用,让其它主机也能访问端口
  • -N 不执行ssh远程指令

在这个例子里就是

ssh -fNg -L  6666:192.168.181.4:80 [email protected]

这样就可以在host1主机上使用127.0.0.1:6666访问到host2:80端口(具体连接方法下面介绍)
虽然此时可以访问host2,但是因为本地端口转发端口默认绑定的是回环地址,只能通过127.0.0.1或localhost访问,即使参数有-g,别的主机(host4)也无法通过host1的6666端口访问host2
所以需要使用bind_addr修改端口转发地址
最好的指令应该是这样的

ssh -fNg -L host1:6666:host2:80  host3

也就是

ssh -fNg -L  192.168.181.3:6666:192.168.181.4:80 [email protected]

将host2:80端口映射到host1:6666端口上,当host1或host4发起对192.168.181.3:6666端口的请求时,由于host1的ssh服务监听了6666端口,并且host2:80端口已经映射到host1:6666端口上(host1:6666:host2:80,映射端口),当host1接收到6666端口的数据包后,就会将数据包的目标地址和端口号替换为192.168.181.4:80,然后转发给host3,由host3代为访问host2:80。此时的host3就相当于一个跳板,作用就是转发host1对host2的请求
这样就实现了host1访问host2

如果要将host3的80端口映射到我们本机host1的8080端口,可以使用

ssh -L 8080:127.0.0.1:80  [email protected]

远程端口转发

接下来是远程端口转发,和下面的动态端口转发一样,都还没用到,只是顺便记录下来

SSH端口转发(ssh隧道)_第2张图片
host3可以和host2通信,也能和host1通信,但因为防火墙的存在,host1不能和host3通信

现在需要实现host1和host2通信

上面的本地端口转发是将host3作为sshd服务器,让host1作为客户端和它通信,远程端口转发则是反过来,让host1作为sshd服务器,host3作为客户端主动连接host1
在host3上执行

ssh -fNg -R 22333:host2:80  host1
  • -R 远程端口连接

host3请求host1的sshd服务器在host1开启一个套接字监听22333端口,并将host2:80映射到该端口

当有主机访问host1:22333端口时,所用数据都通过host1和host3之间的ssh安全隧道转发给host3,再由host3代为访问host2:80端口

但是此时远程端口转发的sshd服务器再host1上,在sshd默认配置下,只允许本地开启22333端口绑定在回环地址上,不能通过bind_addr修改,只能在host1的sshd配置文件中启用"GatewayPorts",此时bind_addr绑定在所有地址上,其他主机才能访问到host:22333端口

动态端口转发

本地/远程端口转发都固定了端口的映射,也就是说转发端口和目标端口之间的通信协议是一对一的关系
比如host2:80端口映射到host1:8080,此时可以使用浏览器向host1:80发送http请求,但不能使用ssh工具向host:8080发送命令,8080端口是无法解析的
SSH端口转发(ssh隧道)_第3张图片
当我们既想要在host1上访问host2,也想访问互联网,就需要使用动态端口转发

ssh -fNg -D 2222 host3
  • -D 动态端口转发

道理和本地端口转发很像,host1在本地创造一个套接字,充当socks4或5服务监听2222端口,当客户端程序设置了host1:2222代理时,所有的数据都会转发到host1:2222端口上,再由host:2222通过安全隧道将数据转发给host3,最后由host3转发到host2的动态端口或者连接互联网

你可能感兴趣的:(杂七杂八,ssh,服务器,网络)