正文
本文作者:IMWeb 吴浩麟 原文出处:
IMWeb社区
未经同意,禁止转载
在开发微信公众号或小程序的时候,由于微信平台规则的限制,部分接口需要通过线上域名才能正常访问。但我们一般都会在本地开发,因为这能快速的看到源码修改后的运行结果。但当涉及到需要调用微信接口时,由于不和你在同一个局域网中的用户是无法访问你的本地开发机的,就必须把修改后的代码重新发布到线上域名所在的服务器才能去验证结果。每次修改都重新发布很繁琐也很浪费时间。
本文将教你如何通过 SSH 隧道把本地服务映射到外网,以方便调试,通常把这种方法叫内网穿透。
阅读完本文后,你能解决以下常见问题:
-
开发微信公众号等应用时把本地服务映射到外网,加速调试流程;
-
把你正在开发的本地服务分享给互联网上其它人访问体验;
-
在任何地方通过互联网控制你家中在局域网里的电脑;
最终目的
把运行在本地开发机上的 HTTP 服务映射到外网,让全世界都能通过外网 IP 服务到你本地开发机上的 HTTP 服务。例如你本地的 HTTP 服务监听在
127.0.0.1:8080
,你有一台公网 IP 为
12.34.56.78
的服务器,通过本文介绍的方法,可以让全世界的用户通过
http://12.34.56.78:8080
访问到你本地开发机上的 HTTP 服务。
总结成一句话就是:把内网端口映射到外网。
前提条件
为了把内网服务映射到外网,以下资源为必须的:
-
一台有外网 IP 的服务器;
-
能在本地开发机上通过
ssh
登入到外网服务器。
要满足以上条件很简单:
-
对于条件1:购买一台低配 Linux 服务器,推荐国外的
DigitalOcean
;
-
对于条件2:对于 Mac、Linux 开发机是内置了 ssh 客户端的,对于 Windows 可以安装
Cygwin
。
实现原理
要实现把内网端口映射到外网,最简单的方式就是通过 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 隧道连接起来就和在本地开发机 SSH 登入远程登入到外网服务器一样简单。
先来回顾以下 SSH 远程登入命令,假如想在本地远程登入到
12.34.56.78
,可以在本地开发机上执行以下命令:
ssh [email protected]
而实现 SSH 隧道只需在本地开发机上执行:
ssh -R 8080:127.0.0.1:8080 [email protected]
可以看出实现 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
了。