目标是在简单堆栈中包含HTTP/2支持:部署在多个EC2实例中的web应用+启用PROXY协议策略的传输级CLB(SSL :443➝TCP:80),以卸载SSL/TLS并平衡传入的HTTPS流量。 (1)地理定位逻辑的执行;(2)地理定位逻辑的执行;(2) (2)执行简单的访问控制规则;和(3)记录。所有这些功能都需要访问可靠的(即不可微不足道的)客户端IP地址。 AWS中PROXY协议的唯一替代方案是切换到应用程序级平衡并使用XFF标头提取客户端的远程IP地址。然而,这是不可接受的:任何人都可以简单地改变其IP地址,只需在传入的HTTPS请求中注入假XFF头。 AFAIK,AWS CLBs/ELBs不会注入包含客户端远程IP的标头(例如类似the True-Client-IP header in Akamai的东西)。AWS CLB/ELB + HTTP/2支持
因此,如何将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不会被公布。
其他选项将由一个ELB(HTTPS➝HTTP)被替换CLB。 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方法?
关于XFF欺骗部分:您对此绝对正确,您的解释对于应用程序级CLB也是如此。这意味着我的问题中的PROXY协议要求并不重要(尽管我仍然喜欢传输级负载平衡的想法)。 –
关于H2部分:我知道ELB在使用H2时的好处和 - 现在我知道XFF不能被欺骗 - 我同意ELBs是为了添加H2支持而保持SSL/TLS在LB中卸载的方式。就个人而言,我宁愿在传输级别的LB中进行SSL/TLS卸载,让未加密的H2到达EC2实例,但恐怕这个选项根本不存在。 –