MySQL 默認只允許本地連接。開啟遠程訪問僅需兩步:網絡層放行端口、數據庫層授權賬號。本文提供生產環境安全加固版操作指南。
# Linux (firewalld)
firewall-cmd --permanent --add-port=3306/tcp
firewall-cmd --reload
# Linux (iptables)
iptables -A INPUT -p tcp --dport 3306 -j ACCEPT
service iptables save
# Windows 防火牆 (PowerShell 管理員)
New-NetFirewallRule -DisplayName "MySQL 3306" -Direction Inbound -LocalPort 3306 -Protocol TCP -Action Allow
# 雲廠商安全組/防火牆:控制台添加入站規則 TCP 3306,來源建議限制為應用服務器 CIDR (如 10.0.1.0/24),禁止 0.0.0.0/0。
-- 1. 以 root 登錄
mysql -h 127.0.0.1 -u root -p
-- 2. 創建專用遠程賬號 (推薦不使用 root)
CREATE USER 'app_user'@'10.0.1.%' IDENTIFIED BY 'Str0ngP@ssw0rd!'; -- 限定應用服務器網段
-- 或特定 IP
CREATE USER 'app_user'@'10.0.1.100' IDENTIFIED BY 'Str0ngP@ssw0rd!';
-- 禁止使用 '%' (任意主機),除非極度確信網絡隔離足夠
-- 3. 最小權限授權 (按業務需要)
GRANT SELECT, INSERT, UPDATE, DELETE ON `mydb`.* TO 'app_user'@'10.0.1.%';
-- 僅授權特定表
GRANT SELECT, INSERT ON `mydb`.`orders` TO 'app_user'@'10.0.1.%';
-- 只讀賬號 (報表/數倉)
GRANT SELECT ON `mydb`.* TO 'readonly'@'10.0.1.%';
-- 4. 刷新權限生效
FLUSH PRIVILEGES;
-- 5. 驗證遠程連接
mysql -h -u app_user -p -D mydb -e "SELECT 1;"
validate_password 插件強制長度≥12、混合大小寫數字特殊字符、過期輪換。REQUIRE SSL 在 GRANT 中強制加密連接;require_secure_transport=ON 全局強制;--ssl-mode=VERIFY_CA --ssl-ca=ca.pem 驗證服務端身份。skip_show_database、local_infile=OFF、symbolic_links=OFF。SELECT User, Host, authentication_string FROM mysql.user; 清理僵屍賬號、收回過度權限。| 現象 | 排查方向 |
|---|---|
| Can't connect (timeout) | 防火牆/安全組/雲廠商 ACL、MySQL bind-address=127.0.0.1、服務未啟動 |
| Access denied | 用戶名/密碼錯誤、Host 不匹配 (IP vs 域名)、密碼插件不兼容 (caching_sha2_password vs mysql_native_password) |
| SSL connection error | 客戶端不支持 TLS 版本、CA 證書路徑錯誤、require_secure_transport=ON 但客戶端未啟用 SSL |
| Host 'x.x.x.x' is blocked | max_connect_errors 觸發,執行 FLUSH HOSTS 或增大該變量 |