MySQL 預設僅允許本機 localhost 連線。開啟遠端存取需完成 **三大動作**:建立允許遠端的帳號、調整 bind-address 監聽介面、開放防火牆 3306 埠。本文提供生產級設定步驟與安全清單。
-- 登入本機 root
mysql -u root -p
-- 建立帳號限定來源 IP (最安全)
CREATE USER 'app_user'@'192.168.1.100' IDENTIFIED BY 'Str0ngP@ss!';
GRANT SELECT, INSERT, UPDATE, DELETE ON mydb.* TO 'app_user'@'192.168.1.100';
-- 或允許特定網段 (CIDR 寫法不支援,需用通配符)
CREATE USER 'app_user'@'192.168.1.%' IDENTIFIED BY 'Str0ngP@ss!';
GRANT SELECT, INSERT, UPDATE, DELETE ON mydb.* TO 'app_user'@'192.168.1.%';
-- 僅測試環境:允許任意 IP (生產嚴禁)
CREATE USER 'app_user'@'%' IDENTIFIED BY 'Str0ngP@ss!';
GRANT ALL PRIVILEGES ON mydb.* TO 'app_user'@'%';
FLUSH PRIVILEGES; -- 立即生效
-- 8.0 相容舊驅動需指定認證插件
ALTER USER 'app_user'@'%' IDENTIFIED WITH mysql_native_password BY 'Str0ngP@ss!';
[mysqld]
# 5.7/8.0 預設 bind-address=127.0.0.1 (僅回環)
# 方案 A:註解掉 → 監聽所有介面 (0.0.0.0)
# bind-address = 127.0.0.1
# 方案 B:指定內網 IP (推薦,較安全)
bind-address = 192.168.1.50
# 方案 C:8.0 支援多位址
bind-address = 192.168.1.50, 10.0.0.10
# 關鍵:跳過 DNS 反解析,大幅提升連線速度
skip-name-resolve
修改後 **重啟服務**:systemctl restart mysqld (Linux) 或 net stop mysql && net start mysql (Windows)。
| 環境 | 指令/操作 |
|---|---|
| CentOS/RHEL 7/8 (firewalld) | firewall-cmd --permanent --add-port=3306/tcp --source=192.168.1.0/24 && firewall-cmd --reload |
| Ubuntu/Debian (ufw) | ufw allow from 192.168.1.0/24 to any port 3306 |
| Windows Defender 防火牆 | 進階設定 → 輸入規則 → 新增規則 → 連接埠 TCP 3306 → 允許 → 設定遠端 IP 192.168.1.0/24 |
| AWS Security Group / Azure NSG / GCP Firewall | 入站規則:TCP 3306,來源 CIDR:192.168.1.0/24 (僅應用伺服器網段) |
# 客戶端測試
mysql -h 192.168.1.50 -u app_user -p -D mydb
# GUI 工具 (Workbench, DBeaver, DataGrip, Navicat)
# Host: 192.168.1.50, Port: 3306, User: app_user, Password: ******, Database: mydb
Host 'x.x.x.x' is not allowed to connect → SELECT user, host FROM mysql.user; 確認帳號 host 匹配。Can't connect (10060/110) → 網路不通:telnet 192.168.1.50 3306、netstat -an | grep 3306 確認監聽、防火牆、安全組、VPN 路由。Authentication plugin 'caching_sha2_password' not loaded → 8.0 預設新插件,舊驅動不支援。ALTER USER 'u'@'%' IDENTIFIED WITH mysql_native_password BY 'pwd';。SSL required → 帳號有 REQUIRE SSL,客戶端啟用 SSL 或移除要求。REQUIRE SSL + 客戶端驗證 CA。skip-name-resolve 避免 DNS 延遲。mysql.user 異常帳號。audit_log) 記錄登入/查詢。max_connections、thread_cache_size 配合應用連線池調大。