Nginx set_real_ip_from AWS ELB 負載平衡器位址

Nginx set_real_ip_from AWS ELB 負載平衡器位址

我在 Amazon ELB 負載平衡器後面有一組 Nginx 伺服器。我正在使用 set_real_ip (來自HttpRealIp模組)這樣我就可以存取這些伺服器上的原始客戶端 IP 位址(用於傳遞到 php-fpm 並在HttpGeoIP模組)。

看來set_real_ip_from在nginx配置中只能接受一個I​​P位址。然而,關於 ELB 機器,亞馬遜表示:

注意:由於與 LoadBalancer 關聯的 IP 位址集可能會隨時間而變化,因此您永遠不應該建立具有任何特定 IP 位址的「A」記錄。如果您想要為 LoadBalancer 使用友善的 DNS 名稱,而不是由 Elastic Load Balancing 服務產生的名稱,您應該為 LoadBalancer DNS 名稱建立 CNAME 記錄,或使用 Amazon Route 53 建立託管區域。有關更多信息,請參閱將域名與 Elastic Load Balancing 結合使用

但如果我需要輸入 IP 位址,我就無法使用 CNAME(無論是亞馬遜的還是我自己的)。這個問題有解決方法嗎?

答案1

如果你能保證所有請求都來自ELB(我不熟悉),你可以試試:

real_ip_header X-Forwarded-For;
set_real_ip_from 0.0.0.0/0;

這應該告訴 nginx 信任來自任何人的 X-Forwarded-For 標頭。缺點是,如果有人直接存取您的伺服器,他們將能夠欺騙 X-Forwarded-For 標頭,並且 nginx 將使用錯誤的客戶端 IP 位址。

答案2

今天的最佳實踐是使用 VPC,因此,您將知道 ELB 的確切 CIDR。然後,您可以將以下內容新增至您的 Nginx 設定檔:

real_ip_header X-Forwarded-For;
set_real_ip_from 10.0.0.0/8;

答案3

使用 VPC CIDRset_real_ip_from您可以在 Amazon 控制台中的 VPC => 您的 VPC 下找到它(替換<your VPC CIDR here>為它):

real_ip_header X-Forwarded-For;
set_real_ip_from <your VPC CIDR here>;

答案4

在 Amazon ELB 上將可信任範圍設為 0.0.0.0/0 肯定會給您帶來麻煩。如果你能為你的nginx伺服器設定安全群組,就可以保證請求來自ELB,但是原來的請求將源自任何可能的來源(Amazon ELB 是公共介面)。

一個簡單的測試將揭示這一點:

curl --header "X-Forwarded-For: 1.2.3.4" "http://your-elb-dns-address/"

然後,您的 nginx 伺服器上的日誌將顯示 1.2.3.4 作為真實 IP,這是一個欺騙 IP。看Amazon ELB 的內部私有 IP 的 IP 範圍以獲得更好的答案。

相關內容