在打DarkHole2靶机的时候,使用到了ssh端口转发,在网上搜集了很多资料,特此记录下来,以便后续查找
首先是daikhole2所用到的本地端口转发
host1可以和host3相互通信,host3可以和host2相互通信,但host1和host2之间不能直接通信
现在需要实现host1和host2之间的通信(前提是要知道host3的用户账号密码)
在host1上执行
ssh -fNg -L 6666:host2:80 host3
在这个例子里就是
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]
接下来是远程端口转发,和下面的动态端口转发一样,都还没用到,只是顺便记录下来
host3可以和host2通信,也能和host1通信,但因为防火墙的存在,host1不能和host3通信
现在需要实现host1和host2通信
上面的本地端口转发是将host3作为sshd服务器,让host1作为客户端和它通信,远程端口转发则是反过来,让host1作为sshd服务器,host3作为客户端主动连接host1
在host3上执行
ssh -fNg -R 22333:host2:80 host1
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端口是无法解析的
当我们既想要在host1上访问host2,也想访问互联网,就需要使用动态端口转发
ssh -fNg -D 2222 host3
道理和本地端口转发很像,host1在本地创造一个套接字,充当socks4或5服务监听2222端口,当客户端程序设置了host1:2222代理时,所有的数据都会转发到host1:2222端口上,再由host:2222通过安全隧道将数据转发给host3,最后由host3转发到host2的动态端口或者连接互联网