開放遠程連線是開發、運維、異地備份的常態需求,但也意味著攻擊面擴大。生產環境務必遵循最小權限原則:僅開放必要 IP、專用賬號、強密碼、SSL 加密、防火牆限制來源。
# 編輯配置檔
vi /etc/mysql/my.cnf # 或 /etc/my.cnf
# 找到 bind-address 行,註釋或改為 0.0.0.0(監聽所有介面)
# bind-address = 127.0.0.1
bind-address = 0.0.0.0
重啟生效:
systemctl restart mysqld # systemd
# 或
service mysql restart # SysVinit
# firewalld (CentOS 7+/RHEL 7+)
firewall-cmd --permanent --add-port=3306/tcp
firewall-cmd --reload
# iptables (舊版)
iptables -A INPUT -p tcp --dport 3306 -j ACCEPT
service iptables save
# ufw (Ubuntu/Debian)
ufw allow 3306/tcp
進階:僅允許特定 IP 段:firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="10.0.0.0/24" port protocol="tcp" port="3306" accept'
登入 MySQL:
mysql -u root -p
方案 A:特定 IP 存取(推薦)
CREATE USER 'app_user'@'10.0.0.%' IDENTIFIED BY 'StrongP@ssw0rd!';
GRANT SELECT, INSERT, UPDATE, DELETE ON `mydb`.* TO 'app_user'@'10.0.0.%';
FLUSH PRIVILEGES;
方案 B:通配符存取(僅測試環境)
CREATE USER 'dev_user'@'%' IDENTIFIED BY 'StrongP@ssw0rd!';
GRANT ALL PRIVILEGES ON *.* TO 'dev_user'@'%' WITH GRANT OPTION;
FLUSH PRIVILEGES;
方案 C:修改既有 root 允許遠程(極不推薦生產用)
UPDATE mysql.user SET Host='%' WHERE User='root' AND Host='localhost';
FLUSH PRIVILEGES;
# 遠程主機測試
mysql -h 192.168.1.100 -u app_user -p -D mydb
# 檢查連線狀態
SHOW PROCESSLIST;
SELECT USER(), CURRENT_USER();
REQUIRE SSL 在 GRANT 中指定,配置 ssl_ca/ssl_cert/ssl_keyvalidate_password 插件強制複雜度MAX_CONNECTIONS_PER_HOUR、MAX_USER_CONNECTIONSaudit_log 記錄所有操作| 現象 | 可能原因 | 排查命令 |
|---|---|---|
| Connection refused | bind-address、防火牆、服務未啟動 | ss -ltnp | grep 3306 / firewall-cmd --list-all |
| Host 'x.x.x.x' is not allowed | 用戶 Host 欄位不匹配 | SELECT User, Host FROM mysql.user; |
| Access denied for user | 密碼錯誤、權限不足、plugin 不對(caching_sha2_password vs mysql_native_password) | SHOW CREATE USER 'u'@'h'; |
| SSL connection error | 憑證不匹配、版本不支援 | mysql --ssl-mode=REQUIRED ... |