1

我在AWS Elastic Beanstalk上的Docker容器中有一個Node.js服務器。我注意到,如果我嘗試通過請求標頭訪問用戶的IP地址,我沒有得到用戶的實際遠程IP地址。相反,我得到的似乎是Docker容器的IP地址 - 172.19.0.1原始IP未傳遞到單個容器上的容器AWS上的Docker鏡像Elastic Beanstalk

我確信Docker或Elastic Beanstalk的配置方式很簡單,我需要更改以獲取所需的行爲 - 但我不知道需要更改哪些內容。

我的Dockerfile中有東西嗎? 在我推&部署我的容器之前,我的docker build命令中有一個標誌或東西? ELB或Elastic Beanstalk上的AWS上的一些配置?

會真的很感謝從哪裏開始!

+0

哪個請求頭你搜索的客戶端IP? 'X-Forwarded-For'? –

+0

可以幫助您(但我還沒有嘗試過):使用Elastic Beanstalk,您可以配置負載平衡器並告訴他不要重寫X-Forwarded-For字段:摘自http://docs.aws.amazon。 com/en_us/elasticbeanstalk/latest/dg/using-features.managing.elb.html:'如果希望負載平衡器按原樣轉發請求,則可以將偵聽器協議從HTTP更改爲TCP。這樣可以防止改寫頭文件(包括X - 轉發,對於)負載平衡器和不粘性sessions' –

+0

我使用哈皮所以我試圖訪問'request.info.remoteAddress' – otajor

回答

2

使用Hapi for Node.js,請求標頭不適用於request.info,但request.headers。使用request.info將返回網絡級別信息。您應該使用類似request.headers[ 'X-Forwarded-For' ]的東西來獲取請求級別信息。嘗試顯示request.headers鍵值對,以發現鏈接到包含要查找的IP地址的值的密鑰。

+0

這個工程的工作種類, 。 'headers ['x-forwarded-for']'給了我一個字符串,它是一個以逗號分隔的ip地址列表,其中一個是正確的。有沒有辦法讓Docker在'request.info.remoteAddress'下將這個IP地址傳遞給容器? – otajor

+0

不,在Docker中使用AWS EBS(Elastic Beanstalk)。 Docker守護進程可以使用不同的方式來公開端口,具體取決於它的版本和配置。它可以使用iptables規則爲每個容器提供充當TCP代理的容器端口或子進程。 AWS EBS使用的Docker版本以及配置Docker公開端口的方式會更改'request.info.remoteAddress'中的可用信息,並且您無法更改AWS EBS行爲。 –

+0

很酷,謝謝。提供此問題的任何其他人 - 我認爲它是nginx或Elastic Beanstalk的其他部分負責此操作,而不是Docker。 – otajor

1

Alexandre Fenyo已經提到過這個問題,但如果你在負載均衡器後面,這可能是作爲客戶端IP傳遞給你的應用的東西。

您可以配置您的nginx設置real_ip_header: X-Forwarded Forreal_ip_recursive: on。這意味着nginx會掃描您收到的IP列表,並將客戶端設置爲第一個不可信的IP。您還需要傳遞一個可信IP列表,它應該是負載均衡器的CIDR塊。

有更詳細的描述和答案here

相關問題