現象:賬號密碼正確、權限已授,但遠程連不上,telnet ip 3306 不通。核心原因:MySQL 默認 bind-address = 127.0.0.1 僅監聽本地回環。
vim /etc/my.cnf # 或 /etc/mysql/my.cnf /etc/mysql/mysql.conf.d/mysqld.cnf
# 找到 [mysqld] 區段
# bind-address = 127.0.0.1 <-- 在行首加 # 註釋掉
# 或改為具體 IP(多網卡場景)
bind-address = 0.0.0.0 # 監聽所有介面(推薦內網環境)
# bind-address = 192.168.1.100 # 僅監聽特定內網 IP
保存後必須重啟:
systemctl restart mysqld # 或 service mysql restart
驗證:
netstat -ntlp | grep 3306
# 應顯示 0.0.0.0:3306 或指定 IP:3306
telnet 192.168.1.100 3306 # 遠程機器測試
mysql -u root -p
USE mysql;
UPDATE user SET host = '%' WHERE user = 'root';
FLUSH PRIVILEGES;
-- 允許 kevin 從任意主機訪問所有庫所有表
GRANT ALL PRIVILEGES ON *.* TO 'kevin'@'%' IDENTIFIED BY 'mypassword' WITH GRANT OPTION;
-- 僅允許特定 IP
GRANT ALL PRIVILEGES ON *.* TO 'kevin'@'192.168.101.234' IDENTIFIED BY 'mypassword' WITH GRANT OPTION;
-- 僅特定庫
GRANT SELECT, INSERT, UPDATE, DELETE ON mydb.* TO 'app_user'@'%' IDENTIFIED BY 'apppass';
FLUSH PRIVILEGES;
查看權限:SHOW GRANTS FOR 'kevin'@'%';
# firewalld (CentOS 7+, Ubuntu 20.04+)
firewall-cmd --permanent --add-port=3306/tcp
firewall-cmd --reload
# iptables (舊版)
iptables -I INPUT -p tcp --dport 3306 -j ACCEPT
service iptables save
# ufw (Ubuntu)
ufw allow 3306/tcp
阿里雲 / AWS / 騰訊雲 / 華為雲控制台 → 安全組/防火牆規則 → 入方向開放 TCP 3306,來源建議限定應用服務器 CIDR(如 10.0.0.0/8),禁止 0.0.0.0/0。
| 現象 | 排查順序 |
|---|---|
| 本機連得上,遠程連不上 | 1. bind-address 2. GRANT host='%' 3. 防火牆/安全組 4. SELinux/AppArmor |
| ERROR 1130 (HY000): Host 'x.x.x.x' is not allowed to connect | GRANT host 不匹配,需精確到 IP 或 % |
| telnet 通但報錯 "Authentication plugin 'caching_sha2_password' cannot be loaded" | 客戶端版本過低(<8.0),改用 mysql_native_password:ALTER USER 'user'@'%' IDENTIFIED WITH mysql_native_password BY 'pwd'; |
| 連接慢(>5s) | DNS 反向解析,skip-name-resolve=1 加入 my.cnf |
GRANT ... TO 'user'@'10.0.%' + 安全組 CIDR 双層防護。REQUIRE SSL 強制加密,防內網劫持。audit_log 或開源 MariaDB Audit Plugin 記錄所有登入/查詢。ALTER USER 'user'@'%' PASSWORD EXPIRE INTERVAL 90 DAY;「bind-address 開放 → 賬號授權精確 → 防火牆/安全組放行」三步缺一不可,按清單逐項核對,遠程連接一次成功。