使用SSH代理在本地开发环境调试各种回调

简介: 使用SSH代理在本地开发环境调试各种回调 前言背景 相信大家在支付宝、微信、钉钉等各种小程序或支付对接的开发中,经常会遇到服务端回调的问题,至少要求接收回调请求的服务器有公网IP,以便能收到请求,微信的开发甚至要求回调接口必须是https,而本地开发环境往往都是内网环境,甚至连固定ip都没有,难道每次测试回调内容只能发布到测试环境中去测试,有没有简单的方法呢? 当然有!答案就是使用SSH代理(或其他类似的proxy代理)。

使用SSH代理在本地开发环境调试各种回调

前言背景

相信大家在支付宝、微信、钉钉等各种小程序或支付对接的开发中,经常会遇到服务端回调的问题,至少要求接收回调请求的服务器有公网IP,以便能收到请求,微信的开发甚至要求回调接口必须是https,而本地开发环境往往都是内网环境,甚至连固定ip都没有,难道每次测试回调内容只能发布到测试环境中去测试,有没有简单的方法呢?

当然有!答案就是使用SSH代理(或其他类似的proxy代理)。假定发布应用给公网用户,肯定得有一台固定ip的公网服务器吧,甚至还有固定ip的测试环境,利用这台服务器做ssh server实现代理(Linux服务器自带ssh server,windows环境可以安装ssh server,这里不赘述了)。

之前我写过一篇利用SSH代理访问内网资源的文章,如果之前的文章对运维比较有用,那么本篇的内容体现了ssh对开发的价值。之前的文章-R参数不是重点,那么本篇则是详解-R参数。-L参数代表在本地监听端口,将请求转发到远程,而-R参数正好相反,在远程监听一个端口,将请求转发到本地。

原理讲解

本地必须有openssh client(Linux和Mac OS自带,windows 10系统目前也自带,windows低版本操作系统需要自己单独下载openssh client安装),一台远程服务器,有公网ip,开启ssh server,用作回调服务器。

本地需要通过ssh连接远程服务器,在远程服务器上监听一个端口,将此端口的数据转发到本地的某个应用端口上,实现将远程数据代理到本地的作用,大概的示意图像这样:

request ----> | remote server | <------------> | local client |
                                        ^
                                      ssh通道

这样的话本地客户端不需要有固定ip,只要能ssh连接到remote server,就可以让remote server将request转发过来,而openssh恰好就提供了这样的功能,对应的是-R参数:

     -R [bind_address:]port:host:hostport
     -R [bind_address:]port:local_socket
     -R remote_socket:host:hostport
     -R remote_socket:local_socket
     -R [bind_address:]port

按照官方man手册的叙述,-R参数的作用是在远程服务器bind一个ip:port(或unix domain socket),监听请求,并将请求转发到本地的ip:port(或unix domain socket)上,本质上还是一个反向代理。

因此这个命令就非常容易写出来(以下命令在本地执行):

ssh -R 9999:101.132.192.36:9999 user@remote

和常见的ssh user@remote这种直接连接ssh shell的命令相比,添加了一个-R参数,代表ssh连接成功之后,在远程服务器上监听101.132.192.36:9999(注意省略bind_address代表bind环回口),将请求转发到101.132.192.36:9999上(相对于本机的Ip),因此就等于访问了本机101.132.192.36:9999上监听的应用程序。如果不想登录到远程shell,可以追加-N参数,如果不想挂起在前台,可以追加-f参数,如果想启用传输压缩(gzip),还可以追加-C参数。更多有用的参数可以参见man手册

需要注意下-R的几个限制:

  • 想bind权限端口(1024以内的端口号),必须以root身份连接,普通用户无权限
  • port参数设置为0,表示随机监听一个可用的端口
  • bind_address默认为localhost,如果为*0.0.0.0则表示bind所有可用ip,但是注意远程服务器的sshd_config必须启用GatewayPorts选项才有权限这么做
  • 由于ssh是TCP协议,因此这个代理也只是TCP四层反向代理,不能实现UDP的反向代理

配置

明白这个原理之后,我们就可以在实际应用中实现我们的需求了。由于微信、支付宝、钉钉等绝大多数回调请求都使用HTTP协议,这个协议本身是工作在TCP协议之上的,因此可以用ssh代理实现代理HTTP协议。

对于http请求,其实我们只要在sshd_config启用GatewayPorts选项,去bind 0.0.0.0就可以将回调请求转发到本地了,但是考虑到https反向代理,以及其他的一些http预处理需求,实际使用的时候建议前面放一个Nginx或其他http proxy server做反向代理,这样的话就不需要配置sshd_config,只bind 127.0.0.1就够了。

以我们刚才的配置为例,监听远程服务器的101.132.192.36:9999端口,因此很容易写出Nginx的反向代理配置:

server {
    listen 80;
    server_name bieryun.com; location / { proxy_pass http://101.132.192.36:9999; } }

把域名A记录指向remote server就行了(比如bieryun.com),这样回调请求到http://bieryun.com/aliyunyouhuiquan就会转发到本地的http://101.132.192.36:9999/aliyunyouhuiquan,于是乎在本地开发环境就可以愉快的调试回调请求了,再也不用反复发布到测试环境调试那么麻烦了。

微信端回调要求https,那么也简单,使用免费的Let's encrypt证书,或者其他已有的安全证书,配置到Nginx就行了,使得https://bieryun.com可以使用就行了,这里就不再赘述了。

ssh直接做可能会因为网络闪断导致代理失效,如果希望ssh自动重连,可以使用autossh这个小工具,帮我们在ssh断掉之后自动重连,维持代理隧道的稳定。

autossh的使用也十分简单,基本兼容绝大多数ssh参数,像ssh一样用就行,比如:

autossh -M 0 -R 9999:192.168.1.10:9999 -C -N

更详细的用法参考官方文档或者man手册即可。

原文地址http://www.bieryun.com/3871.html

相关文章
|
前端开发 网络协议 Shell
系统诊断小技巧(10):ssh/sshd的调试模式
网络应用的逻辑一般都是集中在两端。所以端到端的排查思路是解决问题的重要思路。排查ssh问题也是如此。 那么,怎么让ssh两端输出更多信息呢? 如何启动调试选项? ssh和sshd都有配置选项和命令行选项来启动调试。
5658 0
|
2月前
|
网络协议 安全 Linux
在IntelliJ IDEA中使用固定公网地址远程SSH连接服务器环境进行开发
在IntelliJ IDEA中使用固定公网地址远程SSH连接服务器环境进行开发
55 2
|
3月前
|
运维 Linux 网络安全
跨平台SSH文件传输:Linux与Windows环境下的实践指南
本文介绍了在Linux和Windows之间使用SCP、SecureCRT及PuTTY工具集进行文件传输的方法。在Linux中,利用SCP命令进行文件下载、上传及目录传输。在Windows环境下,PSFTP和PSCP提供类似功能,而SecureCRT作为SSH客户端,支持设置上传下载目录并进行文件传输。掌握这些工具的使用可提升跨平台运维效率。
178 3
|
3月前
|
网络协议 网络安全 数据安全/隐私保护
如何在IDEA中使用固定公网地址SSH远程连接服务器开发环境(三)
在IDEA中通过固定公网地址SSH远程连接服务器开发环境,需要配置固定TCP端口以避免地址随机变化。首先,升级cpolar至专业版及以上,然后在官网保留一个固定TCP地址。进入cpolar管理界面,编辑隧道信息,将保留的固定地址填入,更新隧道。最后,在IDEA中新建SSH连接,输入固定地址和端口,验证连接。成功后,即可稳定远程开发。
|
3月前
|
网络协议 Java Linux
如何在IDEA中使用固定公网地址SSH远程连接服务器开发环境(二)
在IDEA中通过Cpolar实现固定公网地址SSH远程连接到Linux服务器开发环境,主要步骤包括:1) 在Linux服务器上安装Cpolar,使用一键脚本进行安装和启动服务;2) 登录Cpolar Web UI,创建隧道,指定隧道名称、协议、本地地址(SSH默认端口22)、临时随机TCP端口和中国地区;3) 使用生成的公网TCP地址在IDEA中新建SSH连接,输入该地址和端口,完成远程连接。这种方式允许开发者在任何地方通过固定的公网地址进行远程开发,而无需公网IP。
|
3月前
|
安全 网络协议 Linux
如何在IDEA中使用固定公网地址SSH远程连接服务器开发环境(一)
该文介绍了如何通过IDEA设置远程连接Linux服务器的步骤,使用Cpolar内网穿透工具实现在没有公网IP的情况下进行远程开发。主要内容包括检查Linux SSH服务、本地连接测试、在Linux上安装Cpolar、创建远程连接的公网地址、公网远程连接测试以及固定连接公网地址。文章还提供了相关截图辅助说明,适用于IDEA2023.2.5版本。
|
4月前
|
网络协议 Linux 网络安全
无公网IP环境固定地址远程SSH访问本地树莓派Raspberry Pi
无公网IP环境固定地址远程SSH访问本地树莓派Raspberry Pi
|
12月前
|
Ubuntu 网络协议 机器人
|
Linux 网络安全 数据安全/隐私保护
ssh设置免密登录后登录仍需密码可能的原因,以及 ssh 出问题或的调试方法
ssh设置免密登录后登录仍需密码可能的原因,以及 ssh 出问题或的调试方法
ssh设置免密登录后登录仍需密码可能的原因,以及 ssh 出问题或的调试方法
下一篇
云函数