萬盛學電腦網

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

解決 MySQL 禁止遠程訪問的完整指南

MySQL 遠程連接被拒?三步打通內外網訪問

預設 MySQL 僅允許 localhost 連線,遠程訪問會報 ERROR 1130 (HY000): Host 'x.x.x.x' is not allowed to connect。本文提供「改表法」「授權法」兩大核心方案,並補充防火牆、配置文件等易忽略細節。

方案一:改表法(直接修改 mysql.user 表)

  1. 本地登入:mysql -u root -p
  2. 切換系統庫:USE mysql;
  3. 將 root 的 host 改為 %(任意 IP)或指定 IP:
    UPDATE user SET host = '%' WHERE user = 'root';
    -- 或指定單 IP
    UPDATE user SET host = '192.168.1.100' WHERE user = 'root';
  4. 關鍵步驟:FLUSH PRIVILEGES; 讓修改即時生效

⚠️ 風險提示:root 開放 % 極不安全,生產環境請建立專用低權限賬號。

方案二:授權法(GRANT 授權,更靈活安全)

任意 IP 訪問:

GRANT ALL PRIVILEGES ON *.* TO 'app_user'@'%' IDENTIFIED BY 'StrongPass#2024' WITH GRANT OPTION;
FLUSH PRIVILEGES;

限定單一 IP 訪問:

GRANT SELECT, INSERT, UPDATE, DELETE ON mydb.* TO 'app_user'@'192.168.1.100' IDENTIFIED BY 'StrongPass#2024';
FLUSH PRIVILEGES;

僅開放特定庫/表:

GRANT SELECT, UPDATE ON mydb.orders TO 'readonly_user'@'%' IDENTIFIED BY 'ReadOnly#2024';

必檢清單:授權後仍連不上?

  1. 配置文件綁定:/etc/my.cnf 或 my.ini 中 bind-address = 0.0.0.0(預設 127.0.0.1),修改後重啟 systemctl restart mysqld。
  2. 防火牆放行 3306:
    • CentOS/RHEL:firewall-cmd --permanent --add-port=3306/tcp && firewall-cmd --reload
    • Ubuntu:ufw allow 3306/tcp
    • 雲廠商安全組/防火牆同步放行。
  3. SELinux/AppArmor:若啟用需允許 mysqld 連網,或暫時設為 Permissive 模式排查。
  4. 驗證端口監聽:netstat -antp | grep 3306 應顯示 0.0.0.0:3306 而非 127.0.0.1:3306。

進階:Web/DB 分離架構建議

  • 應用服務器(Web)與資料庫服務器(DB)分離,減少單點故障與資源爭搶。
  • DB 僅對 Web 服務器內網 IP 開放 3306,拒絕公網直連。
  • 使用 SSH 隧道或 VPN 進行運維連線,避免暴露端口。

快速驗證腳本

# 遠程測試
mysql -h 192.168.1.200 -u app_user -p -e "SELECT USER(), CURRENT_USER();"

輸出包含 app_user@192.168.1.x 即成功。

總結

「授權法 + bind-address 0.0.0.0 + 防火牆精準放行 + 專用低權賬號」是生產環境標準姿勢。切記:動權限必刷新,改配置必重啟,開端口必最小化。

copyright © 萬盛學電腦網 all rights reserved