Jak korzystać z DNS / nazw hostów lub innych sposobów rozwiązania określonego adresu IP: Port

51

To jest pytanie kanoniczne dotyczące rozpoznawania nazw DNS / hostów na adresy IP / porty

Przykład 1

Używam serwera WWW na porcie 80, a drugiego na porcie 87. Chciałbym używać DNS, aby www.example.com trafił na port 87. Jak mogę to zrobić, używając tylko DNS?

Przykład 2

Korzystam z usługi na moim serwerze na niestandardowym porcie. Jak mogę zmusić klientów do automatycznego łączenia się z tym niestandardowym portem? Czy mogę korzystać z DNS? Czy jest jakieś wsparcie specyficzne dla aplikacji, w którym DNS może wskazywać adres IP i port?

Przykład 3

Czy niektóre protokoły aplikacji w szczególności obsługują rozpoznawanie nazw hostów i pozwalają na podjęcie specjalnych działań na podstawie tych informacji? Czy są jakieś inne pytania dotyczące błędu serwera, które obejmują niektóre z nich?

Commandeering:To pytanie pierwotnie dotyczyło uruchamiania usług IIS i Apache na tym samym serwerze, ale te same koncepcje można zastosować do dowolnego oprogramowania serwera odbierającego połączenia od klientów. Poniższe odpowiedzi opisują problemy techniczne i rozwiązania związane z używaniem DNS i obsługi protokołu aplikacji w celu przypisania numeru portu do połączenia klienta.

Tomasz Smykowski
źródło
Jeśli chodzi o przykład trzeci, czytelnicy mogą również chcieć zbadać nasze kanoniczne pytanie dotyczące rozpoznawania arbitralnych protokołów z nazwą hosta .
MadHatter

Odpowiedzi:

34

Nie można używać DNS do wskazywania portu (chyba że klient obsługuje rekordy SRV, większość tego nie robi).

Strony internetowe i protokoły z nagłówkami hosta

Aby to zrobić, musisz wprowadzić metodę front-end. Zwykle do przekazania połączenia z portu 80 do portu! 80 należy użyć frontowego serwera WWW lub dedykowanego oprogramowania proxy na podstawie nazwy serwera żądanego w nagłówku. Niektóre zapory ogniowe mogą również przekazywać dalej na podstawie nagłówka hosta.

SRV Records

Niektórzy klienci obsługują wyszukiwanie rekordów SRV wskazujących nazwę hosta i numer portu serwera dla określonej usługi (tj. Użytkownik określa „example.com”, klient wyszukuje rekord SRV i otrzymuje „server101.example.com” na porcie „255 "; następnie łączy się z tym). Niektórzy klienci implementują to również tam, gdzie nie jest to wymagane (mój ostatni smartfon szukałby np. Rekordów SRV podczas konfigurowania nowego konta e-mail).

Niestety obsługa rekordów SRV jest bardzo rzadka. Obsługuje tylko kilka ważnych protokołów (Jabber / XMPP, Kerberos, LDAP, SIP) i nie każdy klient obsługuje je, nawet gdy jest to wymagane.

Chris S.
źródło
15

Gdy wpiszesz http://www.domain.com w przeglądarce, zrozumiałe jest, że port HTTP jest ustawiony na 80. Dlatego nie ma bezpośredniego sposobu, aby wskazać www.domain.com na port 87, jeśli masz już usługę działający na tym porcie w IIS.

Biorąc to pod uwagę, istnieje kilka „obejść”.

  • Wystarczy użyć http://www.domain.com:87/ - to połączy się z portem 87 (apache) na twoim serwerze.
  • Możesz skonfigurować przekierowanie, aby http://www.domain.com/apache przekierowywał (lub proxy, jeśli chcesz się podoba) na www.domain.com:87.
  • Możesz skonfigurować „VirtualHost”, aby www.domain2.com nadal był na porcie 80, współdzielony z www.domain.com. Nie można tego skonfigurować bez modyfikacji IIS.

Sam ma rację, DNS jest agnostyczny, jeśli chodzi o porty. Wszelkie usługi przekierowujące porty mają miejsce w usłudze działającej na tym porcie. Dlatego musisz zrobić coś z IIS, aby tak się stało, jeśli nie masz innego wyjścia, jak pozostawić to na porcie 80.

Obejrzałem również twoją sytuację, używając mod_proxy na Apache, nie jestem pewien, czy istnieje sposób, aby to zrobić za pomocą IIS.

Dave Drager
źródło
Ok, więc jak ustawić proxy w IIS?
Tomasz Smykowski
2
Jeśli jest to IIS7, możesz użyć routingu żądań aplikacji (ARR).
Scott Forsyth - MVP
1
Scott, masz dobry link do dokumentacji dotyczącej ARR?
Jacques
12

Obawiam się, że nazwy domen można powiązać tylko z adresem IP, a nie z portem.

Większość serwerów internetowych, np. (Apache, IIS itp.), Pozwala mieć dwie domeny hostowane pod tym samym adresem IP, wykorzystując fakt, że żądania sieciowe zawierają pole nagłówka hosta, które identyfikuje domenę w samym żądaniu.

Jeśli powiesz, z jakiego serwera korzystasz, jestem pewien, że ludzie mogą wskazać odpowiednią dokumentację, aby skonfigurować serwer zgodnie z życzeniem

Phil
źródło
O to chodzi. Używam dwóch różnych serwerów internetowych.
Omar Abid
12

Technicznie można użyć rekordów SRV na serwerach DNS zgodnie z definicją w RFC 2782, aby powiedzieć przeglądarkom, które serwery obsługują http na których portach dla (pod) domeny:

_http._tcp.www.example.com.  IN      SRV 0    5      80   www.example.com.
_http._tcp.www2.example.com. IN      SRV 0    5      87   www.example.com.

Działa to dobrze w przypadku wielu protokołów / usług, szczególnie tam, gdzie użycie rekordów SRV jest już zdefiniowane w specyfikacji protokołu.

Jednak, jak stwierdza ten „ Hall of Shame ”, większość przeglądarek internetowych / klientów nie obsługuje tego (dla HTTP). Zobacz także dlaczego-do-przeglądarki-nie-używaj-srv-records .

Zasadniczo chodzi o to, że SRV nie jest koniecznie uwzględniony w protokole http, więc każda przeglądarka, która go implementuje, rozpoznaje adresy URL inaczej niż przeglądarki, które tego nie robią.

Dlatego powinieneś używać tego tylko jako opcjonalnego równoważenia obciążenia, gdy nie ma znaczenia, który serwer jest wybrany pod względem zawartości. „Opcjonalne”, ponieważ nie zrównoważy dużego obciążenia, jeśli tylko niewielu klientów to zaimplementuje.

JonnyJD
źródło
6

DNS nie ma możliwości przekierowania do określonego portu, wszystko, na czym zależy DNS, to rozpoznawanie adresu IP nazwy i odwrotnie.

Niektóre usługi, takie jak dostawcy Dynamic IP DNS, takie jak NO-IP, zapewniają usługi, które mogą pomóc w zrobieniu czegoś podobnego, aby obejść blokowanie adresów IP w domowych usługach DNS.

Sam Cogan
źródło
Niektórzy rejestratorzy (GoDaddy) oferują przekazywanie domen przez zaparkowane serwery. Możesz spróbować, ale to trochę kłopot. Ewentualnie możesz napisać własną przeglądarkę internetową, która wyszukuje rekordy SRV, a następnie spróbować przekonać świat do korzystania z niej :)
Jason Antman
6

Aby korzystać z dowolnej usługi (TBT) na niestandardowym porcie i nie zapisywać portu w URI, każdy może korzystać z rekordów SRV zdefiniowanych w RFC 2782.

_http._tcp.www.example.com. IN      SRV 0    5      87   www.example.com.

Wszystkie pozostałe hosty http w strefie będą nadal obsługiwane na domyślnym porcie 80

Leniwy Borsuk
źródło
3
+1 za wskazanie, że niektóre z poniższych instrukcji są niepoprawne, jeśli chodzi o specyfikację - DNS absolutnie może wskazywać port usługi za pośrednictwem rekordów SRV. Ale zakłada również, że klient wie najpierw o rekord SRV.
mcauth
2

Najprostszym sposobem jest użycie odwrotnego serwera proxy i ustawienie go jako internetowego serwera proxy. Możesz skonfigurować dla niego nginxlub apache. W przeszłości miałem zasadniczo ten sam problem i stworzyłem narzędzie do osiągnięcia takiej konfiguracji w prosty sposób. Ergo: https://github.com/cristianoliveira/ergo

Korzystam z tego i zasadniczo działa jak urok :)

Cristian Oliveira
źródło
0

Jednym z podejść do wdrożenia dwóch serwerów WWW na tym samym hoście jest umożliwienie obydwu nasłuchiwania na porcie 80 na dwóch różnych adresach IPv6. IPv6 oficjalnie określa, że ​​możesz przypisać dwa adresy do interfejsu, a adresów IPv6 jest wystarczająca, abyś mógł to zrobić bez wyczerpania adresów.

Jest to dowód na przyszłość, a każda z dwóch domen może mieć rekordy AAAA wskazujące na różne adresy IP, więc domeny kończą się na różnych serwerach internetowych.

Jeśli masz również pojedynczy adres IPv4, możesz użyć portu 80 na adresie IPv4, aby uruchomić odwrotne proxy. W ten sposób klienci korzystający tylko z IPv4 mogą uzyskać dostęp do obu serwerów WWW. Metoda odwrotnego proxy działa nawet, jeśli niektóre serwery WWW znajdują się na tym samym hoście, co odwrotne proxy, a niektóre serwery WWW znajdują się na innych hostach.

W takiej konfiguracji example.orgmoże mieć adresy, 192.0.2.1a 2001:db8::1podczas gdy example.netma adresy 192.0.2.1i 2001:db8::2.

kasperd
źródło