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

MySQL 遠程連線完整配置指南:授權、防火牆、SSH 隧道與驗證

     編輯:MySQL 綜合教學

架構概覽

遠程連線需打通三層:MySQL 帳號授權 → 作業系統防火牆 → 網路路由/NAT。本文以 Linux (Fedora) 為 Server、Windows (虛擬機) 為 Client 示範。

一、MySQL 帳號授權(核心)

方法 1:建立專用遠程帳號(推薦,最小權限原則)

# 登入 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;

方法 2:修改現有 root 帳號 Host(不推薦生產環境)

UPDATE mysql.user SET Host='%' WHERE User='root' AND Host='localhost';
FLUSH PRIVILEGES;

驗證授權結果

SELECT User, Host, plugin FROM mysql.user WHERE User='app_user';

二、Linux 防火牆開放 3306 埠

firewalld (Fedora/CentOS/RHEL 7+)

# 永久開放
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

iptables (傳統/精簡系統)

sudo iptables -I INPUT -p tcp --dport 3306 -j ACCEPT
sudo service iptables save  # 或 iptables-save > /etc/sysconfig/iptables

ufw (Ubuntu/Debian)

sudo ufw allow from 192.168.1.0/24 to any port 3306
sudo ufw enable

三、MySQL 監聽位址配置

# /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

GUI 工具驗證

Navicat / MySQL Workbench / DBeaver:

  • Host: 伺服器公網/內網 IP
  • Port: 3306
  • User: app_user
  • Password: StrongPass123!
  • Database: mydb (可選)

Navicat 連線設定畫面

五、SSH 隧道連線(高安全需求)

不直接開放 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

Navicat SSH 設定

  • SSH 分頁:勾選「使用 SSH 隧道」
  • SSH Host: 遠端伺服器 IP
  • SSH Port: 22 (或自訂)
  • SSH User/Password/Key: SSH 登入憑證
  • MySQL Host: 127.0.0.1 (遠端 localhost)
  • MySQL Port: 3306

Navicat SSH 隧道設定

六、常見連線失敗排查表

錯誤代碼/現象可能原因排查指令/動作
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 設定

七、安全加固清單

  1. 禁用 root 遠程登入:DELETE FROM mysql.user WHERE User='root' AND Host='%';
  2. 帳號密碼複雜度:長度 ≥16、含大小寫數字符號、定期輪換
  3. 防火牆僅開放應用伺服器 IP 段
  4. 啟用 SSL/TLS 加密傳輸
  5. 審計日誌:plugin-load=AUDIT=libaudit_plugin.so
  6. 定期檢視連線歷史:SELECT * FROM mysql.general_log (需啟用 general_log)

總結

MySQL 遠程連線三部曲:授權 (CREATE USER ... @'%') → 監聽 (bind-address=0.0.0.0) → 放火牆 (3306/tcp)。生產環境強制:專用帳號、最小權限、IP 白名單、SSL 加密、SSH 隧道雙重保護。連線失敗按「授權 → 監聽 → 防火牆 → 網路 → 認證」順序排查。

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