默認安裝的 MySQL 為安全起見,僅允許本地連接。開發、測試、生產部署時常需開放遠程訪問,需同時完成「賬號授權」與「服務綁定地址」兩項配置。
-- 1. 登錄 MySQL
mysql -uroot -p
-- 2. 進入 mysql 系統庫
USE mysql;
-- 3. 授權:root 用戶允許任意主機 (%) 訪問,密碼強複雜度
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'StrongPassw0rd!@#';
-- 4. 立即生效
FLUSH PRIVILEGES;
-- 5. 驗證
SELECT User, Host FROM user WHERE User='root';
-- 應看到 root | % 行
MySQL 默認 bind-address = 127.0.0.1 僅監聽回環接口,遠程連接會被拒絕。
# 1. 編輯配置文件 (路徑視發行版而定)
vim /etc/mysql/my.cnf # Ubuntu/Debian
vim /etc/my.cnf # CentOS/RHEL
# 2. 找到 [mysqld] 區塊,註釋或修改 bind-address
# bind-address = 127.0.0.1 # 註釋掉,監聽所有接口 (0.0.0.0)
# 或顯式指定內網 IP
bind-address = 192.168.1.100 # 僅監聽特定內網卡
# 3. 重啟服務生效
systemctl restart mysqld # systemd
# 或 service mysqld restart # SysVinit
# firewalld (CentOS 7+)
firewall-cmd --permanent --add-port=3306/tcp
firewall-cmd --reload
# iptables
iptables -I INPUT -p tcp --dport 3306 -j ACCEPT
service iptables save
# 云廠商安全組/防火牆亦需放行對應端口及源 IP 段
CREATE USER 'app_user'@'192.168.1.%' IDENTIFIED BY 'StrongPassw0rd!';
GRANT SELECT,INSERT,UPDATE,DELETE ON app_db.* TO 'app_user'@'192.168.1.%';
FLUSH PRIVILEGES;
bind-address = 192.168.x.x,拒絕公網直連。require_secure_transport=ON,強制 TLS 連接。SELECT User, Host FROM mysql.user; 清理無用/弱密碼賬號。| 現象 | 可能原因 | 排查命令 |
|---|---|---|
| Can't connect to MySQL server (111/10061) | 服務未啟動 / bind-address 錯誤 / 防火牆攔截 | ss -lntp \| grep 3306 / telnet ip 3306 |
| Access denied for user 'root'@'x.x.x.x' | 賬號無遠程授權 / 密碼錯誤 / Host 不匹配 | SELECT User, Host FROM mysql.user; |
| Host 'x.x.x.x' is not allowed to connect | skip-name-resolve 導致反解失敗 / 賬號 Host 限制 | skip_name_resolve=ON / 用 IP 授權 |
| SSL connection error | 客戶端/服務端 SSL 協議不匹配 | mysql --ssl-mode=DISABLED 測試 |
Windows 版 MySQL 安裝向導勾選「Configure as Windows Service」且「Enable root access from remote machines」即自動完成授權與防火牆規則,無需手動修改 my.ini (默認綁定 0.0.0.0)。