【发布时间】:2017-08-11 17:37:54
【问题描述】:
目标是在一个简单的堆栈中包含 HTTP/2 支持:部署在多个 EC2 实例中的 Web 应用 + 启用 PROXY 协议策略的传输级 CLB (SSL:443 ➝ TCP:80) 以卸载 SSL/TLS 并平衡传入的 HTTPS 流量。
PROXY 协议的几个原因:(1)地理定位逻辑的执行; (2) 执行简单的访问控制规则; (3) 日志记录。所有这些功能都需要访问可靠(即不易伪造)的客户端 IP 地址。 AWS 中 PROXY 协议的唯一替代方案是切换到应用程序级平衡并使用 XFF 标头提取客户端的远程 IP 地址。但是这是不可接受的:任何人都可以简单地更改其 IP 地址,只需在传入的 HTTPS 请求中注入一个虚假的 XFF 标头。 AFAIK,AWS CLB/ELB 不会注入包含客户端远程 IP 的标头(例如 the True-Client-IP header in Akamai 之类的东西)。
因此,如何将 H2 支持添加到堆栈中?经过一些研究,所有可能的选择看起来都不令人满意:
当前架构无效,因为 SSL/TLS 在 CLB 中终止,但 CLB 没有为 announce H2 support through ALPN 提供任何选项。
-
使用 CLB 的替代方法是停止使用 SSL/TLS 卸载功能并将其移至 EC2 实例(即 TCP:443 ➝ TCP:443)。这样,可以在 SSL/TLS 握手期间宣布 H2 支持,但此选项需要升级 EC2 实例以支持额外的 SSL/TSL 工作负载。类似的选择:
- TCP:443 ➝ SSL:443:类似于 TCP:443 ➝ TCP:443,但允许使用可信赖的公钥证书列表进行后端身份验证。
- SSL:443 ➝ SSL:443:类似于 TCP:443 ➝ SSL:443 的端到端加密。不是一个真正的选项:(1)PROXY 协议是not supported for this combination(并且使用 XFF 也不是一个选项,因为这是传输级平衡); (2) 客户端 SSL/TLS 握手在 CLB 中执行,因此不会公布 H2。
其他选项是将 CLB 替换为 ELB (HTTPS ➝ HTTP)。 ELB 支持 H2。但是(1)我们需要依靠 XFF 来提取客户端 IP 地址(已经解释了为什么这是一个问题); (2) ELB 和 EC2 实例之间的流量是 H1(我们想让未加密的 H2 流量到达 EC2 实例)。换句话说,这不是一个选项。
总而言之,所有选项都有问题。恕我直言,理想的解决方案是保留原始 CLB(SSL:443 ➝ TCP:80;平衡 + SSL/TLS 卸载 + PROXY 协议)并允许在 CLB 中启用策略以通过 ALPN 宣布 H2 支持。但是,恐怕这在 AWS 中是不可能的。 CLB TCP:443 ➝ TCP:443 方法的任何替代方案?
【问题讨论】:
标签: amazon-web-services amazon-ec2 amazon-elb http2