当我使用该网站的 IP 地址访问具有 Cloudflare 的网站时,我收到此消息:
Error 1003
Direct IP access not allowed
What happened?
You've requested an IP address that is part of the Cloudflare network.
A valid Host header must be supplied to reach the desired website.
我是一名学生。
- 什么允许 Cloudflare 阻止直接 IP 地址访问?
- DNS 不是 IP 地址上的一层吗?如果是,那么 Cloudflare 作为 DNS 服务,为什么有能力阻止 IP 地址?
答案1
cloudflare 设置中没有什么特别的。这只是 HTTP 的一个属性。
当客户端打开一个URL时,有三个重要步骤:
- 如果需要,它会使用 DNS(或其他解析方法)将主机名转换为 IP 地址。如果 URL 指定了主机的 IP 地址,则使用该地址。
- 它通过一个众所周知的端口号(通常为 80)连接到该 IP 地址(除非在 URL 中被覆盖)
- 它向服务器请求页面,包括所需的主机名。
一个经典的例子如下:
GET /pub/WWW/TheProject.html HTTP/1.1
Host: www.w3.org
假设有一个大型主机,上面有许多网站。为简单起见,我们假设它只有一个 IP 地址。数百个域名解析到这个地址。服务器如何决定要传送哪些页面?它使用客户端在 HTTP 请求中提供的主机详细信息。如果您请求它没有或不想给您的东西,它会给您一个错误响应。
在您的情况下,请求包含主机说明符的 IP 地址。
GET /whatever HTTP/1.1
Host: a.b.c.d
很多主机商决定在主机由 IP 地址指定时不提供页面。这里 Cloudflare 没有什么特别之处,也与 DNS 无关。这关乎服务器如何响应由 IP 地址指定的主机的请求,您可以看到此错误消息指定了A valid Host header must be supplied
。
以下答案描述了如何以这种方式配置服务器:https://serverfault.com/a/607222
您可以使用 telnet 连接到服务器并手动发出 HTTP 请求来轻松验证此类行为。
PS. 同样的一般答案也适用于 HTTP年代请求,但使用服务器名称指示在设置中。值得注意的是,Host
HTTP 1.1(1997 年)引入了 。在此之前,这里描述的机制并不存在,服务器无法可靠地判断客户端是否请求了合法解析为其 IP 地址的名称,或者是否直接通过 IP 地址请求主机。由于这是网站爆炸式增长的重要发展,许多旧客户端都已更新为发送Host
。[感谢评论者对细节的关注。]
答案2
您尝试联系的系统在其 httpd 配置中列出了多个站点。
HTTP 服务器区分其托管的各个站点的唯一方法是使用直接 URL。
由于这些网站托管在 CloudFlare 的硬件上,因此它们可以提供任何所需的错误。CDN(内容分发网络)根据多种因素将连接转移到其网络上最近的缓存副本。
如果您查看 CloudFlare 提供的服务,您会发现在设置过程中,您将域的 DNS 记录重新指向其 DNS 服务器,然后仅使用其 CDN 系统。作为开发人员,如果您使用 CDN,您仍然知道您的实际主机位于何处,并且可以直接联系它们,而客户不再具有该访问权限。
这也有助于将您的主机与 DDoS 攻击隔离开来。除非您的整个基础设施都托管在 CDN 网络中,否则 CDN 仍会联系您的主机获取内容。