Ubuntu Server 安裝 MySQL 5.0,本地命令列可登入、建表、授權,但 Windows 端 Navicat 連線報錯:
2003 – Can't connect to MySQL server on 'ubuntu' (10061)
mysql.user 顯示帳號已有 % 主機權限,防火牆也已放行 3306,仍無法連線。
MySQL 預設綁定 127.0.0.1(僅本地回環),導致外部 TCP 連線直接被拒。錯誤碼 10061 即「連線被拒絕」,非認證失敗(1045)。
# 編輯 /etc/mysql/my.cnf (或 /etc/my.cnf) # 找到 [mysqld] 區段 bind-address = 127.0.0.1 # 註釋或修改 # 改為監聽所有介面 bind-address = 0.0.0.0
0.0.0.0 代表監聽所有網卡 IPv4 位址192.168.1.100)bind-address = * 寫法# Systemd sudo systemctl restart mysql # 或 SysVinit sudo /etc/init.d/mysql restart
ss -ltnp | grep 3306 # 或 netstat -ltnp | grep 3306 # 應顯示 0.0.0.0:3306 或 :::3306
# UFW sudo ufw allow 3306/tcp # iptables sudo iptables -A INPUT -p tcp --dport 3306 -j ACCEPT
CREATE USER 'app'@'192.168.1.%' IDENTIFIED BY 'strong_pwd';REQUIRE SSL 強制加密傳輸DELETE FROM mysql.user WHERE User='root' AND Host!='localhost'; FLUSH PRIVILEGES;port = 33061 減少掃描攻擊| 誤區 | 真相 |
|---|---|
| 以為授權 % 就能遠程連 | 授權只管權限,bind-address 管網路層面能不能進來 |
| 改完 my.cnf 沒重啟 | 配置唯有重啟 mysqld 才生效 |
| 雲主機安全組/防火牆未放行 | 雲廠商預設常封 3306,須在控制台開放 |
| SELinux / AppArmor 攔截 | 檢查 audit.log,必要時調整策略或設為 Permissive |
/etc/mysql/mysql.conf.d/mysqld.cnfbind-address 可寫多行,支援 IPv6 ::/etc/mysql/mariadb.conf.d/50-server.cnfbind-address = 0.0.0.0 + 重啟服務 + 防火牆放行 是解決 MySQL 遠程連線的標準三部曲。生產環境務必配合最小權限帳號、SSL、非預設埠、雲安全組,構建纵深防禦。