背景
先说背景吧,我司目前是通过phpMyAdmin来操作mysql,phpMyAdmin每次都要输入账号密码,而且我们的数据库实例又非常多,每次登录还要先搜索一番。虽然搞了一些chrome插件来简化这个过程,但是个人还是不太满意,所以考虑使用桌面客户端来代替。
然而测试环境的mysql是无法直连的,虽然有些桌面客户端(比如navicat)提供了ssh隧道或者http代理来连接,但是我们开发机只开放了http server的端口,没有开放ssh(只能通过跳板机连接)。所以一些桌面客户端直连和通过ssh隧道来连接是不可能了,http代理方式倒是可以连接,但是貌似只有navicat提供了这个功能,而navicat是收费的。得,所有常规道路都不通了。
只能靠骚操作了
方案
1、内网穿透!把内网ssh服务暴露到公网去!
如上图
- 首先开发机上agent进程同时连接代理服务器proxy server与本地ssh,做双向转发
- 然后代理服务器proxy server监听来自我的mac上的桌面客户端的ssh隧道连接,做该连接和proxy server <=> agent这个tcp连接的双向转发
- 这样mac上的桌面客户端就能建立到内网开发机的ssh隧道了
很好!我们现在就能通过ssh隧道连接到测试环境mysql了!
不过,过不了多久我们可能会遇到下面的情况↓↓↓
2、用http隧道代理tcp连接进而在80端口上提供ssh服务
先简单提下http隧道的原理吧:
- 首先客户端会发放
CONNECT
请求给代理服务器,告诉代理服务器它要连接的目标ip+port - 代理服务器建立与目标ip+port的tcp连接然后返回给客户端
HTTP 200 Connection Established
报文 - 这时候就建立起了连接,后续客户端到代理服务器的所有tcp报文都会被代理服务器转发到目标ip+port的tcp连接上
详情可以参考这篇文章:HTTP 隧道代理原理和实现
这个方案存在以下两个问题: 第一、80端口被nginx监听,而nginx不支持http tunnel,虽然有些插件可以实现,但是考虑到开发机许多同学都在使用,添加插件还是有风险的。 第二、与方案1同样的,偷开放ssh服务这件事就不能干🙈
3、做一个mysql server,解析客户端请求转发到http代理
先看图:
在我的mac上起一个服务:hersql
,“伪装”成mysql server,接收来自桌面客户端的连接,按照mysql协议从报文中解析出请求的db
与sql
,然后请求开发机上的navicat提供的代理工具:ntunnel_mysql.php
,ntunnel_mysql.php
连接到db
并执行sql
,将结果返回给hersql
,hersql
将查询结果按照mysql协议包装成报文返回给桌面客户端。
完美!
hersql
在方案3中我实现了hersql并开源到了github: github.com/Orlion/hersql,供大家借鉴