我在我的网站前配置了CDN。当您通过我的自定义DNS或CDN DNS访问网站时,一切正常。我的问题是当我想使用IP而不是DNS时。
当我在我的CDN DNS名称上执行nslookup时,我会得到一份IP列表。如果我从那里获取一个IP地址并尝试访问该网站,我会收到403 Forbidden请求。
为什么CDN只接受DNS请求而不接受IP?
如果我在CDN前面有代理并尝试使用代理IP访问我的网站怎么办?如何使用指向CDN的代理IP访问网站?
这是有线要求和耗时,我一直在寻找正确的答案。似乎没有人表现出解决方案。
干杯!
答案 0 :(得分:2)
为什么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)。地址列表可以并且会有所不同。通过修改DNS响应,CloudFront似乎能够动态管理和分配其工作负载并缓解DDoS,方法是将流量从一组服务器移动到另一组服务器,从一个边缘位置移动到另一个边缘位置......所以您的代理需要是使用返回的多个地址,并且需要刷新其DNS值,以便它始终连接到CloudFront希望连接的位置,以获得最佳行为和性能。
此外,不要忽视代理服务器将通过代理附近的边缘而不是浏览器附近的边缘连接到CloudFront的事实,因此这不是您经常在生产中使用的东西,尽管它绝对有一些有效的用例。 (我已经在CloudFront的两侧使用了HAProxy几年,对于某些应用程序 - 其中一些现在已经被Lambda @ Edge所避免,但我离题了。)
有线[怪异?]要求
不是真的。基于名称的虚拟主机多年来一直是标准做法。在我看来,这几乎是历史事故,当您设置Web服务器时,它通常会响应Host
标头中的IP地址。配置良好的Web服务器不会这样做 - 如果您(Web浏览器)不知道您要求的主机并且只是向我的IP发送请求,那么我(Web服务器)应该告诉你我不知道你对我有什么要求,因为你更有可能是出于恶意原因,或者是善意但令人讨厌的原因(扫描),或者由于配置错误而到达。您也不希望搜索引擎蜘蛛在IP地址中查找您的内容。列表不好,对SEO不好。
答案 1 :(得分:0)
我对此代理的问题是我无法配置标头。我想添加另一个我控制的代理,然后用我想要的值修改标题。但这不是一个很好的解决方案,就像从一个代理跳到另一个代理。
我认为我应该更多地依赖DNS和主机名,而不是IP。哪个对我好,我更喜欢使用正确的DNS名称。
感谢您的详尽解释,您澄清了很多事情。