Cómo usar DNS / Nombres de host u Otras formas de resolver a una IP específica: Puerto

51

Esta es una pregunta canónica sobre la resolución de DNS / nombres de host a IP / puertos

Ejemplo 1

Estoy ejecutando un servidor web en el puerto 80 y otro en el puerto 87. Me gustaría usar DNS para que www.example.com vaya al puerto 87. ¿Cómo puedo lograr esto usando solo DNS?

Ejemplo 2

Estoy ejecutando un servicio en mi servidor en un puerto no estándar. ¿Cómo puedo hacer que los clientes se conecten a este puerto no estándar automáticamente? ¿Puedo usar DNS? ¿Existe algún soporte específico para la aplicación donde DNS pueda indicar la IP y el puerto?

Ejemplo 3

¿Algunos protocolos de aplicación admiten específicamente el reconocimiento del nombre de host y permiten que se tomen acciones especiales basadas en esta información? ¿Hay otras preguntas sobre la falla del servidor que cubran algunas de estas?

Commandeering:Originalmente, esta pregunta se refería a ejecutar IIS y Apache en el mismo servidor, pero los mismos conceptos se pueden aplicar a cualquier software de servidor que reciba conexiones de clientes. Las respuestas a continuación describen los problemas técnicos y las soluciones del uso de DNS y el soporte del protocolo de aplicación para asignar un número de puerto para que un cliente se conecte.

Tomasz Smykowski
fuente
Con respecto al ejemplo tres, los lectores también pueden desear examinar nuestra pregunta canónica sobre cómo hacer que los protocolos arbitrarios sean conscientes del nombre del host .
MadHatter apoya a Monica el

Respuestas:

34

No puede usar el DNS para apuntar a un puerto (a menos que el cliente admita registros SRV, la mayoría no).

Sitios web y protocolos con encabezados de host

Tendrá que implementar algún método de front-end para hacer esto. Por lo general, usaría un servidor web front-end o un software proxy dedicado para reenviar la conexión del puerto 80 al puerto 80 en función del nombre del servidor que se solicita en el encabezado. Algunos firewalls también pueden reenviarse según el encabezado del host.

Registros SRV

Algunos clientes admiten búsquedas de registros SRV que indican el nombre de host y el número de puerto del servidor para el servicio especificado (es decir, el usuario especifica "example.com", el cliente busca un registro SRV y obtiene "server101.example.com" en el puerto "255 "; luego se conecta a eso). Algunos clientes también implementan esto donde no es necesario (mi último teléfono inteligente buscaría los registros SRV al configurar una nueva cuenta de correo electrónico, por ejemplo).

Desafortunadamente, el soporte para registros SRV es muy poco común. Solo unos pocos protocolos notables exigen que sea compatible (Jabber / XMPP, Kerberos, LDAP, SIP) y no todos los clientes lo admiten, incluso cuando es obligatorio.

Chris S
fuente
15

Cuando escribe http://www.domain.com en su navegador, se entiende que el puerto HTTP está en 80. Por lo tanto, no hay una forma directa de apuntar www.dominio.com al puerto 87 si ya tiene un servicio ejecutándose en ese puerto en IIS.

Dicho esto, hay algunas "soluciones".

  • Simplemente use http://www.domain.com:87/ - esto se conectará al puerto 87 (apache) en su servidor.
  • Puede configurar una redirección, de modo que http://www.domain.com/apache reenvíe (o proxy, si desea obtener más información) a www.domain.com:87.
  • Puede configurar un "VirtualHost" para que www.dominio2.com siga estando en el puerto 80, compartido con www.dominio.com. No puede configurar esto sin modificar IIS.

Sam tiene razón, DNS es agnóstico cuando se trata de puertos. Cualquier tipo de redirección de puerto ocurre por el servicio que se ejecuta en ese puerto. Por lo tanto, necesitaría hacer algo con IIS para que esto suceda, si no tiene más remedio que dejarlo en el puerto 80.

También he solucionado su situación utilizando mod_proxy en Apache, no estoy seguro de si hay una manera de hacerlo con IIS.

Dave Drager
fuente
Ok, entonces, ¿cómo configurar proxy en IIS?
Tomasz Smykowski
2
Si es IIS7, puede usar el Enrutamiento de solicitud de aplicación (ARR).
Scott Forsyth - MVP
1
Scott, ¿tienes un buen enlace para la documentación sobre ARR?
Jacques
12

Me temo que los nombres de dominio solo pueden asociarse con una dirección IP y no con un puerto.

La mayoría de los servidores web, por ejemplo (Apache, IIS, etc.) le permiten tener dos dominios alojados en la misma dirección IP al usar el hecho de que las solicitudes web contienen un campo de encabezado de host que identifica el dominio en la solicitud misma.

Si dice cuál es el servidor web que está utilizando, estoy seguro de que las personas pueden indicarle la documentación relevante para configurar su servidor como desee

Phil
fuente
Ese es el punto. Estoy usando dos servidores web diferentes.
Omar Abid
12

Técnicamente, puede usar registros SRV en servidores DNS como se define en RFC 2782 para indicar a los navegadores qué servidores manejan http en qué puertos para un (sub) dominio:

_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.

Esto funciona bien para muchos protocolos / servicios, especialmente cuando el uso de registros SRV ya está definido en la especificación del protocolo.

Sin embargo, como dice este " Salón de la Vergüenza ", la mayoría de los navegadores web / clientes no lo admiten (para HTTP). También vea por qué-do-browsers-not-use-srv-records .

Básicamente, el acuerdo es que SRV no está incluido en el protocolo http como una obligación, por lo que cada navegador que lo implementa resuelve las URL de manera diferente a los navegadores que no lo hacen.

Por lo tanto, solo debe usar esto como un equilibrio de carga opcional, donde no es relevante qué servidor se elige en términos de contenido. "Opcional" porque no equilibrará gran parte de la carga si solo unos pocos clientes implementan esto.

JonnyJD
fuente
6

DNS no tiene la capacidad de redirigir a un puerto específico, lo único que le importa a DNS es la resolución de la dirección IP de un nombre, y viceversa.

Algunos servicios, como los proveedores de DNS de IP dinámica, como NO-IP, brindan un servicio que puede ayudarlo a hacer algo similar para evitar el bloqueo de IP en los servicios de DNS en el hogar.

Sam Cogan
fuente
Algunos registradores (GoDaddy) ofrecen reenvío de dominio a través de sus servidores estacionados. Podrías darle una oportunidad, pero es un poco un error. Alternativamente, se podría escribir su propio navegador web que mira hacia arriba registros SRV, y luego tratan de convencer al mundo de usarlo :)
Jason Antman
6

Para usar cualquier servicio (TBT) en un puerto no estándar y no escribir el puerto en URI, todos pueden usar registros SRV, definidos en RFC 2782.

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

Todos los demás http-hosts en la zona aún se servirán en el puerto predeterminado 80

Tejón perezoso
fuente
3
+1 por señalar que varias de las siguientes declaraciones son incorrectas, en lo que respecta a las especificaciones: el DNS puede indicar absolutamente un puerto de servicio a través de registros SRV. Pero también supone que el cliente sabe pedir primero el registro SRV.
mcauth
2

La forma más simple es usar un proxy inverso y configurarlo como su proxy web. Puede configurar un nginxo apachepara ello. Básicamente tuve el mismo problema en el pasado e hice una herramienta para lograr dicha configuración de una manera simple. Ergo: https://github.com/cristianoliveira/ergo

He estado usando esto y, básicamente, funciona como un encanto :)

Cristian Oliveira
fuente
0

Un enfoque para implementar dos servidores web en el mismo host es hacer que ambos escuchen en el puerto 80 en dos direcciones IPv6 diferentes. IPv6 especifica oficialmente que puede asignar dos direcciones a una interfaz, y hay suficientes direcciones IPv6 para que pueda hacerlo sin quedarse sin direcciones.

Esto es una prueba futura, y sus dos dominios pueden tener registros AAAA que apuntan a las diferentes direcciones IP, por lo que los dominios terminan en diferentes servidores web.

Si también tiene una única dirección IPv4, puede usar el puerto 80 en la dirección IPv4 para ejecutar un proxy inverso. De esta forma, los clientes que solo utilizan IPv4 pueden acceder a sus servidores web. El enfoque de proxy inverso incluso funciona si algunos de los servidores web están en el mismo host que el proxy inverso y algunos de los servidores web están en otros hosts.

En tal configuración example.orgpodría tener direcciones 192.0.2.1y 2001:db8::1mientras que example.nettiene direcciones 192.0.2.1y 2001:db8::2.

kasperd
fuente