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


# 前台運行 (調試用)
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");
# /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 ... 自動重連。
AllowTcpForwarding yes、GatewayPorts no。127.0.0.1,拒絕遠端直連。last -i、journalctl -u sshd 追蹤隧道建立歷史。SSH 隧道是「零信任網路」下訪問受保護資料庫的標準姿勢,配置一次,長期受益。