无论是开发人员又或者是安全人员,经常要用到内网穿透去做一些测试,最简单的方法使用ngrok.cc提供的服务。但是如果不想付费,手里又有云服务器,有没有什么好办法呢?
答案是有的,我们可以使用ssh远程端口转发来迅速满足需求。
在介绍ssh远程端口转发之前,顺便将ssh端口转发的所有功能都介绍一下,当然,内网穿透使用直接目录点击远程转发进行跳转即可
本文已配备完善视频讲解,此处跳转b站视频,传送门
目录结构
- 端口转发
- 1.1、本地转发
- 1.2、mysql实例
- 2.1、远程转发
- 2.2、实例说明1
- 2.3、实例说明2
- 3.1、动态转发
- 4.1、参数补充
- 端口转发维持
- 1、linux端处理
- 2、windows端处理
端口转发
SSH端口转发其实也可以理解为“一条隧道”,功能在于通过“隧道”的方式,在本地端口和远程服务器的某个服务之间建立转发关系。
这其中,ssh连接充当了转发服务流量的隧道。当然,这么说可能不是很容易理解,下面带着例子,再具体说明其的作用
1.1、本地转发
本地端口转发指的是在本机上发起请求,由 ssh client
转发到远程的机器上。它的命令如下:
ssh -L <port_a>:<remote host>:<port_b> user_b@ip_b
具体能用来干嘛,我们可以设想一个情景,远程服务器上有个只能服务器本地访问的web服务,我们该如何去访问?
或许你会回答,把防火墙端口打开,但是有些时候,为了安全性,又不愿意暴露端口,该怎么办呢?
ssh端口转发就是一种比较简单的做法,通过ssh连接这个隧道,将你对目标服务器的目标端口的访问,转变成目标服务器自己本地去访问
手绘示意图如下:
port2
到port3
就是通过ssh建立的通道
上述通道建立的命令如下:
ssh -L <port1>:<ip2>:<port4> user@ip2
通过这个命令,之后我们电脑本地(ip1)通过127.0.0.1:port1
访问交互,相当于以ip2的身份,通过127.0.0.1:port4
的方式访交互问
1.2、mysql实例
ssh -L 9099:ip:3306 -Nf root@ip
输入密码建立ssh通道之后,可以在本地,通过
mysql -h127.0.0.1 -P9099 -uroot -p
对ip这个远程服务器的mysql
服务进行访问
2.1、远程转发
远程端口转发指的是在远程服务器上接收到请求,由 ssh client
转发到本地的机器指定端口上。它的命令如下:
ssh -R <ip3>:<port_a>:<remote host>:<port_b> user_b@ip_b
这个功能又能用来做什么呢?没错,最大的用处在于内网穿透
原理解释手绘图如下:
没错,和上面本地转发是一个示意图,这次我们反过来看,我们希望通过访问公网ip的port4端口,能够访问到你本地的某个服务
上述通道建立的命令如下:
ssh -R <ip3>:<port4>:<ip1>:<port1> user@ip2
通过这个命令,之后我就能允许ip3,通过访问ip2的port4端口,访问到我本地电脑的port1端口
但是值得注意的是,ssh有做安全设置,默认不允许ssh远程端口转发,需要打开设置
vim /etc/ssh/sshd_config # ubuntu
# 其他请自行寻找配置文件所在
GatewayPorts yes
# 添加这个配置,有no设置记得删除就好
当然,还有一点,你暴露到公网的端口,防火墙一定要给进出权限
2.2、实例说明1
暴露本地web服务到公网
ssh -R 0.0.0.0:10090:ip1:80 -Nf root@ip2
所有访问ip2:10090的请求都会被转发到你本地电脑的80端口,相当于外网可以直接访问你本地的服务了,这常用于远程测试的时候,本地测试环境方便别人测试
# 0.0.0.0 表示允许任何ip接入
2.3、实例说明2
burp抓包,内网穿透
ssh -R 0.0.0.0:10090:ip1:8080 -Nf root@ip2
给手机设置ip2,10090端口作为代理,之后你手机访问的所有流量都会通过ip2-ip1的ssh隧道,到达本地电脑的8080端口,被burp抓取到流量,再通过本地电脑前往真正的目的地
# 0.0.0.0 表示允许任何ip接入
3.1、动态转发
当用浏览器访问internet时,本机的1080端口做为代理服务器,浏览器的访问请求被转发到sshserver上,由sshserver替之访问internet
这个和本地转发非常相似,不过本地转发指定了访问的目标服务器,而这个没有
这个可以用来做什么,知道自然懂,不知道的我也不敢说呀
# 命令如下
ssh -D 1080 root@ip
4.1、参数补充
选项:
-f # 后台启用,可以在本机直接执行命令,无需另开新终端
-N # 不打开远程shell,处于等待状态,只是搭好了隧道,不ssh上去
端口转发维持
1、linux端处理
不论使用哪种模式,SSH做端口转发时,都需要在本地和远程服务器之间建立隧道。这种连接是不稳定的,当网络情况不好时,连接可能会中断,而autossh就可以解决这种问题
autossh
是在ssh
的基础之上,增加了一个监控端口,防止ssh session
过期,并可以重新连接保证不掉线,这保证我们在ssh
执行远程服务器上的运行时间长的脚本时不会出现意外失联的情况。
项目地址:
https://github.com/islenbo/autossh
举例说明,我要执行远程端口转发的功能,将本地8080端口映射到远程服务器的10010端口,使用ssh命令如下:
autossh -M 20000 -Nf -R 0.0.0.0:10010:ip1:8080 root@ip2
2、windows端处理
可以直接使用参数 -o ServerAliveInterval=60
命令如下:
ssh -o ServerAliveInterval=60 -Nf -R 0.0.0.0:10010:ip1:8080 root@ip2