與世界分享我剛編的mysql http隧道工具-hersql原理與使用

来源:https://www.cnblogs.com/orlion/archive/2023/05/24/17429176.html
-Advertisement-
Play Games

原文地址:[https://blog.fanscore.cn/a/53/](https://blog.fanscore.cn/a/53/) # 1. 前言 本文是[與世界分享我剛編的轉發ntunnel_mysql.php的工具](https://blog.fanscore.cn/a/47/)的後續, ...


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

1. 前言

本文是與世界分享我剛編的轉發ntunnel_mysql.php的工具的後續,之前的實現有些拉胯,這次重構了下。需求背景是為了在本地macbook上通過開源的mysql可視化客戶端(dbeaver、Sequel Ace等)訪問我司測試環境的mysql,整個測試環境的如圖所示:

image.png

那麼就有以下幾種方式:

  • 客戶端直連mysql
    #Pass# 測試環境mysql只提供了內網ip,只允許測試環境上的機器連接,因此不可行
  • 通過ssh隧道連接
    #Pass# 測試環境機器倒是可以ssh上去,但是只能通過堡壘機接入,且堡壘機不允許ssh隧道,因此不可行
  • navicat http隧道連接
    #Pass# 測試環境有機器提供了公網ip開放了http服務,因此技術上是可行的,但navicat非開源免費軟體,我司禁止使用,因此不可行
  • 測試環境選一臺機器建立mysql代理轉發請求
    #Pass# 測試環境機器只開放了80埠,且已被nginx占用,因此不可行
  • 內網穿透
    這個想法很好,下次不要再想了

image.png

既然上面的方式都不行,那怎麼辦呢?因此我產生了一個大膽的想法

2. 一個大膽的想法

大概架構如下
image.png

首先,在本地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客戶端與服務端交互過程主要分為兩個階段:握手階段與命令階段。交互流程如下:
image.png

在最新版本中,握手過程比上面要複雜,會多幾次交互

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的數據流轉過程了。

image.png

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

如圖所示:
image.png

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. 參考資料

如果github.com/Orlion/hersql對你有幫助歡迎點個star


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • ​ 美國社會心理學家通過研究發現:當一個觀點對某人來說十分重要的時候,如果他能用這個觀點,使得一個“反對者”改變其原有意見,而和他的觀點一致,那麼他更傾向於喜歡那個“反對者”,而不是一個從始至終的同意者。這其實就是“改宗效應”。 對於那些正直的領導,一味拍馬屁,並不會換來他們的尊重,反而是那些偶然忤 ...
  • 最近接到一個新項目,需要在項目里添加一個後臺任務,定時去發郵件通知客戶;由於是一個比較小型的項目,不希望引入Quartz.Net、Hangfire等太重的框架,同時也沒持久化要;尋覓了一下發現ASP.NET Core本身帶有托管服務,可以執行定時任務。ASP.NET Core提供了IHostedSe ...
  • ### 一、什麼是NVM NVM是英文“Non-Volatile Memory”的縮寫,中文翻譯為“非易失性存儲器”。它是指一種能夠在斷電情況下依舊保留數據的存儲器件。NVM用於存儲一些不需要頻繁更改的數據,例如汽車電子控制單元(ECU)中的程式代碼、校準數據、配置參數以及歷史故障碼等。 ### 二 ...
  • 目錄 一、pxe概念 二、pxe相關服務 三、pxe裝機流程 四、pxe四大文件 五、無人值守 六、實驗 自動裝機 一、pxe概念 概念:PXE(預啟動執行環境)是由Intel公司開發的網路引導技術,工作在Client/Server模式,允許客戶機通過網路從遠程伺服器下載引導鏡像,並載入安裝文件或者 ...
  • 官網下載 Java 您可以從官方網站下載 Java 的最新穩定版本。 官網地址:https://www.oracle.com/technetwork/java/javase/overview/index.html 安裝 Java 有些電腦可能已經安裝了Java。 要檢查Windows PC上是否安裝 ...
  • 小白一枚,今天來給大家分享一下如何將自己編寫的桌面應用程式進行打包,便於在其他的電腦上進行安裝使用。如有錯誤之處請大家指正,謝謝!好了,廢話不多說開乾。 這裡簡要的介紹一下使用QtCreator編寫的應用程式的打包。 1. 將Debug模式切換稱為ewlease模式進行編譯,編譯後沒有任何錯誤即可( ...
  • 開發板:NanoPC-T4開發板eMMC:16GBLPDDR3:4GB顯示屏:15.6 HDMI介面顯示屏u-boot :2023.04 在前面我們已經介紹了編譯Rockchip官方提供的uboot源碼,並下載到開發板中進行測試運行。這一節我們嘗試下載最新的uboot版本試試,當前最新版本為2023 ...
  • > 本文首發於公眾號:Hunter後端 > 原文鏈接:[es筆記六之聚合操作之指標聚合](https://mp.weixin.qq.com/s/UyiZ2bzFxi7zCGmL1Xf3CQ) 聚合操作,在 es 中的聚合可以分為大概四種聚合: * bucketing(桶聚合) * mertic(指標 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...