Como os servidores da web sabem se você está usando acesso direto ao endereço IP?

64

Alguns servidores da Web, quando acessados ​​usando seu endereço IP, retornam um erro que não é permitido o acesso direto ao endereço IP.

Há algum tempo que me pergunto como isso funciona. Quero dizer, o navegador nem sempre resolve o endereço IP e se conecta a ele? O "acesso direto ao endereço IP" não está pulando o DNS? Como o servidor remoto sabe que você pulou o DNS?

Joseph A.
fonte
2
Pelo que me lembro, o que ele realmente pediu foi adicionado ao protocolo http muito cedo, a fim de fornecer servidores virtuais no mesmo host real.
JDługosz
3
É basicamente o mesmo processo que permite que um único servidor diferencie entre diferentes hosts virtuais. O servidor real mapeia uma URL para um de seus hosts virtuais. Muitos servidores não têm um substituto para um URL não mapeado, por padrão ou por padrão.
Manngo 14/03
Você pode ignorar o DNS, mas evite esse erro se criar uma entrada no arquivo hosts para o nome de domínio em questão. Seu navegador procurará o nome do domínio e o incluirá no cabeçalho Host:, mas nenhuma consulta DNS será feita devido à entrada do arquivo hosts.
Monty mais duro
A resposta para esse tipo de pergunta geralmente é porque você contou a eles .
Thomas

Respostas:

91

Para responder à sua pergunta de como ele sabe , isso tem a ver com o que o navegador envia ao servidor.

Você está certo de que o sistema sempre o resolve para um endereço IP, mas o navegador envia a URL que você tentou acessar no cabeçalho HTTP.

Aqui está um exemplo de cabeçalho que eu achei on-line, modificado para parecer que você usou o Firefox no Windows e digitou apple.comna barra de endereço:

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

Aqui está a aparência do cabeçalho se você usasse o endereço 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 seriam enviados para o mesmo endereço IP em um soquete, mas o navegador informa ao servidor o que ele acessou.

Por quê? Como os servidores da Web com o mesmo endereço IP podem hospedar vários sites e fornecer páginas diferentes para cada um. Ele não pode distinguir quem deseja qual página por endereço IP, porque todos eles têm o mesmo - mas pode distingui-los pelo cabeçalho HTTP.

iAdjunct
fonte
7
Ahh, faz muito mais sentido agora! Então, basicamente, o navegador envia para o IP o cabeçalho com o IP ou o domínio, e o site assume isso. Realmente, essas restrições são fáceis de contornar?
Joseph A.
7
Não é que seja uma restrição que você está ignorando, é só que você não está jogando bola e terá resultados estranhos.
IAdjunct
Essas solicitações HTTP são o que você obteria se estivesse usando um proxy. Sem um proxy, as informações vêm no hostcabeçalho. Veja este exemplo .
0xFE
2
bytec0de: A outra parte disso é que as configurações do servidor da Web geralmente são definidas com base no nome do host. O pacote IP especifica o endereço IP, o segmento TCP especifica o número da porta e o cabeçalho HTTP especifica o nome do host. Geralmente, os servidores são configurados para dizer "se o cliente / navegador solicitar exemplo.com, dê a eles". Eles podem ser configurados para também responder a endereços IP ou curingas (responder a qualquer coisa), mas muitas pessoas simplesmente copiam exemplos, e muitos exemplos preexistentes são baseados no nome de domínio fornecido pelo navegador.
TOOGAM 13/03/16
14
@ bytec0de Não é uma restrição . É mais como usar o número de telefone correto, mas o ramal errado - você ligou para o prédio certo, mas não para a pessoa certa. E o motivo de sua introdução também é praticamente o mesmo dos telefones - ele permite que você hospede vários sites separados no mesmo endereço IP (e porta TCP). Por exemplo, nosso servidor de desenvolvimento hospedou centenas de sites separados ao mesmo tempo e muitas soluções de hospedagem usam a mesma abordagem ("registre um domínio, aponte-o para o nosso endereço IP, nós cuidaremos do resto") .
Luaan 14/03/16
21

Com o protocolo HTTP 1.1 (a versão anterior do HTTP 1.0 fica obsoleta há algum tempo, portanto é improvável que seja usada por qualquer versão recente de um navegador), o hostcabeçalho foi introduzido. Para HTTP 1.1, é uma linha de cabeçalho necessária que deve ser emitida por um navegador . O nome do domínio é incluído pelo navegador nessa linha, por exemplo Host: example.com. Portanto, o servidor web sabe qual site o navegador deseja acessar a partir dessa linha. Como um servidor da web pode suportar dezenas de sites, essa linha é importante para determinar em qual site a página solicitada reside. Supondo que o navegador deseje acessar a página inicial de um site em example.com, ele emite a seguinte linha para o servidor quando ele se conecta ao servidor:

GET / HTTP/1.1

Essa linha especifica que o navegador deseja obter o documento raiz, ou seja, "/" para o site. Se você quisesse acessar /somedir/testpage.html, GET /somedir/testpage.htmlestaria na linha "obter". A linha será seguida pela linha abaixo:

Host: example.com

Portanto, se o servidor da Web suportar os sites example.com, someothersite.com, yetanothersite.org, etc., ele saberá que deve retornar a página principal de example.com. Se não receber essa linha ou se não houver um nome de domínio listado na Hostlinha, não saberá qual página inicial do site deve ser retornada. Portanto, ele pode retornar uma mensagem de erro ou retornar a página inicial de um site "padrão" para o servidor.

Você pode emitir os mesmos comandos que um navegador emite usando o protocolo telnet , por exemplo, a telnet example.com 80partir de um prompt de shell do Linux ou de uma janela do Apple OS X Terminal , para conectar-se à porta HTTP padrão, porta 80 - consulte Testando o acesso a um site usando PuTTY para obter as etapas para fazer isso com o PuTTY em um sistema Windows.

ponto da lua
fonte
3
Apenas uma observação: o cabeçalho do host também foi usado no HTTP 1.0, simplesmente não era necessário . O HTTP 1.1 tornou o campo obrigatório. Na prática, muitos servidores HTTP 1.0 simplesmente não funcionavam se o navegador não enviasse o cabeçalho do host (por todos os motivos descritos acima); portanto, a maioria dos navegadores o enviava de qualquer maneira.
Luaan 14/03
6

Isso ocorre devido ao Host:cabeçalho HTTP. Isso é bastante útil para hospedar vários sites no mesmo endereço IP. Por exemplo, http://www.k7dxs.net/ e http://www.philipgrimes.com/ estão no mesmo endereço IP. No entanto, por causa do Host:cabeçalho, eles podem mostrar dois sites diferentes.

Para HTTPS, como @Toothbrush apontou, eles usam a indicação de nome de servidor TLS porque o cabeçalho do host faz parte da solicitação criptografada e o servidor não sabe qual certificado oferecer sem isso.

Experiência divertida: obtenha dados de adulteração para Firefox (não consegui encontrar um equivalente para o Chrome) e comece a adulterar. Abra http://slipstation.com/ e edite o Host:cabeçalho na solicitação para ser http://www.zombo.com/ . Você verá um site possivelmente familiar, onde tudo é possível.

Duncan X Simpson
fonte
Na verdade, esses sites usam a indicação de nome de servidor . Não há como saber qual site será exibido se os dois sites estiverem hospedados no mesmo servidor por HTTPS sem SNI, pois o servidor não sabe qual certificado usar.
Escova de dentes
Oh, interessante. Minha experiência ainda funcionará?
Duncan X Simpson
Sim, se você encontrar dois sites hospedados no mesmo endereço IP por HTTP.
Escova de dentes
Mas não HTTPS é o que eu estava perguntando.
Duncan X Simpson
Não, não deve funcionar com HTTPS. Nesse caso, há uma vulnerabilidade de segurança no servidor da web.
Escova de dentes
5

O servidor da web pode ser configurado para aceitar apenas conexões com um domínio ou subdomínio específico. Pode estar hospedando vários domínios.

O que o servidor da web faz quando um endereço IP direto é usado é configurável. No caso do Apache, por padrão, ele irá para o primeiro vhost nomeado dentre os sites ativados, que são classificados alfa-numericamente.

Esta é a parte mais relevante da documentação do Apache que encontrei, após uma rápida pesquisa:

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

paradroid
fonte