Как заголовок хоста помогает на физическом хосте, на котором размещены несколько серверов? - PullRequest
0 голосов
/ 09 апреля 2019

У меня 1 единичная машина с IP 1.2.3.4 .Эта машина имеет 2 веб-сервера и FTP-сервер:

  • Веб-сервер 1 прослушивает порт 82;домен для него: ws1.example.com

  • Веб-сервер 2 прослушивает порт 83;домен для него: ws2.example.com

  • FTP-сервер прослушивает порт 21;домен для него: ftp.example.com

Вот как выглядит сопоставление DNS:

ws1.example.com CNAME example.com
ws2.example.com CNAME example.com
ftp.example.com CNAME example.com
example.com A 1.2.3.4

Случай 1: Я делаю запрос по URL-адресу браузера ws1.example.com: 82 , и DNS перенаправляет меня на example.com , но с заголовком Host : ws1.example.com .

Случай 2: Я делаю запрос по URL-адресу браузера ws2.example.com: 83 , и DNS перенаправляет меня на example.com , но с заголовком Host : ws2.example.com .

В обоих случаях:

  • запрос в конечном итоге достигает той же физической машины

  • при поступлении запроса:

    • В случае 1 запрос поступает на эту машину, и запрос обрабатывается приложением, которое прослушивает порт 82, т.е. веб-сервер 1.

    • В случае 2 запрос поступает на этот компьютер, и на него поступает запрос приложения, которое прослушивает порт 83, т.е. веб-сервер 2.

Как я понимаю, заголовок Host используется для информирования принимающего хоста о том, для какого сервера (из нескольких серверов, на котором размещен этот IP ) предназначен этот запрос и, соответственно,направляет запрос в соответствующее приложение.

Мой вопрос:

  • В этом примере, какова цель заголовка Host в качествеодна и та же физическая машина с тем же IP имеет несколькоons слушают на своих соответствующих портах.Как только запрос достигнет этой машины, соответствующий порт все равно будет принят, а другие приложения проигнорируют запрос, поскольку порт не соответствует запросу.Итак, с какой целью служит заголовок Host , когда соответствующие порты в любом случае выполняют свою работу, правильно и хорошо?

  • Можно ли сделать вывод, что

    1. CNAMES
    2. Несколько веб-серверов за одним IP
    3. последующее разрешение запроса конкретного пользователя на соответствующий веб-сервер с заголовком Host

    имеет смысл только тогда, когда вы используете что-то вроде обратного прокси-сервера, например, 1 машина взаимодействует с клиентом и перенаправляет пользовательские запросы на соответствующий веб-сервер на отдельных машинах, которые все прослушивают один и тот же порт, например 80, каждый в сети позадиобратный прокси-сервер, в этом случае ws1.example.com и ws2.exmple.com оба будут перенаправлены на обратный прокси-сервер example.com и этот обратный прокси теперь пересылает его на соответствующий хост на основе заголовка Host ?

1 Ответ

0 голосов
/ 09 апреля 2019

Нет перенаправлений DNS

Первое важное исправление терминологии:

В DNS нет «перенаправлений».В вашем случае DNS просто используется для сопоставления имени с IP.Иногда из-за CNAME имя сопоставляется с другим именем, которое затем сопоставляется с IP-адресом.Неважно, если есть промежуточные шаги, подобные этому, в конце имя сопоставляется с IP (или возникает ошибка разрешения DNS)

Это также означает, что если URL имеет определенный порт, то этоне изменяется, итоговый IP будет запрашиваться через порт, указанный в URL.

Перенаправления - это функция уровня HTTP: при запросе веб-сервера для https://www.mygreatsite.example/foo он ответит с кодом возврата HTTP 301,302, 303, 307 или 308 и давая вам (HTTP-клиент, он же браузер) новый URL-адрес для перехода.

виртуальный хостинг HTTP

В старые добрые времена IP-адреса былимного.Если вы размещали www.site1.example и www.site2.example в одном и том же физическом блоке, вы можете прикрепить к каждому один другой IP-адрес.Следовательно, в этом конкретном случае, в некотором смысле, заголовок HTTP host бесполезен, сам факт подключения либо к 192.0.2.37, либо к 192.0.2.42 уже позволяет узнать, какой сайт вам нужен.На самом деле в HTTP/0.9 не было заголовка host, поскольку заголовков вообще не было.

Но затем, когда в игру вступил массовый виртуальный хостинг, а адреса IPv4 стали недостаточными, вы больше не могли присоединятьодин IP-адрес для каждого сайта, так как это тоже трата.Таким образом, через DNS либо прямо, либо косвенно (CNAME записей) оба сайта разрешаются на один и тот же IP-адрес.

Следовательно, когда HTTP-клиент подключается к серверу, сервер по умолчанию не имеет возможностизнать, какой сайт вы хотите.Вот почему заголовок HTTP host, заполненный клиентом, позволяет серверу узнать, к какому веб-сайту вы хотите получить доступ, независимо от своего IP-адреса, который был разрешен ранее через DNS.

По умолчанию HTTP использует порт 80, поэтому он часто не виден в URL.Конечно, если вы заставили своих клиентов использовать http://www.site1.example:4569 с одной стороны и http://www.anothersite2.com:9873 с другой стороны, то вы правы, заголовок host на самом деле не понадобится.За исключением того, что план рушится по многим причинам:

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

Следовательно, обычно это делается не так, если вы хотите предоставить какую-то определенную службу через HTTP, но в порте не по умолчанию вы обычно устанавливаете обратный проксиперед ней.Или вы делаете перенаправление HTTP с http://www.coolpublicname.example/ на http://www.complicatedinternalname.example:9713, но затем клиент видит эту голую правду.

Виртуальный хостинг HTTPS

Попутно отметим, что HTTPS добавил уровень сложности, потому чтовеб-серверу HTTPS необходимо отправить свой сертификат клиенту, но, поскольку каждый веб-сайт может иметь свой сертификат, ему необходимо знать, какой веб-сайт хочет использовать клиент, который он может узнать через HTTP-заголовок host, но затем следует после TLS.Рукопожатие закончено, поэтому на ранней стадии отправки сервером сертификата это еще не доступно.

Так что в самые ранние времена HTTPS мы были вынуждены снова делать виртуальный хостинг на основе IP, а не на основе именивиртуальный хостинг, как это было возможно в чистом HTTP благодаря заголовку host.

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

...