MySQL 預設僅允許本地連線,生產環境常需開放遠程存取。本文提供「改表法、授權法」雙路徑配置、bind-address 調整、服務重啟、防火牆放行的標準化操作流程,並針對常見坑點給出排查指南。
mysql -u root -p
# 進入 MySQL 後
USE mysql;
UPDATE user SET Host='%' WHERE User='root';
SELECT Host, User FROM user; -- 確認變更
FLUSH PRIVILEGES;
優點: 直觀、快速。缺點: 繞過權限系統邏輯,易遺漏 ssl_type、password_expired 等欄位,不推薦生產環境使用。
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'StrongP@ssw0rd!' WITH GRANT OPTION;
FLUSH PRIVILEGES;
-- 僅允許 192.168.1.0/24 網段
CREATE USER 'app_user'@'192.168.1.%' IDENTIFIED BY 'Str0ng!P@ss';
GRANT SELECT, INSERT, UPDATE, DELETE ON `business_db`.* TO 'app_user'@'192.168.1.%';
FLUSH PRIVILEGES;
GRANT ALL PRIVILEGES ON *.* TO 'root'@'172.16.8.193' IDENTIFIED BY 'RootP@ss!';
FLUSH PRIVILEGES;
# 編輯 /etc/mysql/my.cnf 或 /etc/my.cnf
[mysqld]
# 註釋掉預設僅監聽本地
# bind-address = 127.0.0.1
# 或顯式指定監聽所有介面
bind-address = 0.0.0.0
# 若有多張網卡,可指定具體內網 IP
# bind-address = 192.168.1.100
修改後必須重啟 MySQL: systemctl restart mysqld
# 方式一:systemd (現代 Linux)
systemctl restart mysqld
# 方式二:SysV init (舊版)
/usr/bin/mysqladmin -u root -p shutdown
/usr/bin/mysqld_safe &
# 方式三:service 通用
service mysqld restart
# iptables (立即生效,重啟失效)
iptables -I INPUT -p tcp --dport 3306 -j ACCEPT
# 持久化 (CentOS/RHEL 7+)
firewall-cmd --permanent --add-port=3306/tcp
firewall-cmd --reload
# Ubuntu/Debian (ufw)
ufw allow 3306/tcp
ufw reload
# 阿里云/騰訊雲/華為雲:控制台「安全組」同步放行 3306 入站規則
# 客戶端機器執行
mysql -h -u app_user -p -P 3306
# 或使用 telnet/nc 測試埠通達性
telnet 3306
nc -zv 3306
| 現象 | 可能原因 | 排查命令 |
|---|---|---|
| Connection refused | bind-address 未改、防火牆阻擋、MySQL 未啟動 | netstat -ntlp | grep 3306; iptables -L -n |
| Access denied for user | 帳號/密碼錯、Host 不匹配、未 FLUSH PRIVILEGES | SELECT User, Host FROM mysql.user; |
| Host 'x.x.x.x' is not allowed | 授權 Host 與實際客戶端 IP 不符 | 檢查客戶端出口 IP,授權對應 Host |
| SSL connection error | 客戶端強制 SSL、伺服器未配置 | mysql --ssl-mode=DISABLED ... |
安全警示: 開放遠程連線必須配合「強密碼、最小權限、IP 白名單、SSL 加密、審計日志」五項措施。嚴禁 在公網直接暴露 3306 埠且使用 root/% 帳號。