Jak sprawić, by protokół foo rozpoznawał nazwę hosta?

10

Jest to kanoniczne pytanie dotyczące rozpoznawania nazw hostów i proxy.

Wiem, że niektóre protokoły obsługują nazwy hostów; to znaczy, kiedy łączę się z serwerem HTTP www.example.com, wie, że chcę www.example.comusługi HTTP, a nie www.example.net, nawet jeśli są one na tym samym adresie IP. Jak mogę to zrobić dla protokołu foo ?

(Uwaga tymczasowa: to pytanie pojawia się zgodnie z tą meta dyskusją ).

Szalony Kapelusznik
źródło

Odpowiedzi:

14

Aby zrozumieć, co się dzieje, musisz trochę dowiedzieć się o DNS.

Gdy klient chce połączyć się z usługą na danym hoście, wyszukuje nazwę hosta za pośrednictwem swojej lokalnej infrastruktury DNS i w odpowiedzi otrzymuje adres IP. Następnie łączy się z tym adresem IP i żąda usługi w sposób zalecany przez procotol, który został zbudowany do wdrożenia.

W niektórych przypadkach część tego procotolu obejmuje drugie wysłanie pierwotnie sprawdzonej nazwy hosta, która w tym przypadku jest wysyłana na serwer, a nie do infrastruktury DNS. W przypadku HTTP zostało to dodane jako część HTTP / 1.1 w RFC 2616 ; w przypadku HTTPS zostało to zaimplementowane jako SNI ( Server Name Indication ) w RFC 4366 ; w przypadku FTP zostało to dodane przez HOSTpolecenie w RFC 7151 (ale patrz później zastrzeżenie). Jeśli takie drugie wysyłanie nie nastąpi, serwer nie może wiedzieć, jaką nazwę hosta podał klientowi na swój lokalny DNS, aby uzyskać adres IP serwera.

Należy pamiętać, że we wszystkich przypadkach wymagana była zmiana protokołu, aby wykonać to drugie wysyłanie, a tym samym uwidocznić nazwę hosta interakcji klient-serwer. Po zmianie protokołu konieczne było zaktualizowanie kodu serwera, aby go zaimplementować. I w końcu klienci musieli zostać zaktualizowani, aby przekazywać nowy protokół serwerom. Ten ostatni krok może być szczególnie powolny; w przypadku SNI program Internet Explorer w systemie Windows XP nigdy go nie wdrożył, więc nie można było polegać na tym protokole, podczas gdy nadal istniała znaczna liczba użytkowników IE-na-XP, i zajęło im to około dziesięciu lat zginąć i / lub uzyskać aktualizacje, które SNI można niezawodnie wdrożyć.

Tak właśnie jest potrzebne, aby protokół nieobsługujący nazwy hosta rozpoznawał nazwę hosta. To nie jest proste ustawienie flagi lub zmiana konfiguracji. Mamy kilka odpowiedzi specyficznych dla protokołu, które dotyczą stanu rzeczy i możliwych środków łagodzących, w szczególności dla tego protokołu: dla SSH (a więc także SFTP) i dla FTP (co wskazuje, że HOSTobsługa FTP jest obecnie niejednolita -faza wsparcia, więc nie można jeszcze na niej polegać).

Krótka odpowiedź brzmi: jeśli twój protokół nie implementuje obecnie rozpoznawania nazw hostów, z dobrym wsparciem zarówno dla klientów, jak i serwerów, zapomnij: nie jest to coś, co możesz zrobić.

Szalony Kapelusznik
źródło
6
Myślę, że zahartowałbym tę odpowiedź, ponieważ niektóre protokoły dotyczą zupełnie nowych produktów lub są na tyle lokalne, że jedna firma będzie kontrolować wszystkie instancje serwerów i klientów. W takich przypadkach po prostu dodanie poleceń lub pakietów nazwy hosta jest bardzo proste i bardzo łatwe do wdrożenia. Opisujesz trudność dodania nowej funkcji do istniejącego protokołu, który jest już powszechnie używany przez wielu dostawców.
JPhi1618,
4
@ JPhi1618 Słyszę cię, ale moim zdaniem każdy „protokół” stworzony i wdrożony przez jedną firmę, a nie osadzony w RFC, wcale nie jest protokołem; to tylko wewnętrzna decyzja inżynieryjna i nie jestem zainteresowany takimi zastrzeżonymi produktami. Jak zauważyłeś, sprzedawca może natychmiast zmienić rzeczy, aby wdrożyć rozpoznawanie nazw hostów, jeśli tak zdecyduje; ale ponieważ nikt inny niż sprzedawca nie może tego zrobić, nie rozumiem, jak bardzo interesuje to OP.
MadHatter
Myślę, że istotnym pytaniem jest, czy projektujesz nowy protokół, czy pytasz, jak zmienić istniejący protokół.
Barmar
Zastrzeżony protokół jest nadal protokołem.
Barmar
@Barmar, prawdopodobnie nie jest to dobra dyskusja. To pytanie dotyczy zmiany istniejących protokołów i jak zauważyłem wcześniej, jeśli zastrzeżoną decyzję / protokół inżynierski bazmoże zmienić tylko jego właściciel i jedyny implementator, to jedynym sposobem, aby uświadomić sobie nazwę hosta, jest odwołanie się do właściciela. Nie stanowi to interesującej odpowiedzi SF, a ponadto nie jest (moim zdaniem) tematem. „ Jak zaprojektować protokół rozpoznający nazwę hosta ” to zupełnie inne pytanie, a nie takie, które chciałbym zadać.
MadHatter