萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> MySQL 教學

MongoDB bindIp 綁定多 IP 失敗(errno 99)正確解決姿勢

問題現場

原配置 bind_ip=127.0.0.1,為開放遠端存取改為:

bind_ip=127.0.0.1,10.20.12.33

重啟 mongod 立即報錯:

ERROR: listen(): bind() failed errno:99 Cannot assign requested address for socket: 10.20.12.33:27017

根本原因

bind_ip 只能綁定「本機網卡實際擁有」的 IP 位址。 10.20.12.33 屬於其他主機,本機無此網卡 IP,核心 bind() 系統呼叫直接失敗(EADDRNOTAVAIL = 99)。

正確架構:綁定 0.0.0.0 + 防火牆存取控制

步驟 1:MongoDB 監聽所有介面

# /etc/mongod.conf
net:
  bindIp: 0.0.0.0   # 監聽所有 IPv4 介面
  port: 27017

步驟 2:iptables 精準放行

# 1. 預設拒絕所有來源存取 27017
iptables -I INPUT -p tcp --dport 27017 -j DROP

# 2. 允許特定信任 IP(例如 10.20.12.33)
iptables -I INPUT -s 10.20.12.33 -p tcp --dport 27017 -j ACCEPT

# 3. 允許本機回環
iptables -I INPUT -s 127.0.0.1 -p tcp --dport 27017 -j ACCEPT

# 4. 持久化(CentOS 7)
service iptables save
# 或 Ubuntu
iptables-save > /etc/iptables/rules.v4

為什麼不直接用 bind_ip 限制?

  • bind_ip 是「綁定本地介面」,非「存取控制清單(ACL)」。
  • 若伺服器有多張網卡(內網/外網/管理網),只需綁定需服務的介面 IP(如內網 IP),再配合防火牆雙重保險。
  • 雲端環境(AWS/Aliyun)建議:bind_ip=0.0.0.0 + Security Group / 防火牆 只放行應用伺服器 IP 段。

驗證連通性

# 本機
mongo --host 127.0.0.1 --port 27017

# 遠端信任主機
mongo --host 10.20.12.33 --port 27017

# 非信任主機(應連線超時或被拒絕)
mongo --host 10.20.12.99 --port 27017

補充:MongoDB 3.6+ bindIp 支援主機名與逗號分隔多本機 IP

但仍限於本機介面 IP,無法綁定遠端 IP,核心邏輯不變。

copyright © 萬盛學電腦網 all rights reserved