Как мне сделать протокол foo-host-осведомленным?

10

Это канонический вопрос об осведомленности об имени хоста и проксировании.

Я знаю, что некоторые протоколы учитывают имя хоста; то есть, когда я подключаюсь к HTTP-серверу, www.example.comон знает, что мне нужен www.example.comHTTP-сервис, а не сервис www.example.net, даже если они находятся на одном IP-адресе. Как я могу сделать это для протокола Foo ?

(Временное примечание: этот вопрос появляется в соответствии с этой мета-дискуссией .)

Безумный Шляпник
источник

Ответы:

14

Чтобы понять, что происходит, вам нужно немного узнать о DNS.

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

В некоторых случаях часть этого procotol включает в себя вторую отправку первоначально найденного имени хоста, которое в этом случае отправляется на сервер, а не на инфраструктуру DNS. В случае HTTP это было добавлено как часть HTTP / 1.1, в RFC 2616 ; в случае HTTPS это было реализовано как индикация имени сервера (SNI) в RFC 4366 ; и в случае с FTP это было добавлено HOSTкомандой в RFC 7151 (но смотри позже). Если такая повторная отправка не происходит, у сервера нет возможности узнать, какое имя хоста клиент передал в свой локальный DNS для получения IP-адреса сервера.

Обратите внимание, что во всех случаях для выполнения этой второй отправки требуется изменение протокола и, следовательно, информирование имени хоста взаимодействия клиент-сервер. После изменения протокола необходимо было обновить код сервера, чтобы реализовать его. И наконец, клиенты должны были быть обновлены, чтобы сообщить новый протокол серверам. Этот последний шаг может быть особенно медленным; Что касается SNI, Internet Explorer в Windows XP никогда не реализовывал его, поэтому на протокол нельзя было положиться, пока существовало значительное количество пользователей IE-on-XP, и потребовалось около десяти лет, чтобы их было достаточно. вымирают и / или получают обновления, которые SNI надежно разворачивается.

Так вот, что нужно, чтобы сделать протокол без учета имени хоста. Это не простая установка флага или изменение конфигурации. У нас есть некоторые специфичные для протокола ответы, которые касаются состояния дел и возможных мер по смягчению, в частности для этого протокола: для SSH (и, следовательно, также SFTP) и для FTP (что указывает на то, что HOSTподдержка FTP в настоящее время находится в стадии исправления) -поддержка фазы, и поэтому пока нельзя полагаться).

Короткий ответ заключается в том, что если ваш протокол в настоящее время не реализует поддержку имени хоста, с хорошей поддержкой как клиентов, так и серверов, забудьте об этом: это не то, что вы можете сделать.

Безумный Шляпник
источник
6
Я думаю, что я бы смягчил этот ответ тем фактом, что некоторые протоколы предназначены для совершенно новых продуктов или достаточно локальны, чтобы одна компания контролировала все экземпляры серверов и клиентов. В этих случаях простое добавление команд или пакетов имени хоста очень просто и очень легко реализовать. Вы описываете сложность добавления любой новой функции в существующий протокол, который уже широко используется многими поставщиками.
JPhi1618
4
@ JPhi1618 Я вас слышу, но, по моему мнению, любой «протокол», созданный и внедренный одной компанией и не встроенный в RFC, вовсе не является протоколом; это просто внутреннее инженерное решение, и я не заинтересован в таких запатентованных продуктах. Как вы указали, поставщик может мгновенно изменить ситуацию, чтобы реализовать понимание имени хоста, если он того пожелает; но так как ни один другой , чем поставщик не может сделать это, я не вижу , как это представляет большой интерес к ОП.
MadHatter
Я думаю, что уместный вопрос - разрабатываете ли вы новый протокол или спрашиваете, как изменить существующий протокол.
Бармар
Собственный протокол все еще протокол.
Бармар
@ Бармар, это, вероятно, не очень хорошая дискуссия. Этот вопрос касается изменения существующих протоколов, и, как я уже отмечал ранее, если собственное инженерное решение / протокол bazможет быть изменено только его владельцем и единственным разработчиком, то единственный способ сделать так, чтобы он учитывал имя хоста, - это обратиться к владельцу. Это не делает интересный ответ SF, и, кроме того, не (по моему мнению) по теме. « Как мне разработать протокол с учетом имени хоста » - это совсем другой вопрос, и мне не интересно его задавать.
MadHatter