与世界分享我刚编的mysql http隧道工具-hersql原理与使用

这篇具有很好参考价值的文章主要介绍了与世界分享我刚编的mysql http隧道工具-hersql原理与使用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

原文地址:https://blog.fanscore.cn/a/53/

1. 前言

本文是与世界分享我刚编的转发ntunnel_mysql.php的工具的后续,之前的实现有些拉胯,这次重构了下。需求背景是为了在本地macbook上通过开源的mysql可视化客户端(dbeaver、Sequel Ace等)访问我司测试环境的mysql,整个测试环境的如图所示:

那么就有以下几种方式:

  • 客户端直连mysql
    #Pass# 测试环境mysql只提供了内网ip,只允许测试环境上的机器连接,因此不可行
  • 通过ssh隧道连接
    #Pass# 测试环境机器倒是可以ssh上去,但是只能通过堡垒机接入,且堡垒机不允许ssh隧道,因此不可行
  • navicat http隧道连接
    #Pass# 测试环境有机器提供了公网ip开放了http服务,因此技术上是可行的,但navicat非开源免费软件,我司禁止使用,因此不可行
  • 测试环境选一台机器建立mysql代理转发请求
    #Pass# 测试环境机器只开放了80端口,且已被nginx占用,因此不可行
  • 内网穿透
    这个想法很好,下次不要再想了

既然上面的方式都不行,那怎么办呢?因此我产生了一个大胆的想法

2. 一个大胆的想法

大概架构如下

首先,在本地pc上启动一个sidecar进程,该进程监听3306端口,实现mysql协议,将自己伪装为一个mysql server。本地pc上的mysql客户端连接到sidecar,发送请求数据包给sidecar,从sidecar读取响应包。

然后在测试环境某台机器上启动transport进程,该进程启动http服务,由nginx代理转发请求,相当于监听在80端口,然后连接到测试环境的mysql server。

sidecar会将来自客户端的请求包通过http请求转发给transporttransport将请求包转发到测试环境对应的mysql server,然后读取mysql的响应数据包,然后将响应数据包返回给sidecarsidecar再将响应包返回给mysql客户端。

遵循上述的基本原理,我将其实现出来: https://github.com/Orlion/hersql。但是在描述hersql的实现细节之前我们有必要了解下mysql协议

3. mysql协议

mysql客户端与服务端交互过程主要分为两个阶段:握手阶段与命令阶段。交互流程如下:

在最新版本中,握手过程比上面要复杂,会多几次交互

3.1 握手阶段

在握手阶段,3次握手建立tcp连接后服务端会首先发送一个握手初始化包,包含了

  • 协议版本号:指示所使用的协议版本。
  • 服务器版本:指示MySQL服务器版本的字符串。
  • 连接ID:在当前连接中唯一标识客户端的整数。
  • 随机数据:包含一个随机字符串,用于后续的身份验证。
  • 服务器支持的特性标志:指示服务器支持的客户端功能的位掩码。
  • 字符集:指示服务器使用的默认字符集。
  • 默认的身份验证插件名(低版本没有该数据)

随后客户端会发送一个登录认证包,包含了:

  • 协议版本号:指示所使用的协议版本。
  • 用户名:用于身份验证的用户名。
  • 加密密码:客户端使用服务端返回的随机数对密码进行加密
  • 数据库名称:连接后要使用的数据库名称。
  • 客户端标志:客户端支持的功能的位掩码。
  • 最大数据包大小:客户端希望接收的最大数据包大小。
  • 字符集:客户端希望使用的字符集。
  • 插件名称:客户端希望使用的身份验证插件的名称。

服务端收到客户端发来的登录认证包验证通过后会发送一个OK包,告知客户端连接成功,可以转入命令交互阶段

在mysql 8.0默认的身份验证插件为caching_sha2_password,低版本为mysql_native_password,两者的验证交互流程有所不同个,caching_sha2_password在缓存未命中的情况下还会多几次交互。另外如果服务端与客户端的验证插件不同的话,也是会多几次交互。

3.2 命令阶段

在命令阶段,客户端会发送命令请求包到服务端。数据包的第一个字节标识了当前请求的类型,常见的命令有:

  • COM_QUERY命令,执行SQL查询语句。
  • COM_INIT_DB命令,连接到指定的数据库。
  • COM_QUIT命令,关闭MySQL连接。
  • COM_FIELD_LIST命令,列出指定表的字段列表。
  • COM_PING命令,向MySQL服务器发送PING请求。
  • COM_STMT_系列预处理语句命令

请求响应的模式是客户端会发一个请求包,服务端会回复n(n>=0)个响应包

最后客户端断开连接时会主动发送一个COM_QUIT命令包通知服务端断开连接

4. hersql数据流转过程

在了解mysql协议之后我们就可以来看下hersql的数据流转过程了。

transport连接mysql server时必须要知道目标数据库的地址与端口号(mysql client连接的是sidecar),所以hersql要求mysql client需要在数据库名中携带目标数据库的地址与端口号。

transport发给mysql server的登录请求包中需要包含用mysql server发来的随机数加密之后的密码,但是mysql client给到sidecar的登录请求包中的密码是用sidecar给的随机数加密的,因此无法直接拿来使用,所以hersql要求mysql client需要在数据库名中携带密码原文,transport会用mysql server给的随机数进行加密, 这也是hersql的局限。

5. hersql使用

上面介绍了一堆原理性的东西,那么如何使用呢?

5.1 在一台能够请求目标mysql server的机器上部署hersql transport

首先你需要下载下来hersql的源码:https://github.com/Orlion/hersql,还需要安装下golang,这些都完成后你就可以启动hersql transport了。但是先别着急,我先解释下transport的配置文件tranport.example.yaml:

server:
  # transport http服务监听的地址
  addr: :8080

log:
  # 标准输出的日志的日志级别
  stdout_level: debug
  # 文件日志的日志级别
  level: error
  # 文件日志的文件地址
  filename: ./storage/transport.log
  # 日志文件的最大大小(以MB为单位), 默认为 100MB。日志文件超过此大小会创建个新文件继续写入
  maxsize: 100
  # maxage 是根据文件名中编码的时间戳保留旧日志文件的最大天数。 
  maxage: 168
  # maxbackups 是要保留的旧日志文件的最大数量。默认是保留所有旧日志文件。
  maxbackups: 3
  # 是否应使用 gzip 压缩旋转的日志文件。默认是不执行压缩。
  compress: false

你可以根据你的需求修改配置,然后就可以启动transport

$ go run cmd/transport/main.go -conf=transport.example.yaml

一般情况下都是会先编译为可执行文件,由systemd之类的工具托管transport进程,保证transport存活。这里简单期间直接用go run起来

5.2 在你本地机器部署启动hersql sidecar

同样的,你需要下载下来hersql的源码:https://github.com/Orlion/hersql,提前安装好golang。修改下sidecar的配置文件sidecar.example.yaml:

server:
  # sidecar 监听的地址,之后mysql client会连接这个地址
  addr: 127.0.0.1:3306
  # transport http server的地址
  transport_addr: http://x.x.x.x:xxxx
log:
  # 与transport配置相同

就可以启动sidecar

$ go run cmd/sidecar/main.go -conf=sidecar.example.yaml

同样的,一般情况下也都是会先编译为可执行文件,mac上是launchctl之类的工具托管sidecar进程,保证sidecar存活。这里简单期间直接用go run起来

5.3 客户端连接

上面的步骤都执行完成后,就可以打开mysql客户端使用了。数据库地址和端口号需要填写sidecar配置文件中的addr地址,sidercar不会校验用户名和密码,因此用户名密码可以随意填写

重点来了: 数据库名必须要填写,且必须要按照以下格式填写

[username[:password]@][protocol[(address)]]/dbname[?param1=value1&...&paramN=valueN]

举个例子:

root:123456@tcp(10.10.123.123:3306)/BlogDB

如图所示:

5.4 举个例子

目标mysql服务器

  • 地址:10.10.123.123:3306
  • 数据库:BlogDB
  • 用户名:root
  • 密码:123456

可以直连目标mysql服务器的机器

  • 地址:10.10.123.100
  • 开放端口:8080

那么transport可以配置为

server:
  addr: :8080

sidecar可以配置为

server:
  addr: 127.0.0.1:3306
  transport_addr: http://10.10.123.100:8080

客户端连接配置

  • 服务器地址:127.0.0.1
  • 端口: 3306
  • 数据库名root:123456@tcp(10.10.123.123:3306)/BlogDB

5.5 局限

hersql目前只支持mysql_native_password的认证方式,mysql8默认的认证方式是caching_sha2_password,所以如果要通过hersql连接mysql8需要注意登录用户的认证方式是否是mysql_native_password,如果是caching_sha2_password那暂时是无法使用的。

6. 参考资料

  • MySQL协议分析
  • MySQL: Client/Server Protocol

如果github.com/Orlion/hersql对你有帮助欢迎点个star文章来源地址https://www.toymoban.com/news/detail-457780.html

到了这里,关于与世界分享我刚编的mysql http隧道工具-hersql原理与使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 隧道模式HTTP使用教程

    华科隧道HTTP格式为:服务器:端口 账号 密码 隧道代理分钟2种模式: 固定时间更改新IP(比如5分钟,10分钟,初次开通的时候可设定) 请求一次更换一个新IP(可通过浏览器或者curl) 1、使用浏览器 1.1、使用浏览器切换IP(限制 180次 /小时,间隔20秒) 用浏览器访问 http://ip.h

    2024年02月09日
    浏览(31)
  • 管廊隧道怎么定位人员?分享管廊隧道人员定位系统解决方案

    管廊隧道施工的安全不仅关系着施工项目的质量与施工效率,更是关系着国家财产安全以及施工人员和人民群众的生命和财产安全。如何有效加强管廊隧道施工安全管理水平成为管廊隧道项目施工企业管理者最为关注的问题。 1.风险预警难 现场监护不到位,区域安全界定不清

    2023年04月16日
    浏览(35)
  • reGeorg搭建http隧道实验

    目录 工具下载地址 测试工具 实验 受害者 攻击者 开始测试

    2024年02月16日
    浏览(30)
  • Linux系统中HTTP隧道的搭建与配置步骤:穿越网络的“魔法隧道”

    在Linux系统中搭建HTTP隧道,就像是开启了一条穿越网络的“魔法隧道”。这条隧道能让你的数据在网络中自由穿梭,无论是远程办公还是数据同步,都能变得轻松自在。下面,就让我们一起探索如何搭建这条神奇的“魔法隧道”吧! 第一步:选择隧道工具 首先,你需要选择

    2024年02月21日
    浏览(30)
  • Python爬虫基础之隧道HTTP

    URL的开头通常会有http或者https,这就是访问资源需要的协议类型。有时,我们还会看到ftp、sftp、smb开头的URL,它们都是协议类型。在爬虫中,我们抓取的页面通常就是http或者https协议的,这里首先了解一下这两个协议的含义。 HTTP全称是Hyper Text Transfer Protocol,中文名叫做超文

    2024年02月02日
    浏览(38)
  • Linux使用HTTP隧道代理模板

    以下是一个使用HTTP隧道代理的Linux模板: 1. 首先,确保你已经安装了curl和socat工具。如果没有安装,可以使用以下命令进行安装: ``` sudo apt-get install curl socat ``` 2. 创建一个名为proxy.sh的脚本文件,并将以下内容复制到文件中: ```bash #!/bin/bash # 设置代理服务器的地址和端口

    2024年02月12日
    浏览(43)
  • Linux使用HTTP隧道代理代码示例模版

    以下是一个使用HTTP隧道代理的示例代码模板: ```python import requests def send_request(url, proxy_host, proxy_port): # 设置代理 proxies = { \\\'http\\\': f\\\'http://{proxy_host}:{proxy_port}\\\', \\\'https\\\': f\\\'http://{proxy_host}:{proxy_port}\\\' } try: # 发送请求 response = requests.get(url, proxies=proxies) # 处理响应 if response.status_code =

    2024年02月12日
    浏览(30)
  • python使用HTTP隧道代理代码示例模板

    以下是使用HTTP隧道代理的Python代码示例模板: ```python import requests # 设置代理服务器地址和端口号 proxy_host = \\\"your_proxy_host\\\" proxy_port = \\\"your_proxy_port\\\" # 设置代理服务器的用户名和密码(如果需要) proxy_username = \\\"your_proxy_username\\\" proxy_password = \\\"your_proxy_password\\\" # 构造代理服务器的认

    2024年02月08日
    浏览(39)
  • python使用HTTP隧道代理IP方法

    使用HTTP隧道代理IP的方法可以通过Python的requests库来实现,具体步骤如下: 1. 导入requests库和os库: ```python import requests import os ``` 2. 设置代理IP和端口号: ```python proxy_host = \\\'代理IP\\\' proxy_port = \\\'代理端口号\\\' ``` 3. 设置代理认证信息(如果需要): ```python proxy_user = \\\'代理用户名

    2024年02月05日
    浏览(73)
  • 使用HTTP隧道代理的Python爬虫实例

            在网络爬虫的开发中,有时我们需要使用代理服务器来访问目标页面,以便实现IP的切换和隐藏真实的网络请求。本文将介绍如何使用Python中的requests库或者urllib2库和HTTP隧道代理来访问目标网页,并获取响应信息。我们将使用一个具体的实例来演示该过程。 requ

    2024年02月12日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包