CloudFront - 使用 CDN IP 地址而不是 DNS 访问网站



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

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

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

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

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

干杯!

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

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

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

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

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

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

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

最新更新