New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
调试利器-SSH隧道 #11
Comments
涨姿势 |
💯 |
1 similar comment
💯 |
用过 |
多谢 ssh隧道能映射其他端口吗? 如 3306 (mysql )mongo (27017) 之类 |
感谢博主分享 我自建的Ngrok用起来很方便👍 不过ngrok1.7有内存泄漏问题 准备换frp试试😀 |
好方法长见识了,不过应该不是内网穿透,因为不是用nat实现的,像是让目标机器上sshd除了使用22端口外再另外开启端口x,从端口x的流量都复用了原来22的ssh长连接,到了源机器再做的tcp proxy。 |
不错 lanproxy 也可以 |
666 |
奇怪 经试验 我本地必须加上 另外这种方式不支持3306 Mysql服务 |
个人感觉 ngrok 足以满足个人开发。 |
💯 |
个人目前使用的是frp,周末尝试一下ssh转发。THS... |
frp路过. 其它的相对来说要么收费,要么比较麻烦了. |
发布到测试机 绑定host不行吗? |
涨姿势了,回头试试。 |
windows 可以用gitbash |
lightsocks 牛逼 |
bbb |
本文将教你如何通过 SSH 隧道把本地服务映射到外网,以方便调试,通常把这种方法叫内网穿透。
阅读完本文后,你能解决以下常见问题:
最终目的
把运行在本地开发机上的 HTTP 服务映射到外网,让全世界都能通过外网 IP 服务到你本地开发机上的 HTTP 服务。例如你本地的 HTTP 服务监听在
127.0.0.1:8080
,你有一台公网 IP 为12.34.56.78
的服务器,通过本文介绍的方法,可以让全世界的用户通过http://12.34.56.78:8080
访问到你本地开发机上的 HTTP 服务。总结成一句话就是:把内网端口映射到外网。
前提条件
为了把内网服务映射到外网,以下资源为必须的:
ssh
登入到外网服务器。要满足以上条件很简单:
实现原理
要实现把内网端口映射到外网,最简单的方式就是通过 SSH 隧道。
SSH 隧道就像一根管道,能把任何2台机器连接在一起,把发送到其中一台机器的数据通过管道传输到另一台机器。假如已经通过 SSH 隧道把本地开发机和外网服务器连接在了一起,外网服务器端监听在
12.34.56.78:8080
,那么所有发给12.34.56.78:8080
的数据都会通过 SSH 隧道原封不动地传输给本地开发机的127.0.0.1:8080
,如图所示:也就是说,去访问
12.34.56.78:8080
就像是访问本地开发机的127.0.0.1:8080
,本地开发机上的 8080 端口被映射到了外网服务器上的 8080 端口。如果你的外网服务器 IP 配置了域名解析,例如
yourdomin.com
会通过 DNS 解析为12.34.56.78
,那么也可以通过yourdomin.com:8080
去访问本地开发机上的服务。这样就做到了访问外网地址时其实是本地服务返回的结果。
实现步骤
把本地开机和外网服务器通过 SSH 隧道连接起来就和在本地开发机 SSH 登入远程登入到外网服务器一样简单。
先来回顾以下 SSH 远程登入命令,假如想在本地远程登入到
12.34.56.78
,可以在本地开发机上执行以下命令:而实现 SSH 隧道只需在本地开发机上执行:
如果想同时映射多个端口则可以执行:
可以看出实现 SSH 隧道的命令相对于 SSH 登入多出来
-R 8080:127.0.0.1:8080
,多出的这部分的含义是:在远程机器(
12.34.56.78
)上启动 TCP 8080端口监听着,再把远程机器(12.34.56.78
)上8080端口映射到本地的127.0.0.1:8080
。执行完以上命令后,就可以通过
12.34.56.78:8080
去访问本地的127.0.0.1:8080
了。通常把这种技术叫做 SSH 远程端口转发(remote forwarding)。
其实不限于只能把本地开发机上运行的服务映射到外网服务器上去,还可以把任何本地开发机可以访问的服务映射到外网服务器上去。例如在本地开发机上能访问
github.com:80
,在本地开发机上执行:就能通过
12.34.56.78:8080
去访问github.com:80
了。保持运行
在执行完上面介绍的 SSH 隧道命令后,你会发现登入到了外网服务器上去了,如果你登出外网服务器,就会发现
12.34.56.78:8080
无法访问了。导致这个问题的原因是你登出外网服务器时,在外网服务器上本次操作对应的 SSH 进程也跟着退出了,而这个退出的进程曾负责监听在 8080 端口进行转发操作。为了让 SSH 隧道一直保持在后台执行,有以下方法。
通过 SSH 自带的参数
SSH 还支持这些参数:
因此要让 SSH 隧道一直保持在后台执行,可以通过以下命令:
通过 AutoSSH
SSH 隧道是不稳定的,在网络恶劣的情况下可能随时断开。如果断开就需要手动去本地开发机再次向外网服务器发起连接。
AutoSSH 能让 SSH 隧道一直保持执行,他会启动一个 SSH 进程,并监控该进程的健康状况;当 SSH 进程崩溃或停止通信时,AutoSSH 将重启动 SSH 进程。
使用AutoSSH 只需在本地开发机上安装 AutoSSH ,方法如下:
brew install autossh
;apt-get install autossh
;安装成功后,在本地开发机上执行:
就能完成和上面一样的效果,但本方法能保持 SSH 隧道一直运行。
可以看出这行命令和上面的区别在于把
ssh
换成了autossh
,并且少了-f
参数,原因是 autossh 默认会转入后台运行。常见问题
如果你遇到通过以上方法成功启动 SSH 隧道后,还是无法访问
12.34.56.78:8080
,那么很有可能是外网服务器上的 SSH 没有配置对。为此你需要去外网服务器上修改/etc/ssh/sshd_config
文件如下:这个选项的意思是,SSH 隧道监听的服务的 IP 是对外开放的 0.0.0.0,而不是只对本机的 127.0.0.1。不开 GatewayPorts 的后果是不能通过
12.34.56.78:8080
访问,只能在外网服务器上通过127.0.0.1:8080
服务到本地开发机的服务。修改好配置文件后,你还需要重启 sshd 服务来加载新的配置,命令如下:
如果使用以上方法还是无法访问
12.34.56.78:8080
,请检查你外网服务器的防火墙配置,确保 8080 端口是对外开放的。其它代替方案
除了 SSH 隧道能实现内网穿透外,还有以下常用方法。
frp
frp 是一个可用于内网穿透的高性能的反向代理应用,支持 tcp, udp, http, https 协议。
frp 有以下特性:
ngrok
ngrok 是一个商用的内网穿透工具,它有以下特点:
这些代替方案的缺点在于都需要再额外安装其它工具,没有 SSH 隧道来的直接。
想了解更多可以访问它们的主页。
阅读原文
The text was updated successfully, but these errors were encountered: