小弟最近要接手管理 APIM 了,會把踩的點記錄下來。


在管理 Kong API Gateway 的過程中,發現在啟用 IP Restriction Plugin 並設置白名單後,該 consumer 仍然驗證失敗。經確認此情況與 IP 置換有關。

該 consumer request 路徑為:

Client → Load Balancer → Kong API Gateway → Backend Service

在這樣的架構中,Kong 接收到的 IP 並不是實際的 Client IP,而是來自 Load Balancer 的內部 IP。

經確認:

  • Kong 接收到的 client_ip 顯示為內部網段 IP(例如:以 .254 結尾)。
  • 這些 IP 實際上是 Load Balancer 的 IP。
  • 導致 IP Restriction Plugin 誤判來源 IP,合法用戶被錯誤拒絕。

Nginx 真實 IP 辨識機制

Kong 是建構在 Nginx 之上,利用 Nginxngx_http_realip_module 模組來從 HTTP Header 中擷取真正的 Client IP,並改寫 $remote_addr

常見的 HTTP Header:

Header 名稱說明
X-Real-IP包含直接與第一層代理連線的 Client IP
X-Forwarded-For包含完整轉發鏈,列出每一層代理經過的 IP(逗號分隔)

Kong 設定參數說明:

參數名稱說明
trusted_ips定義哪些 IP 被視為可信任的代理;只有來自這些 IP 的 Header 才會被信任
real_ip_header指定從哪個 Header 擷取真實 IP,預設為 X-Real-IP
real_ip_recursive啟用後會從轉發鏈中遞迴取得最早的(最靠近 Client 的)IP

解決方式

  • 修改 Kong 設定檔

編輯 /etc/kong/kong.conf,加入以下設定:

# 信任 Load Balancer 的 IP
trusted_ips = YOUR_LOAD_BALANCER_IP

# 從 X-Forwarded-For Header 取得真實 IP
real_ip_header = X-Forwarded-For

# 啟用遞迴搜尋
real_ip_recursive = on
  • 重新啟動 Kong
kong reload

Kong 重啟後會重新載入這些設定,透過 ngx_http_realip_module 將 $remote_addr 改寫為真實的 Client IP。此時 IP Restriction Plugin 將能正確依據實際來源 IP 進行存取控制。