¿Cómo saben los servidores web si está utilizando el acceso directo a la dirección IP?

64

Algunos servidores web, cuando se accede usando su dirección IP, devuelven un error que indica que el acceso directo a la dirección IP no está permitido.

Hace tiempo que me pregunto cómo funciona esto. Quiero decir, ¿el navegador no siempre resuelve la dirección IP y se conecta a ella? ¿El "acceso directo a la dirección IP" no se salta el DNS? ¿Cómo funciona el servidor remoto siquiera sabe se ha saltado el DNS?

Joseph A.
fuente
2
Según recuerdo, lo que realmente pidió se agregó al protocolo http muy pronto, para proporcionar servidores virtuales en el mismo host real.
JDługosz
3
Básicamente es el mismo proceso que permite que un solo servidor diferencie entre diferentes hosts virtuales. El servidor real asigna una URL a uno de sus hosts virtuales. Muchos servidores no tienen una reserva para una URL no asignada, ya sea por diseño o por defecto.
Manngo
Puede omitir DNS pero evite este error si crea una entrada en su archivo de hosts para el nombre de dominio en cuestión. Su navegador buscará el nombre de dominio y lo incluirá en el encabezado Host:, pero no se realizará ninguna consulta DNS debido a la entrada del archivo de hosts.
Monty Harder
La respuesta a este tipo de preguntas generalmente es, porque usted les dijo .
Thomas

Respuestas:

91

Para responder a su pregunta de cómo sabe , tiene que ver con lo que su navegador envía al servidor.

Tiene razón en que el sistema siempre lo resuelve en una dirección IP, pero el navegador envía la URL a la que intentó acceder en el encabezado HTTP.

Aquí hay un encabezado de muestra que encontré en línea, modificado para que parezca que usaste Firefox en Windows y escribiste apple.comen la barra de direcciones:

GET / HTTP/1.1
Host: apple.com
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.5) Gecko/20091102 Firefox/3.5.5 (.NET CLR 3.5.30729)
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache

Así es como se vería el encabezado si usara su dirección IP:

GET / HTTP/1.1
Host: 17.142.160.59
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.5) Gecko/20091102 Firefox/3.5.5 (.NET CLR 3.5.30729)
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache

Ambos se enviarían a la misma dirección IP a través de un socket, pero el navegador le dice al servidor a qué accedió.

¿Por qué? Porque los servidores web con la misma dirección IP pueden alojar múltiples sitios y dar diferentes páginas para cada uno. No puede distinguir quién quiere qué página por dirección IP porque todos tienen la misma, pero puede distinguirlos por el encabezado HTTP.

iAdjunct
fuente
77
Ahh, tiene mucho más sentido ahora! Básicamente, el navegador envía a la IP el encabezado con la IP o el dominio, y el sitio asume eso. Entonces, ¿estas restricciones son fáciles de eludir?
Joseph A.
77
No es que sea una restricción que estás pasando por alto, es solo que no estás jugando a la pelota y obtendrás algunos resultados extraños.
iAdjunct
Estas solicitudes HTTP son las que obtendría si usa un proxy. Sin un proxy, la información viene en el hostencabezado. Ver este ejemplo .
0xFE
2
bytec0de: La otra parte de esto es que las configuraciones del servidor web a menudo se configurarán en función del nombre del host. El paquete IP especifica la dirección IP, el segmento TCP especifica el número de puerto y el encabezado HTTP especifica el nombre de host. Por lo tanto, los servidores están configurados para decir "si el cliente / navegador pregunta por ejemplo.com, entonces déselo". Se pueden configurar para responder también a direcciones IP o comodines (responder a cualquier cosa), pero muchas personas simplemente copian ejemplos, y muchos ejemplos preexistentes se basan en el nombre de dominio proporcionado por el navegador.
TOOGAM
14
@ bytec0de No es una restricción . Es más como usar el número de teléfono correcto, pero la extensión incorrecta: llamó al edificio correcto, pero no a la persona correcta. Y la razón de su introducción también es prácticamente la misma que con los teléfonos: le permite alojar múltiples sitios separados en la misma dirección IP (y puerto TCP). Por ejemplo, nuestro servidor de desarrollo alojó cientos de sitios web separados al mismo tiempo, y muchas soluciones de alojamiento web utilizan el mismo enfoque ("registre un dominio, apúntelo a nuestra dirección IP, nos encargaremos del resto") .
Luaan
21

Con el protocolo HTTP 1.1 (la versión anterior de HTTP 1.0 ha estado obsoleta durante bastante tiempo, por lo que es poco probable que sea utilizada por ninguna versión reciente de un navegador), hostse introdujo el encabezado. Para HTTP 1.1, esa es una línea de encabezado obligatoria que debe emitir un navegador . El navegador incluye el nombre de dominio en esa línea, por ejemplo Host: example.com. Entonces el servidor web sabe a qué sitio web quiere acceder el navegador desde esa línea. Dado que un servidor web puede ser compatible con docenas de sitios web, esa línea es importante para determinar en qué sitio web reside la página solicitada. Suponiendo que el navegador quiere acceder a la página de inicio de un sitio en example.com, emite la siguiente línea al servidor cuando se conecta al servidor:

GET / HTTP/1.1

Esa línea especifica que el navegador desea obtener el documento raíz, es decir, "/" para el sitio web. Si quisiera acceder /somedir/testpage.html, GET /somedir/testpage.htmlestaría en la línea "get". La línea será seguida por la siguiente línea:

Host: example.com

Entonces, si el servidor web es compatible con los sitios web example.com, someothersite.com, yetanothersite.org, etc., sabe que debería regresar a la página principal de example.com. Si no obtiene esa línea, o no tiene un nombre de dominio en la Hostlínea, no sabe qué página de inicio del sitio web debe devolverse. Por lo tanto, puede devolver un mensaje de error o devolver la página de inicio de un sitio "predeterminado" para el servidor.

Puede emitir los mismos comandos que emite un navegador utilizando el protocolo telnet , por ejemplo, telnet example.com 80desde un indicador de shell de Linux o una ventana de Terminal Apple OS X , para conectarse al puerto HTTP predeterminado, el puerto 80; consulte Probar el acceso a un sitio web utilizando PuTTY para conocer los pasos. hacerlo con PuTTY en un sistema Windows.

punto de luna
fuente
3
Solo una nota: el encabezado del host también se usó en HTTP 1.0, simplemente no era necesario . HTTP 1.1 hizo el campo obligatorio. En la práctica, muchos servidores HTTP 1.0 simplemente no funcionaron si el navegador no envió el encabezado del host (por todas las razones descritas anteriormente), por lo que la mayoría de los navegadores lo enviaron de todos modos.
Luaan
6

Esto se debe al Host:encabezado HTTP. Esto es bastante útil para alojar múltiples sitios en la misma dirección IP. Por ejemplo, http://www.k7dxs.net/ y http://www.philipgrimes.com/ están en la misma dirección IP. Sin embargo, debido al Host:encabezado, pueden mostrar dos sitios diferentes.

Para HTTPS, como señaló @Toothbrush, usan la Indicación de nombre de servidor TLS porque el encabezado del Host es parte de la solicitud encriptada y el servidor no sabe qué certificado ofrecer sin esto.

Experimento divertido: obtenga datos de manipulación para Firefox (no he podido encontrar un equivalente para Chrome) y comience a manipularlos. Abra http://slipstation.com/ y edite el Host:encabezado en la solicitud para ser http://www.zombo.com/ . Verá un sitio web posiblemente familiar donde todo es posible.

Duncan X Simpson
fuente
En realidad, esos sitios usan la Indicación del nombre del servidor . No hay forma de saber qué sitio mostrar si ambos sitios están alojados en el mismo servidor a través de HTTPS sin SNI, ya que el servidor no sabe qué certificado usar.
Cepillo de dientes
Oh, interesante. ¿Mi experimento seguirá funcionando?
Duncan X Simpson
Sí, si encuentra dos sitios que están alojados en la misma dirección IP a través de HTTP.
Cepillo de dientes
Pero no HTTPS es lo que estaba preguntando.
Duncan X Simpson
No, no debería funcionar sobre HTTPS. Si lo hace, hay una vulnerabilidad de seguridad en el servidor web.
Cepillo de dientes
5

El servidor web se puede configurar para aceptar solo conexiones a un dominio o subdominio en particular. Podría estar alojando múltiples dominios.

Lo que hace el servidor web cuando se usa una dirección IP directa es configurable. En el caso de Apache, irá por defecto al primer vhost nombrado de los sitios habilitados, que se ordenan alfabéticamente.

Esta es la parte más relevante de la documentación de Apache que he encontrado, después de una búsqueda rápida:

https://httpd.apache.org/docs/current/vhosts/name-based.html

paradroid
fuente