萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> MySQL 教學

MySQL 遠程訪問被拒絕?bind-address、授權模型與防火牆三步排查法

故障現象

  • 本地 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 不通。

三步排查法

步驟 1:檢查 bind-address(網絡綁定層)

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。

步驟 2:檢查用戶授權(權限層)

MySQL 權限模型:**用戶 = 用戶名 + 來源主機**。root@localhost ≠ root@%。

方案 A:創建遠程專用賬號(推薦,最小權限)


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.%'。

方案 B:修改現有用戶 Host(不推薦用於 root)


USE mysql;
UPDATE user SET Host='%' WHERE User='root' AND Host='localhost';
FLUSH PRIVILEGES;

風險:root 遠程登錄極大安全隱患,生產環境嚴禁。

方案 C:指定 IP 授權


GRANT ALL PRIVILEGES ON *.* TO 'user1'@'192.168.1.3' IDENTIFIED BY 'mypassword' WITH GRANT OPTION;
FLUSH PRIVILEGES;

步驟 3:檢查防火牆/安全組(網絡通路層)

Linux iptables/firewalld


# 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

云廠商安全組

  • 阿里雲/騰訊雲/AWS:控制台 → 安全組 → 入站規則 → 添加 TCP 3306,來源填寫應用服務器 IP 或 CIDR。

雲數據庫 (RDS/CloudSQL)

  • 無需修改 bind-address,在控制台「白名單/訪問控制」添加客戶端 IP。

進階排查清單

現象可能原因驗證命令
連接超時防火牆/安全組阻擋、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 權限缺失**、**防火牆/安全組未放行**。按「網絡層 → 權限層 → 通路層」三步排查,配合最小權限原則創建業務專用賬號,即可安全開放遠程訪問。

copyright © 萬盛學電腦網 all rights reserved