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


64

Деякі веб-сервери при зверненні за допомогою своєї IP-адреси повертають помилку, що прямий доступ до IP-адреси заборонено.

Я деякий час цікавився, як це працює. Тобто, чи не завжди браузер вирішує IP-адресу та підключається до неї? Чи не "Прямий доступ до IP-адреси" просто пропускає DNS? Як віддалений сервер навіть знає, що ви пропустили DNS?


2
Як я пам’ятаю, те , що він насправді просив, було додане до протоколу http дуже рано, щоб забезпечити віртуальними серверами на тому ж реальному хості.
JDługosz

3
Це в основному той самий процес, який дозволяє одному серверу розрізняти різні віртуальні хости. Реальний сервер відображає URL-адресу на одному зі своїх віртуальних хостів. Багато серверів не мають резервної копії для ненаписаної URL-адреси - ні за дизайном, ні за замовчуванням.
Манго

Ви можете пропустити DNS, але уникнути цієї помилки, якщо створити запис у файлі хостів для відповідного доменного імені. Ваш веб-переглядач буде шукати доменне ім'я та включить його до заголовка Host: але запит DNS не буде здійснено через запис файлів хостів.
Monty Harder

Відповідь на подібні запитання зазвичай є, тому що ви їм сказали .
Томас

Відповіді:


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, yetagethersite.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, оскільки сервер не знає, який сертифікат використовувати.
Зубна щітка

О, цікаво. Чи все-таки мій експеримент спрацює?
Duncan X Simpson

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

Але не про HTTPS - це те, про що я питав.
Дункан X Сімпсон

Ні, він не повинен працювати над 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.