无论是开发人员又或者是安全人员,经常要用到内网穿透去做一些测试,最简单的方法使用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连接这个隧道,将你对目标服务器的目标端口的访问,转变成目标服务器自己本地去访问

手绘示意图如下:

android端口转发udp 安卓 端口转发 apk_远程服务器


port2port3就是通过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

这个功能又能用来做什么呢?没错,最大的用处在于内网穿透

原理解释手绘图如下:

android端口转发udp 安卓 端口转发 apk_远程服务器


没错,和上面本地转发是一个示意图,这次我们反过来看,我们希望通过访问公网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设置记得删除就好

android端口转发udp 安卓 端口转发 apk_端口转发_03


当然,还有一点,你暴露到公网的端口,防火墙一定要给进出权限

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