firewall-cmd --permanent --add-port=3306/tcp
firewall-cmd --reload
iptables -A INPUT -p tcp --dport 3306 -j ACCEPT
service iptables save
netsh advfirewall firewall add rule name="MySQL 3306" dir=in action=allow protocol=TCP localport=3306
控制台 → 安全組 → 入站規則 → TCP 3306 → 來源:應用伺服器 IP/ CIDR(禁用 0.0.0.0/0)
mysql -u root -p
-- 單一 IP
GRANT ALL PRIVILEGES ON db_name.* TO 'user'@'192.168.1.100' IDENTIFIED BY 'strong_pass';
-- IP 段 (CIDR 不支援,用通配符)
GRANT ALL PRIVILEGES ON db_name.* TO 'user'@'192.168.1.%' IDENTIFIED BY 'strong_pass';
-- 任意 IP(極不推薦,僅測試)
GRANT ALL PRIVILEGES ON db_name.* TO 'user'@'%' IDENTIFIED BY 'strong_pass';
| 子句 | 說明 |
|---|---|
ALL PRIVILEGES | 全權限;生產建議精細:SELECT,INSERT,UPDATE,DELETE,EXECUTE |
db_name.* | 指定庫所有表;*.* 全庫、db.tbl 單表 |
'user'@'host' | 帳號@來源 IP;host 支援 % 通配 |
IDENTIFIED BY | 密碼;MySQL 8.0+ 改用 IDENTIFIED WITH caching_sha2_password BY 'pass' |
FLUSH PRIVILEGES;
# 客戶端機器
mysql -h db_server_ip -u user -p'strong_pass' -P 3306
| 現象 | 原因 | 解決 |
|---|---|---|
| Connection refused | 防火牆/安全組未放行 | 檢查步驟一 |
| Host 'x.x.x.x' is not allowed | GRANT host 不匹配 | 補授權或改用 % |
| Access denied for user | 密碼錯誤/認證插件不匹配 | 重設密碼、確認 plugin |
| SSL connection required | 帳號要求 SSL | ALTER USER ... REQUIRE NONE; 或配置客戶端 SSL |
REQUIRE SSL)SELECT * FROM mysql.user WHERE Host != 'localhost'audit_log + SIEM)「防火牆 + GRANT」雙層把關,是 MySQL 遠程存取的標準姿勢。永遠不要對 0.0.0.0/0 開放 3306,哪怕只是「暫時測試」。