原始IP未传递到单个容器上的容器AWS上的Docker镜像Elastic Beanstalk
我在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上的一些配置?
会真的很感谢从哪里开始!
使用Hapi for Node.js,请求标头不适用于request.info
,但request.headers
。使用request.info
将返回网络级别信息。您应该使用类似request.headers[ 'X-Forwarded-For' ]
的东西来获取请求级别信息。尝试显示request.headers
键值对,以发现链接到包含要查找的IP地址的值的密钥。
这个工程的工作种类, 。 'headers ['x-forwarded-for']'给了我一个字符串,它是一个以逗号分隔的ip地址列表,其中一个是正确的。有没有办法让Docker在'request.info.remoteAddress'下将这个IP地址传递给容器? – otajor
不,在Docker中使用AWS EBS(Elastic Beanstalk)。 Docker守护进程可以使用不同的方式来公开端口,具体取决于它的版本和配置。它可以使用iptables规则为每个容器提供充当TCP代理的容器端口或子进程。 AWS EBS使用的Docker版本以及配置Docker公开端口的方式会更改'request.info.remoteAddress'中的可用信息,并且您无法更改AWS EBS行为。 –
很酷,谢谢。提供此问题的任何其他人 - 我认为它是nginx或Elastic Beanstalk的其他部分负责此操作,而不是Docker。 – otajor
Alexandre Fenyo已经提到过这个问题,但如果你在负载均衡器后面,这可能是作为客户端IP传递给你的应用的东西。
您可以配置您的nginx设置real_ip_header: X-Forwarded For
和real_ip_recursive: on
。这意味着nginx会扫描您收到的IP列表,并将客户端设置为第一个不可信的IP。您还需要传递一个可信IP列表,它应该是负载均衡器的CIDR块。
有更详细的描述和答案here
哪个请求头你搜索的客户端IP? 'X-Forwarded-For'? –
可以帮助您(但我还没有尝试过):使用Elastic Beanstalk,您可以配置负载平衡器并告诉他不要重写X-Forwarded-For字段:摘自http://docs.aws.amazon。 com/en_us/elasticbeanstalk/latest/dg/using-features.managing.elb.html:'如果希望负载平衡器按原样转发请求,则可以将侦听器协议从HTTP更改为TCP。这样可以防止改写头文件(包括X - 转发,对于)负载平衡器和不粘性sessions' –
我使用哈皮所以我试图访问'request.info.remoteAddress' – otajor