Можете ли вы зайти на сайт, введя IP-адрес в адресную строку?

Поскольку я изучаю сети, DNS-серверы и многое другое... Мне любопытно, можете ли вы перейти на веб-сайт, введя IP-адрес в адресную строку?

11 ответов

TL;DR Это зависит от конфигурации сервера. Быстрый положительный пример — one.one.one.one/1.1.1.1.

Я предполагаю, что вы читаете обычную лекцию курса «Компьютерные сети» о том, как работает посещение веб-сайта, в которой изложена следующая процедура:

  1. Вы входите в адресную строку браузера и нажимаете Enter.
  2. Браузер ищет DNS и получает свои IP-адреса.
  3. Браузер устанавливает TCP-соединение с одним из изученных IP-адресов. Поскольку вы не указали порт, браузер будет использовать порт по умолчанию для протокола HTTP (80).
  4. Браузер отправляет HTTP-запрос на сервер.
  5. Браузер получает HTTP-ответ и отображает веб-страницу.

Могут быть и другие факторы, влияющие на определенные детали описанного выше процесса, но давайте пока оставим их в стороне.


Доменное имя фактически используется в процессе дважды : один для поиска DNS, а другой внутри HTTP-запроса на шаге 3. HTTP — один из немногих протоколов, по которым имя посещающего домена отправляется на сервер. В приведенном выше примере, как минимум, это то, что браузер отправляет на сервер IANA (на котором размещены файлы ):

      GET / HTTP/1.0
Host: www.example.com

Если вы заходите на него через пустой IP-адрес (при условии, что это 192.0.2.1), ваш браузер вместо этого отправит это через поток TCP:

      GET / HTTP/1.0
Host: 192.0.2.1

Большинство распространенных HTTP-серверов (Nginx, Apache, IIS и т. д.) имеют концепцию под названием «Виртуальный сервер», которая выбирает конфигурацию на основе имени домена (HTTP-заголовка). Это та часть, где находится ответ: это зависит от сервера. Некоторые серверы могут возвращать один и тот же сайт по пустому IP-адресу.Hostзаголовок, а некоторые — нет. Все серверы ведут себя так, как их настроили администраторы.

Для Nginx вы можете добавить IP-адрес сервера вserver_nameв том же блоке, что и имя домена, иначе запрос будет перенаправлен на адрес по умолчанию.serverблок (тот, у которогоdefault_serverили первый, если ни один из них не имеет `default_server). Я не знаком ни с Apache, ни с IIS, но у них наверняка есть похожие настройки.


Более подробная информация о факторах, которые могут повлиять на пример процесса:

  • Прежде чем браузер выполнит запрос DNS, он сначала нормализует то, что он получил из адресной строки. Таким образом, фактический URL-адрес , который будет использоваться на последующих этапах, должен бытьhttp://www.example.com/, с добавленной схемой () и минимальным путем (/).
  • В зависимости от сетевого окружения и настроек системы браузер может запрашиватьwww.example.comдважды для записей A и AAAA, что соответствует адресам IPv4 и IPv6. Однако это не влияет на последующие шаги.
    • Очевидно, что если вы введете URL-адрес с голым IP-адресом, DNS не будет задействован.
  • Браузер может выбрать использование HTTPS по нескольким причинам:
    • Если вы введете в адресную строку весь URL-адрес, и он начинается с .
    • В домене настроен HSTS или, что еще лучше, в браузер. (Попробуйте посетить предварительно загруженhstspreload.org через открытый текст HTTP, и если вам это удастся, отправьте отчет об ошибке для вашего браузера.)
    • Конкретный URL-адрес был посещен ранее, и было выполнено перенаправление HTTP 301 сhttp://to кэшируется браузером.
    • Браузер настроен на «Всегда использовать HTTPS».
  • Если браузер решит использовать HTTPS вместо открытого текста HTTP, применяются еще несколько изменений:
    • Нормализованный URL-адрес начинается сhttps://.
    • Порт по умолчанию теперь 443, стандартный порт для HTTPS.
    • TLS включен, что добавляет еще одну точку, в которой используется имя домена, в исходном пакете ClientHello с расширением указания имени сервера . Это позволяет серверу выбрать правильный сертификат перед тем, как что-либо будет зашифровано.
    • Могут использоваться HTTP/2 и HTTP/3, что меняет способ сериализации HTTP-запроса внутри уровня TLS . Общая идея остается неизменной, так как запрос по-прежнему содержит стандартныйhostзаголовок, при этом строка запроса заменена новым набором псевдозаголовков (:method,:path,:schemeи:authority).
    • Если используется HTTP/3, соединение больше не выполняется по TCP, а вместо этого используется UDP. Это новый транспортный протокол QUIC .

Стек IP на самом деле не «знает» и не «заботится» об IP. Все, что делает DNS, — это сообщает вам: «Это доменное имя находится на этом IP».

В «простом» смысле нет никакой разницы между любым сценарием — только то, что вы полагаетесь на DNS для разрешения IP, а не на свою собственную память (есть и другие механизмы — файлы хостов по сути «статичны», для каждой машины есть записи доменного имени), поскольку что касается протокола IP.

Однако, если мы говорим о веб-страницах, запрос вашего веб-браузера будет включать в себя такие вещи, как имя хоста, с которым он хочет связаться. Даже если IP-адрес сервера и два веб-домена, указывающие на этот сервер, a.example.com и b.example.com, являются одним и тем же веб-сайтом, вы можете получить разные веб-страницы в зависимости от того, как настроен сервер.

С HTTP. Таким образом, вы можете попасть на веб -сайт (или сообщение об ошибке), но не тот, который вам потенциально нужен — IP-адрес может указывать на страницу по умолчанию или просто на целевую страницу или страницу с ошибкой.

HTTPS привязан к домену, поэтому вы можете получить ошибку, которую можно игнорировать (или ошибку, которую нельзя игнорировать).

По сути, это зависит от того, как настроен веб-сервер.

Назовите меня сумасшедшим, но ни один из текущих ответов не содержит слова «заголовок», которое является наиболее важной частью веб-сервера, такого как Apache, Nginx и т. д., для определения правильного сайта. Заголовок хоста — это то, что позволяет вам обслуживать несколько сайтов по одному IP-адресу. Например, nginx сопоставит его с тем, что настроено вserver_name. Если вы хотите обслуживать сайт без домена (только IP), он будет соответствовать серверу, отмеченному значкомdefault_server.

Чтобы расширить ответ Journeyman Geek, чтобы веб-серверы обрабатывали несколько веб-сайтов, они различают их, используя комбинацию IP-адреса, веб-адреса (например, www.example.com) и номера порта.

Каждый веб-сайт должен иметь уникальную комбинацию этих трех. Наиболее распространенный сценарий — каждый из них имеет одинаковый IP-адрес и порт, но разные хост-/веб-адреса, но ничто не мешает администратору использовать любую другую комбинацию. Кроме того, на каждом веб-сайте можно настроить несколько таких трио, поэтому он будет реагировать более чем на один.

Одна из возможных комбинаций включает в себя наличие IP-адреса и порта, но отсутствие хост-/веб-адреса. В этом случае вы, очевидно, можете иметь только один веб-сайт на сервере, использующий эту комбинацию IP-адреса и порта, который будет отвечать без хоста/веб-адреса, поскольку он должен быть уникальный. Итак, если это было настроено администратором этого веб-сервера, тогда да, вы можете получить доступ к веб-сайту только по IP (хотя, как уже отмечалось, только с использованием HTTP, а не HTTPS), но в наши дни за пределами страниц хранения по умолчанию вы редко можете увидеть веб-сайт настроен таким образом. Но если вы администрируете свой собственный веб-сервер, вы вполне можете настроить его для этого.

Как было задано, в частности, КОНЕЧНЫЙ ПОЛЬЗОВАТЕЛЬ вводит IP-адрес в адресную строку браузера:

  • HTTP: Да — вы получите страницу, если настроен сайт по умолчанию.
  • HTTPS: ошибка сертификата.

Если конечный пользователь вводит IP-адрес, заголовком хоста будет IP-адрес, а не конкретный домен, поэтому в лучшем случае HTTPS-сервер может обслуживать ответ, используя тот сертификат, который используется по умолчанию (для этой пары IP/порт), однако браузер не имеет возможности проверить сертификат, поэтому по умолчанию он выдает ошибку сертификата.

Если пользователь достаточно сообразителен, чтобы просмотреть ошибку сертификата, он, скорее всего, получит тот сайт, который используется на сервере по умолчанию (для этой пары IP/порт).

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

Посещение страницы по URL

Предположим, вы вводите «https://www.somesite.com/my/cool/page» в адресную строку браузера и нажимаете Enter.

Ваш браузер преобразует «www.somesite.com» в IP-адрес, например 1.2.3.4.

Браузер знает, что порт по умолчанию для протокола https — 443.

Затем он установит TCP/TLS-соединение с этим IP-адресом через порт 443 и отправит HTTP-запрос — на самом деле просто кусок текста:

      GET /my/cool/page HTTP/1.1
User-Agent: Firefox(or whatever you're using)
Host: www.somesite.com
Accept: */*

Пустые строки используются в качестве разделителей в протоколе HTTP (это СТАРЫЙ протокол), чтобы сервер знал, когда клиент завершил выполнение запроса. Сервер проанализирует этот фрагмент текста, чтобы найти всю информацию, и на основе этого решит, как реагировать. В этом случае он ответит HTML-кодом моей крутой страницы.

Посещение Страницы по IP

Однако предположим, что вместо этого вы напрямую использовали IP-адрес «https://1.2.3.4/my/cool/page».

Разрешение DNS не требуется, поэтому ваш браузер пытается установить TCP/TLS-соединение с сервером, как и раньше.

Ошибки сертификата

Первое, с чем вы, скорее всего, столкнетесь, это то, что сертификат сервера, скорее всего, будет отображаться как ненадежный. Это связано с тем, что сертификаты x509 имеют расширение под названием «Альтернативное имя субъекта», в котором перечислены доверенные имена сервера. Если имя хоста или IP-адрес, указанный вами для запроса, отсутствует в этом списке, браузер сообщит вам, что сертификат недействителен, и не позволит вам подключиться.

Однако давайте предположим, что в сертификате действительно указан конкретный IP-адрес, который вы используете, или же вы игнорируете проблемы с сертификатом. Браузер подключится к серверу и отправит следующий HTTP-запрос:

      GET /my/cool/page HTTP/1.1
User-Agent: Firefox(or whatever you're using)
Host: 1.2.3.4
Accept: */*

Обратите внимание: поскольку у браузера нет DNS-имени для сервера, он просто использует предоставленный вами IP-адрес.

Для простых сайтов это не проблема — пока поступает запрос, он будет отвечать в зависимости от пути (средний бит первой строки, определяющий точную страницу, которую вы запрашиваете).

Обратные прокси

Однако сайты довольно часто используют обратный прокси-сервер (nginx, traefik, caddy и т. д.), который может мультиплексировать HTTP-запросы между несколькими внутренними веб-серверами на основе поля «Хост».

Предположим, что я запускаю два разных веб-приложения: app1 и app2. Это небольшие приложения, и, возможно, они полагаются на некоторые общие ресурсы, поэтому я хочу запускать их на одном сервере. Приложения не могут использовать общие порты, и было бы неудобно запускать их на разных портах, поскольку теперь клиенту придется указывать, к какому порту они подключаются. Вместо этого я могу использовать обратный прокси.

Я бы установил две записи DNS для одного и того же сервера (IP): «app1.somesite.com» и «app2.somesite.com». Затем я настроил свой обратный прокси-сервер для проверки заголовка HTTP «Host» и направления входящих запросов к двум приложениям в зависимости от того, какое из них запрашивается.

Таким образом, даже несмотря на то, что HTTP-запросы для обоих приложений будут отправляться на один и тот же физический (или виртуальный) сервер, идентифицируемый IP-адресом, поле Host используется обратным прокси-сервером для мультиплексирования этих запросов между фактическими приложениями, работающими на хосте.

В этом случае, сделав запрос исключительно по IP-адресу, вы можете получить только одно из приложений или ни одного, в зависимости от того, как настроен обратный прокси-сервер.

Короткий ответ

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

Длинный ответ

Предполагается, что веб-серверы смогут обслуживать сотни веб-сайтов на одном IP-адресе. Для облегчения этого используется заголовок HTTP Host .

Позвольте мне объяснить весь процесс с использованием веб-сервера IIS.

Шаг 1. Настройка DNS

Возможно, что несколько записей DNS указывают на один IP-адрес. Итак, мы могли бы иметь:

      example.com      11.22.33.44
www.example.com  11.22.33.44
example.org      11.22.33.44
www.example.org  11.22.33.44

Шаг 2. Настройка IIS

При настройке веб-сайта в IIS необходимо указать привязки для веб-сайта. Информация о привязке состоит из 3 частей:

  1. ИП
  2. Порт
  3. Имя хоста

Информация о привязке также указывает, какой протокол (http или https) связан с тройным кортежем. Обратите внимание, что:

  • Сервер может прослушивать несколько IP-адресов. Вы можете указать IIS обслуживать веб-сайт только на определенном IP-адресе или использовать*для всех IP.
  • Вы можете указать IIS обслуживать веб-сайт через нестандартные порты.
  • Имя хоста может быть пустым

Привязки для двух вышеуказанных веб-сайтов могут выглядеть следующим образом:

      <site name="the example.com website">
  <bindings>
    <binding protocol="http" bindingInformation="*:80:example.com" />
    <binding protocol="http" bindingInformation="*:80:www.example.com" />
  </bindings>
</site>
<site name="the example.org website with ssl">
  <bindings>
    <binding protocol="http" bindingInformation="*:80:example.org" />
    <binding protocol="http" bindingInformation="*:80:www.example.org" />
    <binding protocol="https" bindingInformation="*:443:example.org" />
    <binding protocol="https" bindingInformation="*:443:www.example.org" />
  </bindings>
</site>

HTTP-запрос

Когда браузер пытается отобразить веб-сайт (например,http://example.com) он будет искать IP-адрес хостаexample.com. Затем он подключится к этому IP-адресу через указанный порт, используя указанный протокол.

Как только соединение будет установлено, оно отправит HTTP-запрос, который будет содержатьHostзаголовок:

      Host: example.com

IIS будет использовать три переменные (IP, порт и имя хоста) для определения (i) протокола, который будет использоваться (ii) веб-сайта для отображения. В приведенном выше примере он будет обслуживать данные изthe example.com websiteиспользуя http-протокол.

Вернемся к вашему вопросу

Если вы укажете IP-адрес вместо имени хоста (например,http://11.22.33.44), то HTTP-запрос будет содержать:

      Host: 11.22.33.44

В IIS, если соответствующий заголовок хоста не найден, будет использоваться привязка с пустым именем хоста (заголовокdefault websiteимеет пустое имя хоста при стандартной установке). Если привязки с пустым именем хоста не обнаружено, пользователь получит ошибку 404.

Да и нет. Как показывают многие другие ответы, все зависит от конфигурации веб-сервера (программного обеспечения, которое «обслуживает» ваш компьютер веб-страницей).

Когда вы делаете веб-запрос, ваш компьютер связывается с сервером по протоколу HTTP. По сути, это согласованный способ общения компьютеров друг с другом, который хорошо работает в сети. HTTP-запрос (сообщение, которое ваш компьютер отправляет на сервер) выглядит примерно так:

      GET / HTTP/2
Host: www.google.com
User-Agent: curl/8.3.0
Accept: */*

На самом деле ваш компьютер говорит: «Я хочу, чтобы страница находилась по пути/под именем хостаwww.google.com.» Теперь на одном и том же веб-сервере может размещаться множество веб-сайтов (как в случае со многими популярными службами «общего» хостинга, такими как GoDaddy), что означает, что многие веб-сайты будут иметь один и тот же IP-адрес. Таким образом, заголовок — это то, что отличает какой сайт вы заинтересованы в просмотре.

На стороне сервера можно настроить «виртуальные хосты», которые позволяют обслуживать несколько веб-сайтов и конфигураций веб-приложений с одного сервера. На многих серверах, настроенных на виртуальные хосты, попытка доступа к IP-адресу (через HTTP) напрямую/безHostзаголовок просто выдаст вам ошибку (403 или 404) или перенаправит вас на другой веб-сайт (например, хостинговую компанию, ее панель администратора и т. д.). Некоторые из них, у которых настроен хост «по умолчанию», будут обслуживать сайт, настроенный в соответствии с этой конфигурацией хоста по умолчанию.

Я использую систему Ubuntu и нашел IP-адрес superuser.com, используя:

       nslookup superuser.com
Server:     127.0.0.53
Address:    127.0.0.53#53

Non-authoritative answer:
Name:   superuser.com
Address: 104.18.8.56
Name:   superuser.com
Address: 104.18.9.56

Я попробовал войтиhttp://104.18.9.56/questions/1810856/can-you-go-to-a-website-by-typing-the-ip-address-into-the-address-barв адресную строку Chrome, чтобы перейти к этому вопросу, но затем появляется ошибка:

      Error 1003 Ray ID: 80fddb60a82b3692 • 2023-10-02 15:07:46 UTC
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.

What can I do?
If you are interested in learning more about Cloudflare, please visit our website.

Вместо этого пытаюсьhttps://104.18.9.56/questions/1810856/can-you-go-to-a-website-by-typing-the-ip-address-into-the-address-barприводит к ошибке:

      This site can’t provide a secure connection
104.18.9.56 uses an unsupported protocol.
ERR_SSL_VERSION_OR_CIPHER_MISMATCH

Я настроил фильтрацию у своего интернет-провайдера, чтобы заблокировать доступ к нежелательным типам контента, поэтому возможно, что интернет-провайдер блокирует попытки доступа к StackExchange с использованием IP-адреса.

Это служит примером того, как могут существовать прокси-серверы/фильтрация контента между реальным сервером и веб-браузером конечного пользователя, которые могут по-разному обрабатывать IP-адреса и имена.

Изменить : Как только что сказал @Jörg W Mittag в комментарии к другому ответу, для случая https вышеизложенное также может быть связано с тем, что браузер больше не разрешает сертификат TLS для IP-адреса.

Я абсолютно уверен, что да. Это все, что преобразует доменное имя, — это IP-адрес, однако верно, что на одном и том же IP-адресе может существовать несколько сайтов.

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

Кроме того, сервер может различать, как ему нравится. Через html или какой-либо другой механизм.

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

Конечно вы можете! Можете ли вы поехать к другу домой, если уже знаете его адрес? Введите 8.8.8.8 в адресную строку. В конечном итоге вы окажетесь на веб-сайте DNS Google. Итак, да, введя адрес, вы попадете на веб-сайт, ЕСЛИ вы знаете адрес.

Точно так же, как вождение автомобиля: если вы знаете только номер дома вашего друга, вам понадобится дополнительная информация, чтобы добраться туда (например, название улицы). Если веб-сайт, на который вы пытаетесь попасть, требует дополнительной информации (например, /questions/1810856/...), вам понадобится вся эта дополнительная информация, чтобы добраться до него, в дополнение к IP-адресу суперпользователя (104.18.8.56). Поиграйтесь немного с nslookup... попробуйтеnslookup superuser.comПо сути, все, что вы делаете с DNS, — это используете старомодную телефонную книгу (если вы достаточно взрослый, чтобы ее помнить). Если вы уже знаете всю информацию, телефонная книга вам не нужна.

Другие вопросы по тегам