原始 IP 未传递到 AWS Elastic Beanstalk 上的单个容器 Docker 映像上的容器

Posted

技术标签:

【中文标题】原始 IP 未传递到 AWS Elastic Beanstalk 上的单个容器 Docker 映像上的容器【英文标题】:Original IP not passed to container on single container Docker image on AWS Elastic Beanstalk 【发布时间】:2018-01-03 19:58:11 【问题描述】:

我在 AWS Elastic Beanstalk 上的 Docker 容器内有一个 Node.js 服务器。我注意到,如果我尝试通过请求标头访问用户的 IP 地址,我不会得到用户的实际远程 IP 地址。相反,我得到了似乎是 Docker 容器的 IP 地址 - 172.19.0.1

我确信 Docker 或 Elastic Beanstalk 的配置方式很简单,我需要进行更改以获得所需的行为 - 但我不知道需要更改什么。

我的 Dockerfile 中有什么东西? 在我推送和部署我的容器之前,我的docker build 命令中的标志或其他内容? ELB 或 Elastic Beanstalk 中的 AWS 上的一些配置?

非常感谢一些关于从哪里开始的指示!

【问题讨论】:

您在哪个请求头中搜索了客户端 IP ? X-Forwarded-For ? 希望对您有所帮助(但我还没有尝试过):使用 Elastic Beanstalk,您可以配置负载均衡器并告诉他不要重写 X-Forwarded-For 字段:摘自 docs.aws.amazon.com/en_us/elasticbeanstalk/latest/dg/… :You can change the listener protocol from HTTP to TCP if you want the load balancer to forward requests as-is. This prevents the load balancer from rewriting headers (including X-Forwarded-For) and does not work with sticky sessions 我正在使用 Hapi,所以我正在尝试访问 request.info.remoteAddress 【参考方案1】:

Alexandre Fenyo 已经谈到了这一点,但如果您在负载均衡器后面,这可能是作为客户端 IP 传递给您的应用程序的内容。

你可以配置你的 nginx 来设置real_ip_header: X-Forwarded Forreal_ip_recursive: on。这意味着 nginx 将扫描您正在接收的 IP 列表并将客户端设置为第一个不受信任的 IP。您还需要传递可信 IP 列表,这应该是负载均衡器的 CIDR 块。

有更详细的描述和答案here

【讨论】:

【参考方案2】:

对于 Node.js 的 Hapi,请求标头不适用于 request.info,但 request.headers。使用 request.info 返回网络级别信息。您应该使用 request.headers[ 'X-Forwarded-For' ] 之类的东西来获取请求级别信息。尝试显示 request.headers 键值对以发现链接到包含您要查找的 IP 地址的值的键。

【讨论】:

这行得通,有点。 headers['x-forwarded-for'] 给了我一个字符串,它是以逗号分隔的 IP 地址列表,其中一个是正确的。有没有办法让Docker将该IP地址传递到request.info.remoteAddress下的容器中? 否,在将 Docker 与 AWS EBS(Elastic Beanstalk)一起使用时。 Docker 守护进程可以使用不同的方式来公开端口,具体取决于其版本和配置。它可以使用 iptables 规则为每个容器公开容器端口或子进程,充当 TCP 代理。 AWS EBS 使用的 Docker 版本及其配置 Docker 以公开端口的方式会更改 request.info.remoteAddress 中可用的信息,并且您无法更改 AWS EBS 行为。 酷,谢谢。仅供参考有这个问题的任何人 - 我认为是 nginx 或 Elastic Beanstalk 的其他部分负责这个问题,而不是 Docker。

以上是关于原始 IP 未传递到 AWS Elastic Beanstalk 上的单个容器 Docker 映像上的容器的主要内容,如果未能解决你的问题,请参考以下文章

AWS Elastic Beanstalk Docker 来自 ECR 错误“Dockerrun.aws.json 中未指定 Docker 映像”

AWS - 如何在不丢失实例和弹性 IP 的情况下暂停 Elastic Beanstalk 环境?

AWS Elastic Beanstalk 上的 Django 1.7 - 应用程序未运行,仅看到“索引 /”

AWS - Elastic BeansTalk:[错误] 'php' 未找到或无法统计

在 AWS 上使用 Elastic Beanstalk 的 Go Web 应用程序未在日志中显示输出

AWS Elastic Beanstalk - 使用 ECR 时,/root/.docker/config.json 未使用新凭证更新