首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 3306 端口安全加固:綁定本地回環與防火牆雙重防護

     編輯:MySQL 資料庫相關知識

問題現狀

默認安裝下,MySQL 綁定 0.0.0.0:3306 監聽所有網卡,任意外部 IP 可直連。netstat -anlp 可見:

tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN 638/mysqld

方案一:配置文件綁定本地回環 (推薦)

修改啟動腳本 /etc/init.d/mysql (或 mysqld_safe 參數):

# 原行
$bindir/mysqld_safe --datadir=$datadir --pid-file=$pid_file &

# 修改為
$bindir/mysqld_safe --datadir=$datadir --pid-file=$pid_file --bind-address=127.0.0.1 &

重啟服務:/etc/init.d/mysql restart

驗證:netstat -l 應顯示 tcp 0 0 localhost:mysql *:* LISTEN

方案二:系統防火牆限制存取 (纵深防禦)

iptables 示例

# 僅允許特定應用服務器 IP 訪問
iptables -A INPUT -p tcp -s 10.0.1.0/24 --dport 3306 -j ACCEPT
iptables -A INPUT -p tcp --dport 3306 -j DROP

# 或僅允許本機
iptables -A INPUT -p tcp -s 127.0.0.1 --dport 3306 -j ACCEPT
iptables -A INPUT -p tcp --dport 3306 -j DROP

注意:-s $ANY 非標準語法,請使用具體 CIDR。

方案三:MySQL 8.0+ 原生管理

[mysqld]
bind-address=127.0.0.1
# 或多 IP 綁定 (8.0.13+)
bind-address=127.0.0.1,10.0.1.100

# 動態修改 (需 RELOAD 權限)
SET GLOBAL bind_address='127.0.0.1';

驗證清單

  1. netstat -an | grep 3306 僅顯示 127.0.0.1 或授權 IP
  2. 遠程主機 telnet db_ip 3306 應連接被拒/超時
  3. 本機 mysql -h 127.0.0.1 -u user -p 正常
  4. 應用連接字串使用 127.0.0.1 而非 localhost (避免 Unix Socket 差異)

常見誤區

  • 只改防火牆不改 bind-address:本地提權後仍可直連
  • 只改 bind-address 不改防火牆:內網橫向移動時可繞過
  • 使用 skip-networking:禁用 TCP 完全,導致本機 TCP 客戶端 (如 PHP PDO) 無法連線

最佳實踐總結

  1. **配置層**:bind-address=127.0.0.1 (或具體內網管理 IP)
  2. **網絡層**:安全組/防火牆僅放行應用服務器 IP 段
  3. **賬號層**:CREATE USER 'app'@'10.0.1.%' IDENTIFIED BY 'strong_pass'; 拒絕 % 主機
  4. **審計層**:啟用 log_connections、log_disconnections,異地登入告警

結語

「拒絕來自 Internet 的直連」是資料庫安全基線第一條。雙重綁定 (配置 + 防火牆) 成本極低、收益極高,應納入所有 MySQL 部署的標準化檢查清單。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved