telnet 192.168.41.191 3306
Trying 192.168.41.191...
Connected to 192.168.41.191.
Escape character is '^]'.
G Host '192.168.41.186' is not allowed to connect to this MySQL server
Connection closed by foreign host.
端口通、防火牆已關,仍報「Host not allowed」 → **MySQL 用戶表 Host 欄位限制**。
MySQL 安裝初始化時,mysql.user 表的 Root 用戶 Host 預設為 localhost / 127.0.0.1 / ::1,**不包含遠程 IP 或通配符 %**。
mysql -uroot -p
USE mysql;
-- 方案 A:改現有 root 行(謹慎,可能影響本地 Socket 連接)
UPDATE user SET Host='%' WHERE User='root' AND Host='localhost';
FLUSH PRIVILEGES;
-- 方案 B:新增一行遠程 root(推薦,保留本地 localhost 行)
CREATE USER 'root'@'%' IDENTIFIED BY 'StrongPass@123';
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;
FLUSH PRIVILEGES;
# firewalld
firewall-cmd --permanent --add-port=3306/tcp
firewall-cmd --reload
# iptables
iptables -A INPUT -p tcp --dport 3306 -j ACCEPT
service iptables save
# 雲廠商安全組:入站規則允許 TCP 3306,來源按需限制(如僅應用服務器 CIDR)
bind-address 配置# /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
# 遠程機器
mysql -h 192.168.41.191 -uroot -p
# 或指定協議
mysql -h 192.168.41.191 -P 3306 -uroot -p --protocol=tcp
app_user@'10.0.0.%',Root 僅本地 localhost。GRANT SELECT,INSERT,UPDATE,DELETE ON biz_db.* TO 'app_user'@'10.0.0.%';validate_password 組件。REQUIRE SSL 在 GRANT 中指定,客戶端配置 CA/證書。audit_log 記錄登入、DDL、DML。| 誤區 | 真相 |
|---|---|
| 以為防火牆關了就能連 | MySQL 內部權限表 mysql.user 獨立於 OS 防火牆 |
| 改 % 後本地無法連 | 保留 root@localhost 行,或用 --protocol=socket 強制走 Unix Socket |
| bind-address 不改也能遠程 | 綁定 127.0.0.1 時,外部 TCP 連接直接被內核拒絕,不進 MySQL 層 |