預設情況下,Ubuntu 上的 MySQL 僅允許本地連接(綁定 127.0.0.1)。本文詳細說明如何修改配置開放遠程訪問,包含網路綁定調整、用戶授權、防火牆配置及常見問題排查,適用於 Ubuntu 12.04 至最新 LTS 版本。
1. 編輯配置檔
sudo vim /etc/mysql/my.cnf
# 或 Ubuntu 18.04+ 可能路徑
sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf
2. 修改 bind-address 參數
# 找到以下行
bind-address = 127.0.0.1
# 修改為以下任一選項:
# 選項 A:允許所有 IP 訪問(生產環境需配合防火牆)
bind-address = 0.0.0.0
# 選項 B:指定具體 IP(更安全,如伺服器內網 IP 192.168.1.100)
bind-address = 192.168.1.100
3. 重啟 MySQL 服務生效
# Ubuntu 16.04+ (systemd)
sudo systemctl restart mysql
# Ubuntu 14.04 或傳統方式
sudo /etc/init.d/mysql restart
# 或
sudo service mysql restart
登入 MySQL 控制台執行授權語句:
mysql -uroot -p
-- 方案 1:允許 root 從任意 IP 連接(不建議生產環境使用)
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'your_strong_password' WITH GRANT OPTION;
-- 方案 2:建立專用遠程用戶(推薦生產環境)
CREATE USER 'remote_user'@'%' IDENTIFIED BY 'strong_password';
GRANT ALL PRIVILEGES ON your_db.* TO 'remote_user'@'%';
-- 或限制特定 IP
CREATE USER 'remote_user'@'192.168.1.%' IDENTIFIED BY 'strong_password';
GRANT SELECT, INSERT, UPDATE, DELETE ON your_db.* TO 'remote_user'@'192.168.1.%';
-- 必須執行使權限生效
FLUSH PRIVILEGES;
# 檢查防火牆狀態
sudo ufw status
# 允許 MySQL 預設端口 3306
sudo ufw allow 3306/tcp
# 或限制特定 IP 段
sudo ufw allow from 192.168.1.0/24 to any port 3306
# 啟用防火牆(若未啟用)
sudo ufw enable
使用 MySQL Workbench、Navicat、HeidiSQL 或命令列工具:
# 命令列測試
mysql -h ubuntu_server_ip -u remote_user -p
# 連接參數說明:
# -h : 目標伺服器 IP 或主機名
# -u : 遠程授權的用戶名
# -p : 提示輸入密碼
# -P : 指定端口(非 3306 時需指定)
| 問題現象 | 可能原因 | 解決方法 |
|---|---|---|
| ERROR 1130: Host 'x.x.x.x' is not allowed to connect | 用戶 host 欄位不匹配 | 檢查 user 表 host 值,確認 '%' 或具體 IP 授權 |
| ERROR 2003: Can't connect to MySQL server (10060) | 網路不通/防火牆阻擋 | ping 測試連通性、檢查 ufw/iptables、雲廠商安全組 |
| ERROR 2002: Can't connect via socket | 客戶端嘗試本地 socket 連接 | 強制使用 TCP:mysql -h 127.0.0.1 -u root -p |
| Authentication plugin 'caching_sha2_password' not supported | MySQL 8.0 新認證插件 | 建立用戶指定插件:IDENTIFIED WITH mysql_native_password BY 'pwd' |
require_secure_transport=ON 強制加密傳輸SHOW GRANTS 定期檢查遠程用戶權限完成上述配置後,您的 Ubuntu MySQL 即可安全地接受遠程連接。建議在生產環境部署前,先在測試環境完整驗證連接、權限、防火牆等所有環節。