热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

调试利器SSH隧道

在开发微信公众号或小程序的时候,由于微信平台规则的限制,部分接口需要通过线上域名才能正常访问。但我们一般都会在本地开发,因为这能快速的看到

在开发微信公众号或小程序的时候,由于微信平台规则的限制,部分接口需要通过线上域名才能正常访问。但我们一般都会在本地开发,因为这能快速的看到源码修改后的运行结果。但当涉及到需要调用微信接口时,由于不和你在同一个局域网中的用户是无法访问你的本地开发机的,就必须把修改后的代码重新发布到线上域名所在的服务器才能去验证结果。每次修改都重新发布很繁琐也很浪费时间。

本文将教你如何通过 SSH 隧道把本地服务映射到外网,以方便调试,通常把这种方法叫内网穿透。
阅读完本文后,你能解决以下常见问题:

  • 开发微信公众号等应用时把本地服务映射到外网,加速调试流程;
  • 把你正在开发的本地服务分享给互联网上其它人访问体验;
  • 在任何地方通过互联网控制你家中在局域网里的电脑;

最终目的

把运行在本地开发机上的 HTTP 服务映射到外网,让全世界都能通过外网 IP 服务到你本地开发机上的 HTTP 服务。例如你本地的 HTTP 服务监听在127.0.0.1:8080,你有一台公网 IP 为 12.34.56.78的服务器,通过本文介绍的方法,可以让全世界的用户通过 http://12.34.56.78:8080 访问到你本地开发机上的 HTTP 服务。
总结成一句话就是:把内网端口映射到外网。

前提条件

为了把内网服务映射到外网,以下资源为必须的:

1、 一台有外网 IP 的服务器;
2、 能在本地开发机上通过 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 username@12.34.56.78

而实现 SSH 隧道只需在本地开发机上执行:

ssh -R 8080:127.0.0.1:8080 username@12.34.56.78

可以看出实现 SSH 隧道的命令相对于 SSH 登入多出来-R 8080:127.0.0.1:8080,多出的这部分的含义是:
在远程机器(12.34.56.78)上启动 TCP8080端口监听着,再把远程机器(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,在本地开发机上执行:

ssh -R 8080:github.com:80 username@12.34.56.78

就能通过 12.34.56.78:8080 去访问 github.com:80了。

保持运行

在执行完上面介绍的 SSH 隧道命令后,你会发现登入到了外网服务器上去了,如果你登出外网服务器,就会发现 12.34.56.78:8080无法访问了。导致这个问题的原因是你登出外网服务器时,在外网服务器上本次操作对应的 SSH 进程也跟着退出了,而这个退出的进程曾负责监听在 8080 端口进行转发操作。
为了让 SSH 隧道一直保持在后台执行,有以下方法。

通过SSH自带的参数

SSH 还支持这些参数:

  • N参数:表示只连接远程主机,不打开远程shell;
  • T参数:表示不为这个连接分配TTY;
  • f参数:表示连接成功后,转入后台运行;
    因此要让 SSH 隧道一直保持在后台执行,可以通过以下命令:

ssh -NTf -R 8080:127.0.0.1:8080 username@12.34.56.78

通过AutoSSH

SSH 隧道是不稳定的,在网络恶劣的情况下可能随时断开。如果断开就需要手动去本地开发机再次向外网服务器发起连接。
AutoSSH 能让 SSH 隧道一直保持执行,他会启动一个 SSH 进程,并监控该进程的健康状况;当 SSH 进程崩溃或停止通信时,AutoSSH 将重启动 SSH 进程。
使用AutoSSH 只需在本地开发机上安装 AutoSSH ,方法如下:

Mac 系统:brew install autossh;
Linux 系统:apt-get install autossh;

安装成功后,在本地开发机上执行:

autossh -N -R 8080:127.0.0.1:8080 username@12.34.56.78

就能完成和上面一样的效果,但本方法能保持 SSH 隧道一直运行。 可以看出这行命令和上面的区别在于把 ssh 换成了 autossh,并且少了 -f 参数,原因是 autossh 默认会转入后台运行。

常见问题

如果你遇到通过以上方法成功启动 SSH 隧道后,还是无法访问 12.34.56.78:8080,那么很有可能是外网服务器上的 SSH 没有配置对。为此你需要去外网服务器上修改/etc/ssh/sshd_config文件如下:

GatewayPorts yes

这个选项的意思是,SSH 隧道监听的服务的 IP 是对外开放的0.0.0.0,而不是只对本机的127.0.0.1。不开 GatewayPorts 的后果是不能通过 12.34.56.78:8080 访问,只能在外网服务器上通过 127.0.0.1:8080服务到本地开发机的服务。
修改好配置文件后,你还需要重启 sshd 服务来加载新的配置,命令如下:

service sshd restart

如果使用以上方法还是无法访问 12.34.56.78:8080,请检查你外网服务器的防火墙配置,确保8080 端口是对外开放的。

其他替代方案

除了 SSH 隧道能实现内网穿透外,还有以下常用方法。
frp

frp 是一个可用于内网穿透的高性能的反向代理应用,支持 tcp, udp, http, https 协议。
frp 有以下特性:

  • frp 比 SSH 隧道功能更多,配置项更多;
  • frp 也需要一台外网服务器,并且需要在外网服务器上安装 frps,在本地开发机上安装 frpc;

ngrok
ngrok 是一个商用的内网穿透工具,它有以下特点:

  • 不需要有外网服务器,因为 ngrok 会为你提供;
  • 只需要在本地开发机安装 ngrok 客户端,和注册 ngrok 账户;
  • 按照服务收费;

这些代替方案的缺点在于都需要再额外安装其它工具,没有 SSH 隧道来的直接。
想了解更多可以访问它们的主页。

ngrok 是一个商用的内网穿透工具,它有以下特点:

不需要有外网服务器,因为 ngrok 会为你提供;
只需要在本地开发机安装 ngrok 客户端,和注册 ngrok 账户;
按照服务收费;

这些代替方案的缺点在于都需要再额外安装其它工具,没有 SSH 隧道来的直接。
想了解更多可以访问它们的主页。


推荐阅读
  • 前言Git是目前最流行的版本控制系统,在它的基础之上,GitHub和GitLab成为当前最流行的代码托管平台,它们均提供的代码评审、项目管理、持续集成等功能,越来越多的互联网企业都 ... [详细]
  • yikesnews第11期:微软Office两个0day和一个提权0day
    点击阅读原文可点击链接根据法国大选被黑客干扰,发送了带漏洞的文档Trumps_Attack_on_Syria_English.docx而此漏洞与ESET&FireEy ... [详细]
  • 微信小程序:授权登录与手机号绑定
    本文详细介绍了微信小程序中用户授权登录及绑定手机号的流程,结合官方指引和实际开发经验,提供了一套完整的实现方案,帮助开发者更好地理解和应用。 ... [详细]
  • 本文探讨了如何通过一系列技术手段提升Spring Boot项目的并发处理能力,解决生产环境中因慢请求导致的系统性能下降问题。 ... [详细]
  • 本文探讨了在C语言编程中,如何有效避免多文件项目中的重定义问题,通过合理使用预处理器指令和extern关键字,确保代码的健壮性和可维护性。 ... [详细]
  • 在Linux系统上构建Web服务器的详细步骤
    本文详细介绍了如何在Linux系统上搭建Web服务器的过程,包括安装Apache、PHP和MySQL等关键组件,以及遇到的一些常见问题及其解决方案。 ... [详细]
  • Django xAdmin 使用指南(第一部分)
    本文介绍如何在Django项目中集成和使用xAdmin,这是一个增强版的管理界面,提供了比Django默认admin更多的功能。文中详细描述了集成步骤及配置方法。 ... [详细]
  • 本文将详细探讨 Linux 系统中的 netstat 命令,该命令用于查看网络状态和连接情况。通过了解 IP 地址和端口的基本概念,我们将更好地理解如何利用 netstat 命令来监控和管理网络服务。 ... [详细]
  • 本文档详细介绍了思科交换机的基本配置命令,包括进入特权模式、配置交换机名称及密码、VLAN配置、端口访问、查看配置信息、恢复出厂设置以及远程登录设置等。 ... [详细]
  • 本文介绍了如何使用JavaScript的Fetch API与Express服务器进行交互,涵盖了GET、POST、PUT和DELETE请求的实现,并展示了如何处理JSON响应。 ... [详细]
  • 简化报表生成:EasyReport工具的全面解析
    本文详细介绍了EasyReport,一个易于使用的开源Web报表工具。该工具支持Hadoop、HBase及多种关系型数据库,能够将SQL查询结果转换为HTML表格,并提供Excel导出、图表显示和表头冻结等功能。 ... [详细]
  • 本文介绍如何从JSON格式的文件中提取数据并将其分配给Bash脚本中的变量。我们将探讨具体的命令和工具,帮助你高效地完成这一任务。 ... [详细]
  • 使用Nginx反向代理实现多域名端口映射
    本文介绍如何通过配置本地hosts文件和Nginx反向代理,实现多个虚拟域名的端口映射,使用户可以通过标准HTTP端口80访问不同后端服务。 ... [详细]
  • 据最新报道,微软正筹备对Windows 10用户界面进行重大调整,包括任务栏、开始菜单及过渡动画等多个方面。此次更新预计将在秋季随RedStone 3发布,带来类似‘Windows 11’的新体验。 ... [详细]
  • 本文详细介绍软件著作权的申请流程,包括从官方平台注册到最终获取证书的所有步骤,并提供详细的文件准备和提交指导。 ... [详细]
author-avatar
天才愤青2_735
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有