mysql -u root -p 正常,遠程 mysql -h server_ip -u user -p 報錯:ERROR 1130 (HY000): Host 'x.x.x.x' is not allowed to connect to this MySQL server 或連接超時。telnet server_ip 3306 不通。MySQL 默認綁定 127.0.0.1,僅監聽本地回環。
# /etc/my.cnf 或 /etc/mysql/my.cnf
[mysqld]
# bind-address = 127.0.0.1 # 註釋掉或改為 0.0.0.0 監聽所有網卡
bind-address = 0.0.0.0
修改後**必須重啟**:systemctl restart mysqld。驗證:netstat -tlnp | grep 3306 應顯示 0.0.0.0:3306 或 :::3306。
MySQL 權限模型:**用戶 = 用戶名 + 來源主機**。root@localhost ≠ root@%。
CREATE USER 'app_user'@'%' IDENTIFIED BY 'StrongPass123!';
GRANT SELECT, INSERT, UPDATE, DELETE, EXECUTE ON app_db.* TO 'app_user'@'%';
FLUSH PRIVILEGES;
% 允許任意 IP,生產建議限定具體 IP/網段:'app_user'@'192.168.1.%'。
USE mysql;
UPDATE user SET Host='%' WHERE User='root' AND Host='localhost';
FLUSH PRIVILEGES;
風險:root 遠程登錄極大安全隱患,生產環境嚴禁。
GRANT ALL PRIVILEGES ON *.* TO 'user1'@'192.168.1.3' IDENTIFIED BY 'mypassword' WITH GRANT OPTION;
FLUSH PRIVILEGES;
# firewalld (CentOS 7+)
firewall-cmd --permanent --add-port=3306/tcp
firewall-cmd --reload
# iptables
iptables -A INPUT -p tcp --dport 3306 -j ACCEPT
service iptables save
| 現象 | 可能原因 | 驗證命令 |
|---|---|---|
| 連接超時 | 防火牆/安全組阻擋、bind-address 錯誤 | telnet/nc -zv host 3306; netstat -tlnp |
| ERROR 1130 Host not allowed | 用戶 Host 權限不匹配 | SELECT User, Host FROM mysql.user; |
| ERROR 1045 Access denied | 密碼錯誤、認證插件不匹配 | 檢查密碼、authentication_plugin |
| SSL 錯誤 | 強制 SSL 但客戶端未配置 | SHOW VARIABLES LIKE 'require_secure_transport'; |
| SELinux 阻擋 | CentOS/RHEL 默認策略 | ausearch -m avc; setsebool -P mysql_connect_any 1 |
#!/bin/bash
HOST=$1
USER=$2
PASS=$3
DB=$4
echo "1. TCP 連通性:"
nc -zv $HOST 3306
echo "2. MySQL 協議握手:"
mysql -h $HOST -u $USER -p$PASS -e "SELECT VERSION();" 2>&1 | head -5
echo "3. 權限驗證:"
mysql -h $HOST -u $USER -p$PASS -e "SHOW GRANTS FOR CURRENT_USER();"
遠程訪問失敗 99% 集中在:**bind-address 未開放**、**用戶 Host 權限缺失**、**防火牆/安全組未放行**。按「網絡層 → 權限層 → 通路層」三步排查,配合最小權限原則創建業務專用賬號,即可安全開放遠程訪問。