MySQL 預設僅允許 localhost (127.0.0.1) 本地連接。若需開放任意 IP 遠程訪問,最直接的方法是修改 mysql.user 系統表中 root 用戶的 Host 欄位從 localhost 改為 %(通配符,匹配任意主機)。本文記錄命令列完整操作流程、驗證步驟與安全性警示。
%。請建立專用業務用戶、限制具體 IP 段、啟用 SSL、配置防火牆白名單。本文僅供開發測試環境或教學參考。
bin 目錄絕對路徑# Windows 示例
cd \
cd "C:\Program Files\MySQL\MySQL Server 5.7\bin"
# 或
cd "C:\Program Files\MySQL\MySQL Server 8.0\bin"
# Linux 示例(通常已在 PATH)
# 可直接執行 mysql 命令
mysql -h localhost -u root -p
# 提示輸入密碼,輸入 root 密碼
# 成功進入 mysql> 提示符
mysql> USE mysql;
Database changed
mysql> SELECT User, Host FROM user;
+------------------+-----------+
| User | Host |
+------------------+-----------+
| root | localhost |
| mysql.session | localhost |
| mysql.sys | localhost |
| debian-sys-maint | localhost |
+------------------+-----------+
4 rows in set (0.00 sec)
mysql> UPDATE user SET Host='%' WHERE User='root' AND Host='localhost';
Query OK, 1 row affected (0.01 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)
mysql> SELECT User, Host FROM user;
+------------------+------+
| User | Host |
+------------------+------+
| root | % | <-- 已變更
| mysql.session | localhost |
| mysql.sys | localhost |
| debian-sys-maint | localhost |
+------------------+------+
4 rows in set (0.00 sec)
# 另一台機器/客戶端測試
mysql -h -u root -p
# 應可成功連接
-- 僅允許特定 IP 段
CREATE USER 'app_user'@'192.168.1.%' IDENTIFIED BY 'StrongPass123!';
GRANT SELECT, INSERT, UPDATE, DELETE ON app_db.* TO 'app_user'@'192.168.1.%';
-- 或允許任意 IP(較寬鬆)
CREATE USER 'app_user'@'%' IDENTIFIED BY 'StrongPass123!';
GRANT SELECT, INSERT, UPDATE, DELETE ON app_db.* TO 'app_user'@'%';
FLUSH PRIVILEGES;
# 客戶端建立 SSH 隧道
ssh -L 3307:127.0.0.1:3306 user@mysql_server_ip
# 本地連接隧道端口
mysql -h 127.0.0.1 -P 3307 -u root -p
# 流量經 SSH 加密傳輸,MySQL 僅見本地連接
-- 創建用戶指定認證插件(相容舊客戶端)
CREATE USER 'remote_user'@'%' IDENTIFIED WITH mysql_native_password BY 'StrongPass123!';
GRANT ALL PRIVILEGES ON business_db.* TO 'remote_user'@'%';
FLUSH PRIVILEGES;
/etc/my.cnf 設置 bind-address = 0.0.0.0 或具體內網 IP# Ubuntu UFW
sudo ufw allow from 192.168.1.0/24 to any port 3306
# CentOS firewalld
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" port protocol="tcp" port="3306" accept'
firewall-cmd --reload
# 雲廠商安全組:入站規則 3306/tcp 來源 192.168.1.0/24
require_secure_transport=ON 強制加密連接| 問題 | 原因 | 解決 |
|---|---|---|
| ERROR 1130: Host 'x.x.x.x' not allowed | 用戶 Host 欄位不匹配 | 檢查 user 表 Host 值,確認 % 或具體 IP |
| ERROR 2003: Can't connect (10060) | 網路不通/防火牆阻擋 | ping、telnet 3306、檢查安全組/防火牆 |
| ERROR 2059: Authentication plugin | MySQL 8.0 caching_sha2_password | 用 mysql_native_password 或升級客戶端 |
| 修改後仍無法遠程連接 | bind-address 仍為 127.0.0.1 | 修改 my.cnf bind-address=0.0.0.0 並重啟 |
mysql> DESC user;
+------------------------+-----------------------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+------------------------+-----------------------------------+------+-----+---------+-------+
| Host | char(60) | NO | PRI | | |
| User | char(32) | NO | PRI | | |
| Select_priv | enum('N','Y') | NO | | N | |
| ... | ... | | | | |
| authentication_string | text | YES | | NULL | |
| plugin | char(64) | NO | | | |
+------------------------+-----------------------------------+------+-----+---------+-------+
-- 主鍵為 (Host, User),同一用戶不同 Host 視為不同賬號
修改 mysql.user 表的 Host 欄位是開放遠程訪問的「核按鈕」,操作簡單但風險極高。生產環境請務必遵循最小權限原則:專用用戶、具體 IP、強密碼、SSL 加密、網路隔離。開發測試環境使用本文方法可快速驗證連通性,用畢即刪或恢復。