經典場景:localhost 連得上,遠程 mysql -h ip 連不上。本文提供**四步排查法**,覆蓋網路、防火牆、MySQL 配置、用戶權限、雲安全組,直擊痛點。
ping 192.168.1.211 — 不通 = 網路不通 (VPC/路由/安全組)。telnet 192.168.1.211 3306 — 失敗 = 端口被攔截。# 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
netstat -anp | grep 3306
# 若輸出: tcp 0 0 127.0.0.1:3306 -- 僅監聽本地!
**修正 my.cnf**:
[mysqld]
bind-address = 0.0.0.0 # 監聽所有網卡
# 或具體內網 IP: bind-address = 192.168.1.211
修改後 systemctl restart mysqld,再驗證 netstat 應顯示 0.0.0.0:3306 或 :::3306。
mysql> USE mysql;
mysql> SELECT host, user FROM user;
+-----------+------+
| host | user |
+-----------+------+
| 127.0.0.1 | root |
| % | app |
+-----------+------+
root 默認只允許 localhost (host=127.0.0.1/localhost)。遠程連接需:
-- 方案 A: 修改現有用戶 host (不推薦 root)
UPDATE user SET host='%' WHERE user='root' AND host='127.0.0.1';
FLUSH PRIVILEGES;
-- 方案 B: 建立專用遠程用戶 (推薦,最小權限)
CREATE USER 'app_user'@'%' IDENTIFIED BY 'StrongPass123!';
GRANT SELECT, INSERT, UPDATE, DELETE ON `my_db`.* TO 'app_user'@'%';
FLUSH PRIVILEGES;
systemctl restart mysqld
# 遠程測試
mysql -h 192.168.1.211 -u app_user -p
| 現象 | telnet | netstat bind | 雲安全組 | 用戶 host | 定位 |
|---|---|---|---|---|---|
| Connection refused | ❌ | 127.0.0.1 | ✅ | % | bind-address 錯誤 |
| Connection timeout | ❌ | 0.0.0.0 | ❌ | % | 雲安全組/防火牆 |
| Access denied | ✅ | 0.0.0.0 | ✅ | 127.0.0.1 | 用戶無遠程權限 |
| SSL error | ✅ | 0.0.0.0 | ✅ | % | 客戶端/服務端 SSL 不匹配 |
安全最佳實踐: 生產環境**禁用 root 遠程**、**強密碼**、**SSL 加密**、**SSH 隧道/VPN 跳板機**、**最小權限授予**、**定期審計用戶 host 列**。