首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

SSH 隧道安全訪問 MySQL 完整實戰:本地端口轉發、Navicat 配置、常駐服務化

     編輯:MySQL 綜合教學

適用場景

  • MySQL 3306 埠未對公網開放,僅內網/本地存取
  • 需加密傳輸資料,防止中間人竊聽
  • 跳板機/堡壘機架構:Client → SSH Server → MySQL Server

核心原理:SSH Local Port Forwarding

ssh -fNg -L [本地埠]:[目標主機]:[目標埠] [SSH用戶]@[SSH伺服器]
# -f 背景執行 -N 不執行遠端命令 -L 本地轉發
# 範例:本地 3307 轉發至遠端 MySQL 3306
ssh -fNg -L 3307:127.0.0.1:3306 db_user@192.168.1.100

建立隧道後,本地 127.0.0.1:3307 等同於遠端 127.0.0.1:3306,所有流量經 SSH 加密通道傳輸。

完整參數說明

實戰範例:跳板機架構

拓撲:開發機 (Windows) → 跳板機 117.123.52.161:79 → MySQL 172.21.20.203:3307

1. 命令列建立隧道

ssh -fNg -p 79 -L 8989:172.21.20.203:3307 admin@117.123.52.161
# 本地 8989 → 跳板機視角的 172.21.20.203:3307

2. 本地客戶端連線驗證

# 命令列
mysql -h 127.0.0.1 -P 8989 -u dbuser -p dbname

# PHP
$pdo = new PDO("mysql:host=127.0.0.1;port=8989;dbname=dbname;charset=utf8mb4", "dbuser", "pass");

# Navicat / Workbench / DBeaver
# Host: 127.0.0.1, Port: 8989

Navicat 連線設定

3. Navicat 內建 SSH 隧道 (免命令列)

  • 連線設定 → SSH 分頁 → 勾選「使用 SSH 隧道」
  • SSH Host: 117.123.52.161, Port: 79
  • SSH User: admin, Password/Key: 憑證
  • MySQL Host: 172.21.20.203 (從跳板機可解析/連線的 IP)
  • MySQL Port: 3307

Navicat SSH 設定

常駐服務化:Systemd / Inittab / Autossh

Systemd 服務 (Linux 客戶端推薦)

# /etc/systemd/system/mysql-tunnel@.service
[Unit]
Description=MySQL SSH Tunnel to %i
After=network.target

[Service]
User=tunnel_user
ExecStart=/usr/bin/ssh -N -o ExitOnForwardFailure=yes -o ServerAliveInterval=60 -o ServerAliveCountMax=3 -L 3307:127.0.0.1:3306 %i
Restart=always
RestartSec=10

[Install]
WantedBy=multi-user.target

# 啟用
systemctl enable mysql-tunnel@db_user@192.168.1.100
systemctl start mysql-tunnel@db_user@192.168.1.100

Autoshrc (自動重連、輕量)

# 安裝 autossh
autossh -M 0 -fNg -o "ServerAliveInterval=60" -o "ServerAliveCountMax=3" -o "ExitOnForwardFailure=yes" -L 3307:127.0.0.1:3306 user@host
# -M 0 關閉監視埠,依靠 SSH 內建心跳

Inittab (傳統 SysVinit)

# /etc/inittab
tn:345:respawn:/usr/bin/ssh -Ng -L 3307:127.0.0.1:3306 user@remotehost.com
# init 會在進程死掉時自動重啟 (respawn)

Windows 客戶端常駐方案

  1. NSSM (Non-Sucking Service Manager):將 ssh.exe -fNg ... 封裝為 Windows 服務
  2. PuTTY/Plink:plink.exe -batch -N -L 3307:127.0.0.1:3306 user@host -pw pass 配合任務排程器/啟動資料夾
  3. Windows 10+ OpenSSH Client:原生 ssh.exe,配合 NSSM 或啟動腳本

安全加固建議

  1. SSH 金鑰認證:禁用密碼登入,PasswordAuthentication no,部署 Ed25519 金鑰
  2. 限制 SSH 用戶權限:ForceCommand /bin/false 或 /usr/bin/nologin,僅允許轉發
  3. MySQL 僅監聽 127.0.0.1:bind-address=127.0.0.1,拒絕直接網路存取
  4. 防火牆僅開放 SSH 埠:3306 完全內網/本地
  5. 審計日誌:SSH LogLevel VERBOSE、MySQL 審計插件記錄所有查詢

常見問題排查

參數含義
-f認證後背景執行 (需配合 -N)
-N不執行遠端 Shell/命令,純轉發
-g允許遠端主機連線本地轉發埠 (GatewayPorts),預設僅 127.0.0.1
-L local:target:port本地轉發:本地 IP:埠 → 目標主機:埠 (目標主機從 SSH Server 視角)
-R remote:local:port遠端轉發:遠端 IP:埠 → 本地主機:埠
-p PORT指定 SSH 伺服器埠 (非預設 22)
-i KEY_FILE指定私鑰檔案 (免密登入)
-o ServerAliveInterval=60保持連線心跳,防斷開
-o ExitOnForwardFailure=yes轉發失敗即退出,便於腳本檢測
現象原因解決
Channel open failed: connect failed目標主機:埠從 SSH Server 不可達驗證 SSH Server 能否 telnet 172.21.20.203 3307
Connection refused on local port本地轉發埠衝突/未生效換埠、檢查 netstat -an | findstr 3307
隧道頻繁斷開閒置超時/網路抖動加 ServerAliveInterval=60、TCPKeepAlive yes
Navicat SSH 連不上金鑰格式/權限/主機金鑰驗證用 PuTTYgen 轉 .ppk、known_hosts 預載、允許密碼測試後再改鑰

總結

SSH 隧道是零成本、高安全、標準化的 MySQL 遠程存取方案。核心命令 ssh -fNg -L local:target:port user@ssh_host,配合 ServerAliveInterval、ExitOnForwardFailure、autossh/Systemd 常駐化。生產環境必須:金鑰認證、限制 SSH 用戶、MySQL 只聽 127.0.0.1、防火牆收斂。Navicat 等 GUI 內建 SSH 功能可免去命令列管理。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved