【问题标题】:CloudFront - access Website by using CDN IP address instead of DNSCloudFront - 使用 CDN IP 地址而不是 DNS 访问网站
【发布时间】:2018-03-24 00:47:58
【问题描述】:

我在我的网站前配置了 CDN。当您通过我的自定义 DNS 或 CDN DNS 访问网站时,一切正常。我的问题是当我想使用 IP 而不是 DNS 时。

当我对我的 CDN DNS 名称执行 nslookup 时,我会得到一个 IP 列表。如果我从那里获取一个 IP 地址并尝试访问该网站,我会收到 403 Forbidden 请求。

为什么 CDN 只接受 DNS 请求而不接受 IP?

如果我的 CDN 前面有一个代理,并尝试使用代理 IP 访问我的网站,如何使用指向 CDN 的代理 IP 访问网站?

这是一个有线要求且耗时,我一直在寻找正确的答案。似乎没有人提出解决方案。

干杯!

【问题讨论】:

  • 同一个 CDN 服务于许多客户的网站,因此他们必须依赖主机名才能知道要服务哪些内容。此外,他们的基础设施非常动态,他们的 IP 地址会发生变化,这就是为什么他们总是要求您使用 CNAME/别名记录将您的 DNS 域名指向他们的(子)域之一,而不是固定的 IP 地址。

标签: amazon-web-services amazon-cloudfront cdn


【解决方案1】:

为什么 CDN 只接受 DNS 请求而不接受 IP?

CloudFront 并非旨在以这种方式工作。它是一个庞大的、全球分布的系统。当您查找 CloudFront 分配的 IP 地址时,您会收到 CloudFront 期望接收流量的地址列表:

  • 用于您的网站,并且

  • 可能有成百上千的其他网站,并且

  • 来自与您位于同一地理区域的浏览器

您需要一种方法来确定您希望 CloudFront 在处理您的请求时使用的哪个分发。

在 HTTP 模式下,它使用浏览器发送的 Host: HTTP 标头。在 HTTPS 模式下,这使用 TLS SNI 值和 Host: 标头。

如果您使用代理访问 CloudFront,则需要代理为 HTTP 注入 Host 标头,并为 HTTPS 正确设置 SNI。

例如,在 HAProxy 中,设置主机标头,覆盖任何已经存在的此类标头。

http-request set-header Host dzczcexample.cloudfront.net

当然,您也可以使用为您的分配配置的任一备用域名值。

对于 SNI:

backend my-cloudfront-backend
    server my-cloudfront dzczcexample.cloudfront.net:443 ssl verify none sni str(dzczcexample.cloudfront.net)

(来源:https://serverfault.com/a/830327/153161

但这只是最低基线工作配置,因为 CloudFront 具有这种简单设置忽略的功能。

如上所述,CloudFront 正在返回应用于访问 (1) 您的站点、(2) 从您所在的位置、(3) 立即访问的 IP 地址列表。地址列表可以而且会有所不同。 CloudFront 似乎能够通过修改 DNS 响应将流量从一组服务器移动到另一组服务器、从一个边缘位置移动到另一台服务器等,从而动态管理和分配其工作负载并缓解 DDoS……因此您的代理需要使用返回的多个地址,并且需要刷新其 DNS 值,以便它始终连接到 CloudFront 希望它连接的位置,以获得最佳行为和性能。

此外,不要忽视代理服务器将通过代理附近的边缘连接到 CloudFront 的事实,而不是靠近浏览器,因此这不是您在生产中经常使用的东西,尽管它绝对有一些有效的用例。 (对于某些应用程序,我已经在 CloudFront 的两侧使用 HAProxy 好几年了——其中一些现在已经被 Lambda@Edge 消除了,但我离题了)。

这是一个有线的 [奇怪?] 要求

不是真的。多年来,基于名称的虚拟主机一直是标准做法。在我看来,这几乎是历史上的意外,当您设置 Web 服务器时,它通常也会响应 Host 标头中的 IP 地址。一个配置良好的网络服务器不会这样做——如果你(网络浏览器)不知道你在请求什么主机并且只是向我的 IP 发送请求,那么我(网络服务器)应该告诉你我不知道您想从我这里得到什么,因为您很可能出于恶意原因或良性但令人讨厌的原因(扫描)或配置错误而到达。您也不希望搜索引擎蜘蛛在 IP 地址上找到您的内容。对列表不利,对 SEO 不利。

【讨论】:

    【解决方案2】:

    这个代理的问题是我无法配置标头。我正在考虑添加另一个我可以控制的代理,然后用我想要的值修改标题。但这并不是一个很好的解决方案,就像从一个代理跳到另一个代理一样。

    我认为我应该更多地依赖 DNS 和主机名,而不是 IP。这对我来说很好,我更喜欢使用正确的 DNS 名称。

    感谢您的详尽解释,您澄清了很多事情。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-14
      • 1970-01-01
      • 2015-01-01
      • 2013-01-30
      • 2015-03-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多