Как веб-серверы узнают, используете ли вы прямой доступ по IP-адресу?


64

Некоторые веб-серверы при обращении с использованием своего IP-адреса выдают ошибку, что прямой доступ по IP-адресу не разрешен.

Некоторое время я задавался вопросом, как это работает. Я имею в виду, браузер не всегда разрешает IP-адрес и подключается к нему? Разве «Прямой доступ по IP-адресу» не пропускает DNS? Как удаленный сервер узнает, что вы пропустили DNS?


2
Насколько я помню, то , что он действительно просил, было добавлено в протокол http очень рано, чтобы обеспечить виртуальные серверы на одном реальном хосте.
JDługosz

3
Это в основном тот же процесс, который позволяет одному серверу различать разные виртуальные хосты. Настоящий сервер сопоставляет URL-адрес одному из своих виртуальных хостов. Многие серверы не имеют запасного варианта для не отображенного URL-адреса, как по дизайну, так и по умолчанию.
Маннго

Вы можете пропустить DNS, но избежать этой ошибки, если создаете запись в файле хостов для рассматриваемого доменного имени. Ваш браузер будет искать доменное имя и включит его в заголовок Host:, но DNS-запрос не будет выполнен из-за записи в файле hosts.
Монти Хардер

Ответ на такие вопросы обычно таков, потому что вы сказали им .
Томас

Ответы:


91

Чтобы ответить на ваш вопрос о том, как он знает , это связано с тем, что ваш браузер отправляет на сервер.

Вы правы, что система всегда разрешает его в IP-адрес, но браузер отправляет URL-адрес, к которому вы пытались получить доступ, в заголовке HTTP.

Вот пример заголовка, который я нашел в Интернете, изменив его так, чтобы он выглядел так, как будто вы использовали Firefox в Windows и набрал apple.comв адресной строке:

GET / HTTP/1.1
Host: apple.com
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.5) Gecko/20091102 Firefox/3.5.5 (.NET CLR 3.5.30729)
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache

Вот как будет выглядеть заголовок, если вы используете его IP-адрес:

GET / HTTP/1.1
Host: 17.142.160.59
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.5) Gecko/20091102 Firefox/3.5.5 (.NET CLR 3.5.30729)
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache

Оба они будут отправлены на один и тот же IP-адрес через сокет, но браузер сообщает серверу, к чему он обращался.

Почему? Потому что веб-серверы с одинаковым IP-адресом могут размещать несколько сайтов и давать разные страницы для каждого. Он не может различить, кому нужна какая страница по IP-адресу, потому что у них всех один и тот же, но он может различить их по заголовку HTTP.


7
Ааа, теперь гораздо больше смысла! Таким образом, в основном, браузер отправляет TO IP заголовок с IP-адресом или доменом, и сайт делает на это свое предположение. Так неужели эти ограничения легко обойти?
Джозеф А.

7
Дело не в том, что вы обходите ограничение, а в том, что вы не играете в мяч, и вы получите странные результаты.
iAdjunct

Эти HTTP-запросы вы получите, если используете прокси-сервер. Без прокси информация поступает в hostшапку. Смотрите этот пример .
0xFE

2
bytec0de: Другая часть этого заключается в том, что конфигурации веб-сервера часто устанавливаются на основе имени хоста. Пакет IP определяет IP-адрес, сегмент TCP - номер порта, а заголовок HTTP - имя хоста. Поэтому обычно серверы настроены так: «если клиент / браузер запрашивает example.com, тогда дайте им это». Их можно настроить так, чтобы они также отвечали на IP-адреса или подстановочные знаки (реагировали на что-либо), но многие люди просто копируют примеры, и многие ранее существующие примеры основаны на доменном имени, предоставленном браузером.
TOOGAM

14
@ bytec0de Это не ограничение . Это больше похоже на использование правильного номера телефона, но неправильного добавочного номера - вы позвонили в нужное здание, но не в нужное лицо. И причина его появления также почти такая же, как и у телефонов - он позволяет вам размещать несколько отдельных сайтов на одном IP-адресе (и TCP-порте). Например, на нашем сервере разработки одновременно размещались сотни отдельных веб-сайтов, и во многих решениях для веб-хостинга используется один и тот же подход («зарегистрируйте домен, укажите его на нашем IP-адресе, мы позаботимся обо всем остальном») ,
Луаан

21

С протоколом HTTP 1.1 (предыдущая версия HTTP 1.0 уже давно устарела, поэтому вряд ли будет использоваться какой-либо последней версией браузера), hostбыл добавлен заголовок. Для HTTP 1.1 это обязательная строка заголовка, которая должна быть выдана браузером . Доменное имя включено браузером в эту строку, например Host: example.com. Таким образом, веб-сервер знает, к какому веб-сайту браузер хочет получить доступ с этой линии. Поскольку веб-сервер может поддерживать десятки веб-сайтов, эта строка важна для него, чтобы определить, на каком веб-сайте находится запрошенная страница. Предположим, что браузер хочет получить доступ к домашней странице сайта на example.com, при подключении к серверу он выдает следующую строку:

GET / HTTP/1.1

В этой строке указывается, что браузер желает получить корневой документ, т. Е. «/» Для веб-сайта. Если вы хотите получить доступ /somedir/testpage.html, GET /somedir/testpage.htmlбудет в строке «получить». За строкой будет следовать строка ниже:

Host: example.com

Так что, если веб-сервер поддерживает сайты example.com, someothersite.com, Yetanothersite.org и т. Д., Он знает, что должен вернуть главную страницу для example.com. Если он не получает эту строку или не имеет доменного имени, указанного в Hostстроке, он не знает, какая домашняя страница сайта должна быть возвращена. Таким образом, он может вернуть сообщение об ошибке или вернуть домашнюю страницу сайта по умолчанию для сервера.

Вы можете выполнить те же команды, которые выдает браузер, используя протокол telnet , например, telnet example.com 80из командной строки Linux или из окна терминала Apple OS X , чтобы подключиться к стандартному HTTP-порту, порт 80 - шаги см. В разделе « Проверка доступа к веб-сайту с помощью PuTTY». сделать это с PuTTY в системе Windows.


3
Просто примечание: заголовок узла также использовался в HTTP 1.0, он просто не требовался . HTTP 1.1 сделал это поле обязательным. На практике многие серверы HTTP 1.0 просто не работали, если браузер не отправлял заголовок узла (по всем причинам, изложенным выше), поэтому большинство браузеров все равно отправили его.
Луаан

6

Это связано с Host:заголовком HTTP. Это очень полезно для размещения нескольких сайтов на одном IP-адресе. Например, http://www.k7dxs.net/ и http://www.philipgrimes.com/ находятся на одном IP-адресе. Однако из-за Host:заголовка они могут показывать два разных сайта.

Для HTTPS, как указал @Toothbrush, они используют индикацию имени сервера TLS, поскольку заголовок хоста является частью зашифрованного запроса, и сервер не знает, какой сертификат предложить без этого.

Забавный эксперимент: получите данные взлома для Firefox (я не смог найти аналога для Chrome) и начните подделку. Откройте http://slipstation.com/ и измените Host:заголовок в запросе на http://www.zombo.com/ . Вы увидите, возможно, знакомый сайт, где все возможно.


На самом деле, эти сайты используют указание имени сервера . Невозможно указать, какой сайт отображать, если оба сайта размещены на одном сервере по протоколу HTTPS без SNI, поскольку сервер не знает, какой сертификат использовать.
Зубная щетка

Ох, интересно. Мой эксперимент все еще будет работать?
Дункан Х Симпсон

Да, если вы найдете два сайта, которые размещены на одном IP-адресе через HTTP.
Зубная щетка

Но не HTTPS - это то, что я спрашивал.
Дункан Х Симпсон

Нет, это не должно работать через HTTPS. Если это так, существует уязвимость безопасности на веб-сервере.
Зубная щетка

5

Веб-сервер может быть настроен на прием только соединений с конкретным доменом или поддоменом. Это может быть хостинг нескольких доменов.

То, что делает веб-сервер при использовании прямого IP-адреса, настраивается. В случае Apache он по умолчанию перейдет к первому имени vhost из включенных сайтов, которые отсортированы в алфавитном порядке.

Это самая важная часть документации Apache, которую я нашел после быстрого поиска:

https://httpd.apache.org/docs/current/vhosts/name-based.html

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.