萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> MySQL 教學

SSH 隧道訪問遠程 MySQL 完整指南:Navicat 配置與命令列實戰

生產資料庫常禁用公網 3306 埠、僅允許內網或跳板機存取。SSH 隧道將本地埠轉發至遠端 MySQL,實現加密通道、繞過防火牆、統一入口審計。本文涵蓋原理、Navicat 圖形化配置、命令列建立隧道、PHP/Java 程式碼接入。

核心原理

本地應用 → 127.0.0.1:LocalPort → SSH Client → (加密隧道) → SSH Server → 127.0.0.1:3306 (MySQL)
  • 本地應用以為連本地 MySQL,實際流量經 SSH 加密轉發至遠端。
  • MySQL 僅監聽 127.0.0.1:3306,無公網暴露面。

Navicat 圖形化配置 (推薦)

  1. 新建連線 → General 頁籤:
    Host: 127.0.0.1、Port: 3307 (本地轉發埠)、User/Password: 遠端 MySQL 帳號。
  2. SSH 頁籤勾選「Use SSH tunnel」:
    Host: 跳板機/資料庫伺服器公網 IP (如 117.123.52.161)
    Port: 79 (SSH 埠)
    User: admin
    Password/Key: SSH 認證憑證
  3. 點擊「測試連線」→ Success。

Navicat 一般連線設定

Navicat SSH 隧道設定

連線測試成功

命令列建立隧道 (Linux/macOS/Windows 10+)

# 前台運行 (調試用)
ssh -N -L 3307:127.0.0.1:3306 -p 79 admin@117.123.52.161

# 後台持久化 (-f 後台 -N 不執行遠端命令 -g 允許網關裝置連接)
ssh -fNg -L 3307:127.0.0.1:3306 -p 79 admin@117.123.52.161

# 參數解析
# -L LocalPort:RemoteHost:RemotePort
#   本地 3307 → 遠端 SSH Server 解密後轉發給 127.0.0.1:3306
# -p 79 指定 SSH 埠 (非預設 22)
# -fNg 後台守護進程模式

驗證隧道

# 本地連線測試
mysql -h 127.0.0.1 -P 3307 -u dbuser -p dbname

# PHP 範例
$pdo = new PDO('mysql:host=127.0.0.1;port=3307;dbname=db;charset=utf8mb4', 'dbuser', 'pass');

# Java (JDBC)
String url = "jdbc:mysql://127.0.0.1:3307/db?useSSL=false&serverTimezone=UTC";
Connection conn = DriverManager.getConnection(url, "dbuser", "pass");

生產級持久化:Systemd / Autossh

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

[Service]
User=appuser
ExecStart=/usr/bin/ssh -N -L 3307:127.0.0.1:3306 -p 79 -i /home/appuser/.ssh/id_rsa admin@%i
Restart=always
RestartSec=10

[Install]
WantedBy=multi-user.target

# 啟用
systemctl enable --now mysql-tunnel@117.123.52.161

或使用 autossh -M 0 -fNg -L ... 自動重連。

安全加固清單

  • SSH 僅允許金鑰認證,禁用密碼登入。
  • 跳板機啟用 AllowTcpForwarding yes、GatewayPorts no。
  • MySQL 帳號綁定 127.0.0.1,拒絕遠端直連。
  • 隧道埠 (3307) 僅在應用伺服器本地回環介面監聽。
  • 審計:last -i、journalctl -u sshd 追蹤隧道建立歷史。

SSH 隧道是「零信任網路」下訪問受保護資料庫的標準姿勢,配置一次,長期受益。

copyright © 萬盛學電腦網 all rights reserved