Назад | Перейти на главную страницу

Что позволяет Cloudflare отключать прямой доступ к IP-адресу?

Когда я посещаю веб-сайт с Cloudflare, используя IP-адрес веб-сайта, я получаю следующее сообщение:

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.

Я ученик.

  1. Что позволяет Cloudflare блокировать прямой доступ к IP-адресу?
  2. Разве DNS не является уровнем выше IP-адреса? Если да, то почему Cloudflare является службой DNS, почему у Cloudflare есть возможность блокировать IP-адреса?

В настройке 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

Рассмотрим большой хост с множеством веб-сайтов. Для простоты предположим, что у него один 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.S запрос, но с использованием Индикация имени сервера в настройке. Стоит отметить, что Host пришел с HTTP 1.1 (1997). До этого описанный здесь механизм не существовал, и у сервера не было возможности достоверно определить, запрашивал ли клиент имя, которое законно разрешается в его IP-адрес, или запрашивал ли хост напрямую по IP-адресу. Поскольку это было важным событием для взрывного роста веб-сайтов, многие старые клиенты были обновлены для отправки Host. [Спасибо комментаторам за подробности.]

Система, с которой вы пытаетесь связаться, имеет несколько сайтов, перечисленных в ее конфигурации httpd.

Единственный способ, которым HTTP-сервер может различать различные сайты, размещенные на нем, - это использовать прямые URL-адреса.

Поскольку эти сайты размещены на оборудовании CloudFlare, они могут выдавать любую ошибку по своему желанию. CDN (сети доставки контента) переключают подключение к ближайшей кэшированной копии в своей сети на основе нескольких факторов.

Если вы посмотрите, что CloudFlare предлагает в качестве услуги, вы увидите, что часть процесса настройки вы перенаправляете записи DNS своих доменов на их DNS-серверы, которые затем используют только их системы CDN. Если вы как разработчик используете CDN, вы по-прежнему знаете, где расположены ваши фактические хосты, и можете связываться с ними напрямую, клиенты больше не имеют такого доступа.

Это также помогает изолировать ваши хосты от DDos-атак. CDN по-прежнему обращается к вашему хосту за контентом, если вся ваша инфраструктура не размещена в сети CDN.