如何使 ELB 将协议传递给 node.js 进程(Elastic Beanstalk)

Posted

技术标签:

【中文标题】如何使 ELB 将协议传递给 node.js 进程(Elastic Beanstalk)【英文标题】:How to make ELB pass protocol to node.js process (Elastic Beanstalk) 【发布时间】:2016-11-30 22:06:54 【问题描述】:

我有 ELB 平衡到我的 Node.js 进程的 TCP 流量。当 ELB 平衡 TCP 连接时,它不会像处理 http 连接那样发送 X-Forwarded-Proto 标头。但我仍然需要知道连接是否使用 SSL/TLS,以便如果它不是安全连接,我可以从我的 Node 进程重定向响应。

有没有办法让ELB在平衡TCP连接时发送这个头?

谢谢

【问题讨论】:

对于遇到此问题的其他人。我在这里找到了一个非常简单的解决方案:***.com/a/33530080/949845 【参考方案1】:

您可以为您的 ELB 配置代理协议以获取连接相关信息。在 HTTP 的情况下,ELB 添加有关客户端信息的标头,但是在 TCP 的情况下,AWS ELB 只是简单地通过来自客户端的标头而不进行任何修改,这会导致后端服务器丢失客户端连接信息,因为它发生在你的情况。

要为您的 ELB 启用代理控制,您必须通过 API 来实现,目前无法通过 UI 来实现。

http://docs.aws.amazon.com/ElasticLoadBalancing/latest/DeveloperGuide/enable-proxy-protocol.html

上述文档是有关如何执行此操作的分步指南,我不想在此处粘贴相同的内容,因为该信息可能会随着时间而改变。

编辑:

事实证明,亚马逊只实施了代理协议的版本 1,它不会泄露 SSL 信息。但是,它确实提供了客户端请求的端口号,并且可以开发一个进程,说明如果请求是通过端口 443,那么它是 SSL。我不喜欢它,因为它是间接的,需要在 devops 和开发人员之间进行硬编码和协调......似乎是目前唯一的方法......希望 AWS ELB 开始支持具有 SSL 信息的代理协议的第 2 版很快。

【讨论】:

从我一直在阅读的内容来看,代理协议转发客户端连接的 ip/port。你是说它会发送更多,让我看看连接是否使用 SSL/TLS?代理协议到底发送了什么?非常感谢您的帮助。 “协议”部分应该告诉你,说实话我自己没有尝试过。 据我了解,代理协议标头看起来有点像 PROXY TCP4 198.51.100.22 203.0.113.7 35646 80\r\n 会不会像 SSL4 instad 或 TCP4 那样通过 IPv4 进行安全 TCP 连接? 我在代理协议方面的经验仅限于 HAProxy,但当我刚刚阅读他们的文档时,他们实现的版本略有不同......所以您可能无法通过启用获得 SSL 相关信息代理如上所述,但是您将获得负载均衡器的请求端口号,这不是最佳解决方案,但您可以开发一个流程,您可以在其中知道客户端是否请求端口号 443,它正在使用 SSL。如果您尝试此操作,请务必更新您使用 SSL 获得的标头,而无需将来了解 嘿,你最后做了什么?你能在这里更新你的发现吗?

以上是关于如何使 ELB 将协议传递给 node.js 进程(Elastic Beanstalk)的主要内容,如果未能解决你的问题,请参考以下文章

如何在 node.js 子进程模块中将消息和标准输出从子进程传递给父进程?

如何将活动WebSocket传递给Node.js中的集群线程?

如何将信息从 node.js 传递到 html

Node.js:如何将向量传递给函数?

Node.JS:如何将变量传递给异步回调? [复制]

Node.js如何将数组索引传递给异步函数