[mysqld]
bind-address = 127.0.0.1 # 僅本機回環
# bind-address = 10.0.0.10 # 僅特定內網 IP
# bind-address = 0.0.0.0 # 所有介面 (預設行為)
修改後 systemctl restart mysqld 生效。
# 編輯 /etc/init.d/mysqld 或 mysqld_safe 調用行
$bindir/mysqld_safe --datadir=$datadir --pid-file=$pid_file --bind-address=127.0.0.1 &
重啟服務生效。
# netstat (傳統)
netstat -ltnp | grep mysqld
# 輸出應顯示
tcp 0 0 127.0.0.1:3306 0.0.0.0:* LISTEN 1234/mysqld
# ss (現代)
ss -ltnp | grep mysqld
# MySQL 客戶端驗證
mysql -h 127.0.0.1 -u root -p -e "SELECT 'OK';"
# 遠端 IP 應連線失敗 (Connection refused / timeout)
| 現象 | 原因 | 解決 |
|---|---|---|
| 仍顯示 0.0.0.0:3306 | my.cnf 被後載入配置覆蓋 | mysqld --help --verbose | grep -A1 'bind-address' 確認實際生效值 |
| 本機連線失敗 | 客戶端用 hostname 解析到外網 IP | 客戶端明確 -h 127.0.0.1 或 --protocol=tcp |
| Docker 容器無法連線 | 容器內 bind 127.0.0.1,宿主機無法存取 | 容器 bind-address=0.0.0.0,宿主機防火牆/安全組控制存取 |
bind-address = 內網管理 IP,拒絕公網直連。bind-address = 127.0.0.1,Unix Socket 更高效 (--protocol=socket)。skip-name-resolve、防火牆白名單、SSL/TLS 強制加密。bind-address 是 MySQL網路暴露面控制的第一道防線。標準化部署:my.cnf 顯式配置 → 重啟驗證 netstat/ss → 客戶端連線測試 → 納入基線掃描,確保資料庫僅在受信網路介面監聽。