MySQL 默認僅允許本地連接(bind-address=127.0.0.1),開啟遠程訪問需完成「配置文件綁定地址 → 賬號授權主機通配 → 防火牆放行端口」三步。本文提供標準化操作流程與安全加固建議。
# 編輯 /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,如 192.168.1.100)
# 可選:跳過主機名解析,提升連接速度
skip_name_resolve = ON
重啟服務生效:systemctl restart mysqld。驗證:netstat -ltnp | grep 3306 應顯示 0.0.0.0:3306 或指定 IP。
-- 1. 創建專用遠程賬號(不建議直接放開 root)
CREATE USER 'app_user'@'%' IDENTIFIED BY 'StrongPass123!';
-- 2. 授權指定庫/表
GRANT SELECT, INSERT, UPDATE, DELETE ON `app_db`.* TO 'app_user'@'%';
-- 3. 刷新權限
FLUSH PRIVILEGES;
GRANT ALL PRIVILEGES ON `app_db`.* TO 'app_user'@'%' IDENTIFIED BY 'StrongPass123!';
FLUSH PRIVILEGES;
'user'@'%':% 通配所有主機(遠程 + 本地)。若需限制網段:'user'@'192.168.1.%'。GRANT ... TO 'root'@'%':root 遠程登錄是重大安全風險,合規審計必查項。skip_name_resolve=ON 時,Host 列只識別 IP/通配符,不解析主機名。firewall-cmd --permanent --add-port=3306/tcp
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" port port="3306" protocol="tcp" accept'
firewall-cmd --reload
iptables -A INPUT -p tcp --dport 3306 -s 192.168.1.0/24 -j ACCEPT
iptables-save > /etc/sysconfig/iptables
192.168.1.0/24)。0.0.0.0/0(全網開放)。# 應用服務器執行
mysql -h 192.168.1.100 -u app_user -p'StrongPass123!' -e "SELECT USER(), CURRENT_USER(), VERSION();"
# 或測試連通性
telnet 192.168.1.100 3306
nc -zv 192.168.1.100 3306
| 項目 | 配置 | |
|---|---|---|
| 強密碼策略 | validate_password 插件:長度≥12、大小寫數字特殊字符、過期輪換 | |
| SSL/TLS 加密傳輸 | require_secure_transport=ON,配置 CA/Server/Client 證書,強制 --ssl-mode=VERIFY_IDENTITY | |
| 最小權限原則 | 賃戶/應用各用各賬號,僅授權所需庫表、所需操作(SELECT/INSERT...) | |
| 審計日誌 | MariaDB Audit Plugin / MySQL Enterprise Audit 記錄登錄、DDL、DML、錯誤 | |
| 連接數限制 | MAX_CONNECTIONS_PER_HOUR、MAX_USER_CONNECTIONS 防止單賬號佔滿 | |
| 定期審計 | 排查無用賬號、過期權限、弱密碼、異常登錄 IP |
| 現象 | 可能原因 | 排查命令 |
|---|---|---|
Can't connect to MySQL server (110/111) | 防火牆阻攔 / bind-address 未改 / 服務未啟動 | telnet ip 3306、netstat -ltnp、firewall-cmd --list-all |
Access denied for user 'x'@'ip' | 賬號 Host 不匹配 / 密碼錯誤 / skip_name_resolve 導致主機名不匹配 | SELECT User, Host FROM mysql.user WHERE User='x'; |
Host 'x' is not allowed to connect | 同上 | 同上 |
| SSL 握手失敗 | 證書過期/不匹配 / 客戶端未配置 CA | mysql --ssl-mode=VERIFY_CA ... |