什么使 Cloudflare 能够禁用直接 IP 地址访问?

ale*_*985 9 domain-name-system ip

当我使用该网站的 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.
Run Code Online (Sandbox Code Playgroud)

我是一名学生。

  1. 什么允许 Cloudflare 阻止直接 IP 地址访问?
  2. DNS不是IP地址之上的一层吗?如果是,Cloudflare 是一项 DNS 服务,为什么 Cloudflare 具有阻止 IP 地址的能力?

jon*_*njo 21

cloudflare 设置没有什么特别之处。这只是 HTTP 的一个属性。

当客户端打开一个 URL 时,有三个重要的步骤:

  1. 如果需要,它会使用 DNS(或其他解析方法)将主机名转换为 IP 地址。如果 URL 指定了主机的 IP 地址,请使用该地址。
  2. 它通过众所周知的端口号连接到该 IP 地址,通常为 80(除非它在 ​​URL 中被覆盖)
  3. 它向服务器询问页面,包括所需的主机名

一个经典的例子是这样的:

GET /pub/WWW/TheProject.html HTTP/1.1
Host: www.w3.org
Run Code Online (Sandbox Code Playgroud)

考虑一个带有许多网站的大型主机。为简单起见,假设它有一个 IP 地址。数百个域名解析到这个地址。服务器如何决定传送哪些页面?它使用客户端在 HTTP 请求中提供的主机详细信息。如果你要求它没有或想要给你的东西,它会给你一个错误响应。

在您的情况下,请求包含主机说明符的 IP 地址。

GET /whatever HTTP/1.1
Host: a.b.c.d
Run Code Online (Sandbox Code Playgroud)

当主机由 IP 地址指定时,很多主机决定不发出页面。Cloudflare 在这里没有什么特别之处,也与 DNS 无关。它是关于服务器如何响应对 IP 地址指定的主机的请求,您可以看到此错误消息指定了A valid Host header must be supplied.

这是描述如何以这种方式配置服务器的答案:https : //serverfault.com/a/607222

您可以通过使用 telnet 连接到服务器并手动发出 HTTP 请求来轻松验证这种行为。

附注。相同的一般答案适用于 HTTP S请求,但在设置中使用服务器名称指示。值得注意的是,HostHTTP 1.1 (1997) 附带了它。在此之前,这里描述的机制不存在,服务器无法可靠地判断客户端是否要求合法解析为其 IP 地址的名称,或直接通过 IP 地址要求主机。由于这是网站爆炸式增长的重要发展,许多旧客户端更新为发送Host. [感谢评论者了解细节。]