遠程連線需打通三層:MySQL 帳號授權 → 作業系統防火牆 → 網路路由/NAT。本文以 Linux (Fedora) 為 Server、Windows (虛擬機) 為 Client 示範。
# 登入 MySQL mysql -u root -p # 建立帳號,允許任意主機 (%) 連線 CREATE USER 'app_user'@'%' IDENTIFIED BY 'StrongPass123!'; # 授予特定資料庫權限 GRANT SELECT, INSERT, UPDATE, DELETE, EXECUTE ON mydb.* TO 'app_user'@'%'; # 或授予全部權限(謹慎) # GRANT ALL PRIVILEGES ON *.* TO 'app_user'@'%' WITH GRANT OPTION; # 刷新權限 FLUSH PRIVILEGES;
UPDATE mysql.user SET Host='%' WHERE User='root' AND Host='localhost'; FLUSH PRIVILEGES;
SELECT User, Host, plugin FROM mysql.user WHERE User='app_user';
# 永久開放 sudo firewall-cmd --permanent --add-port=3306/tcp sudo firewall-cmd --reload # 或限定來源 IP(更安全) sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" port protocol="tcp" port="3306" accept' sudo firewall-cmd --reload
sudo iptables -I INPUT -p tcp --dport 3306 -j ACCEPT sudo service iptables save # 或 iptables-save > /etc/sysconfig/iptables
sudo ufw allow from 192.168.1.0/24 to any port 3306 sudo ufw enable
# /etc/my.cnf 或 /etc/mysql/mysql.conf.d/mysqld.cnf [mysqld] # 註解或修改預設 127.0.0.1 # bind-address = 127.0.0.1 bind-address = 0.0.0.0 # 監聽所有介面 # 或指定內網 IP:bind-address = 192.168.1.100 # 重啟生效 sudo systemctl restart mysql
# Linux/macOS mysql -h 192.168.1.100 -u app_user -p -P 3306 -D mydb # Windows (安裝 mysql-client 後) mysql -h 192.168.1.100 -u app_user -p -P 3306 -D mydb
Navicat / MySQL Workbench / DBeaver:

不直接開放 3306,改由 SSH 轉發本地埠至遠端 MySQL:
# 本地 3307 轉發至遠端 127.0.0.1:3306 ssh -fNg -L 3307:127.0.0.1:3306 user@remote_server_ip # -f 背景執行 -N 不執行遠端命令 -L 本地埠:目標主機:目標埠
mysql -h 127.0.0.1 -P 3307 -u app_user -p -D mydb

| 錯誤代碼/現象 | 可能原因 | 排查指令/動作 |
|---|---|---|
| ERROR 1130 (HY000): Host not allowed | 帳號 Host 不匹配 | SELECT User,Host FROM mysql.user; 修正 Host 為 % 或具體 IP |
| ERROR 2003 (HY000): Can't connect | 防火牆阻擋 / bind-address 錯誤 / 服務未啟動 | telnet ip 3306; netstat -tlnp | grep 3306; firewall-cmd --list-all |
| ERROR 1045 (28000): Access denied | 密碼錯誤 / 認證插件不匹配 (caching_sha2_password) | 重置密碼; ALTER USER 'u'@'%' IDENTIFIED WITH mysql_native_password BY 'pwd'; |
| SSL connection required | 伺服器強制 SSL,客戶端未啟用 | 客戶端加 --ssl-mode=REQUIRED 或配置憑證 |
| Connection reset / timeout | 網路不通 / MTU 問題 / 連線數耗盡 | ping/traceroute; 檢查 max_connections; SSH 隧道 MTU 設定 |
DELETE FROM mysql.user WHERE User='root' AND Host='%';plugin-load=AUDIT=libaudit_plugin.soSELECT * FROM mysql.general_log (需啟用 general_log)MySQL 遠程連線三部曲:授權 (CREATE USER ... @'%') → 監聽 (bind-address=0.0.0.0) → 放火牆 (3306/tcp)。生產環境強制:專用帳號、最小權限、IP 白名單、SSL 加密、SSH 隧道雙重保護。連線失敗按「授權 → 監聽 → 防火牆 → 網路 → 認證」順序排查。