核心三步驟
- 配置檔綁定地址:修改
bind-address 允許非本地連接。
- 建立遠程用戶並授權:
CREATE USER ... @'%' + GRANT。
- 防火牆/安全組放行 3306 埠:OS 層面允許入站流量。
步驟 1:修改配置檔 (my.cnf / my.ini)
Linux (/etc/my.cnf 或 /etc/mysql/my.cnf)
[mysqld]
# 註釋或修改為 0.0.0.0 監聽所有網卡
# bind-address = 127.0.0.1
bind-address = 0.0.0.0
# 或具體內網 IP (多網卡場景)
# bind-address = 192.168.1.100
# 重啟生效
systemctl restart mysqld
Windows (my.ini,通常在安裝目錄或 C:\ProgramData\MySQL\MySQL Server 8.0\)
[mysqld]
bind-address = 0.0.0.0
# 重啟服務
net stop mysql80
net start mysql80
驗證監聽狀態
# Linux
ss -lntp | grep 3306
netstat -lntp | grep 3306
# Windows
netstat -ano | findstr 3306
# 應顯示 0.0.0.0:3306 或 :::3306 (IPv6)
步驟 2:建立遠程用戶與精準授權
登入 MySQL
mysql -u root -p
方案 A:通配符主機 (最常用,開發/測試)
-- 建立用戶 (MySQL 8.0 語法)
CREATE USER 'app_user'@'%' IDENTIFIED BY 'StrongP@ssw0rd!';
-- 授權:指定庫、表、權限
GRANT SELECT, INSERT, UPDATE, DELETE ON app_db.* TO 'app_user'@'%';
-- 或全部權限 (慎用)
GRANT ALL PRIVILEGES ON app_db.* TO 'app_user'@'%';
-- 刷新權限
FLUSH PRIVILEGES;
方案 B:指定 IP/網段 (生產環境推薦,最小權限原則)
-- 單一 IP
CREATE USER 'app_user'@'192.168.1.50' IDENTIFIED BY 'StrongP@ssw0rd!';
GRANT SELECT, INSERT, UPDATE, DELETE ON app_db.* TO 'app_user'@'192.168.1.50';
-- 網段 (需 MySQL 8.0.14+ 支援 CIDR,否則用通配符)
CREATE USER 'app_user'@'192.168.1.%' IDENTIFIED BY 'StrongP@ssw0rd!';
GRANT SELECT, INSERT, UPDATE, DELETE ON app_db.* TO 'app_user'@'192.168.1.%';
方案 C:修改現有 root 用戶允許遠程 (極不推薦生產使用)
-- 查看現有用戶
SELECT User, Host FROM mysql.user;
-- 修改 root host (僅 5.7/8.0 可直接 UPDATE,8.0 建議用 RENAME USER)
-- 5.7
UPDATE mysql.user SET Host='%' WHERE User='root' AND Host='localhost';
FLUSH PRIVILEGES;
-- 8.0 (推薦)
RENAME USER 'root'@'localhost' TO 'root'@'%';
-- 或保留 localhost 另建遠程 root
CREATE USER 'root'@'%' IDENTIFIED BY 'StrongP@ssw0rd!';
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;
FLUSH PRIVILEGES;
步驟 3:防火牆與雲安全組放行
Linux firewalld (CentOS 7/8、RHEL、Fedora)
firewall-cmd --permanent --add-port=3306/tcp
firewall-cmd --reload
# 或僅允許特定 IP
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
Linux iptables (傳統)
iptables -A INPUT -p tcp --dport 3306 -s 192.168.1.0/24 -j ACCEPT
iptables-save > /etc/sysconfig/iptables
Ubuntu ufw
ufw allow from 192.168.1.0/24 to any port 3306
ufw enable
Windows 防火牆
# PowerShell 管理員
New-NetFirewallRule -DisplayName "MySQL 3306" -Direction Inbound -LocalPort 3306 -Protocol TCP -Action Allow -RemoteAddress 192.168.1.0/24
雲廠商安全組 (AWS SG / 阿里云安全組 / 腾讯云安全組)
- 入站規則:協議 TCP、埠 3306、來源 具體 IP/網段 (禁止 0.0.0.0/0)。
- 出站規則:通常預設全開,無需額外配置。
連線驗證與常見報錯排查
客戶端測試
# 命令列
mysql -h 192.168.1.100 -u app_user -p -P 3306
# GUI 工具
# Host: 192.168.1.100, Port: 3306, User: app_user, Password: ******
常見錯誤對照表
| 錯誤碼/訊息 | 原因 | 解決 |
| ERROR 1130 (HY000): Host 'x.x.x.x' is not allowed to connect | 用戶 Host 不匹配 | 建立 'user'@'%' 或具體 IP 用戶 |
| ERROR 2003 (HY000): Can't connect to MySQL server on 'host' (110/111) | 網絡不通/防火牆攔截/bind-address 錯誤 | 檢查 ping、telnet 3306、防火牆、bind-address=0.0.0.0 |
| ERROR 1045 (28000): Access denied for user 'user'@'host' | 密碼錯誤/用戶不存在/權限不足 | 確認密碼、FLUSH PRIVILEGES、GRANT 權限 |
| SSL connection error / cipher mismatch | 客戶端/服務端 SSL 協議不一致 | 連接加 --ssl-mode=DISABLED 或配置 SSL 憑證 |
| Authentication plugin 'caching_sha2_password' cannot be loaded | 8.0 預設插件舊客戶端不支援 | 用戶改用 mysql_native_password 或升級客戶端/驅動 |
生產環境安全加固清單
- 禁用 root 遠程登入:僅允許
root@localhost 或 root@127.0.0.1。
- 最小權限原則:應用用戶僅授予必要庫、必要增刪改查權限,禁止
DROP、ALTER、GRANT。
- 強密碼策略:
validate_password 插件強制長度、複雜度、過期輪換。
- 啟用 SSL 加密傳輸:
require_secure_transport=ON,配置 CA/Server/Client 憑證。
- 審計日誌:
audit_log 記錄所有連線、DDL、DML 操作。
- 定期審計用戶:
SELECT User, Host FROM mysql.user WHERE Host='%'; 清理無用遠程用戶。
總結
「配置檔綁 0.0.0.0 → 建用戶@% 授權 → 防火牆放行 3306」三步缺一不可。生產環境務必遵循最小權限、網段限制、SSL 加密、審計追蹤四大原則,將 MySQL 遠程訪問風險降至最低。
- 上一篇文章: MySQL 索引深度解析 (二):四大索引類型、全文索引中文痛點與索引管理實戰
- 下一篇文章: MySQL 關閉流程深度解析與安全關閉十大黃金法則
Copyright ©
程式碼之家 All Rights Reserved