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

63

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

Eu tenho me perguntado por algum tempo como isso funciona. Quero dizer, o navegador não resolve sempre o endereço IP e se conecta a ele? Não é "acesso direto ao endereço IP" apenas ignorando o DNS? Como o servidor remoto mesmo sabe que você ignorou o DNS?

    
por Joseph A. 13.03.2016 / 15:35

4 respostas

90

Para responder a sua pergunta sobre como ele é conhecido , isso tem a ver com o que seu 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 cabeçalho de amostra que encontrei on-line, modificado para parecer que você usou o Firefox no Windows e digitou apple.com na 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

Veja como seria o 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ê? Porque os servidores da Web com o mesmo endereço IP podem hospedar vários sites e fornecer páginas diferentes para cada um. Não é possível 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.

    
por 13.03.2016 / 15:53
21

Com o protocolo HTTP 1.1 (a versão anterior do HTTP 1.0 ficou obsoleta por algum tempo, portanto é improvável que seja usada por qualquer versão recente de um navegador), o cabeçalho host foi introduzido. Para HTTP 1.1, que é uma linha de cabeçalho exigida que deve ser emitida por um navegador . O nome de domínio é incluído pelo navegador nessa linha, por ex. %código%. Portanto, o servidor da Web sabe qual site o navegador deseja acessar dessa linha. Como um servidor pode oferecer suporte a dezenas de sites, essa linha é importante para determinar em qual site a página solicitada reside. Supondo que o navegador queira acessar a página inicial de um site em example.com, ele emitirá a seguinte linha para o servidor quando ele se conectar 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 Host: example.com , /somedir/testpage.html estaria na linha "get". A linha será seguida pela linha abaixo:

Host: example.com

Portanto, se o servidor da Web estiver suportando os sites example.com, someothersite.com, yetanothersite.org etc., ele saberá que deve retornar a página principal para example.com. Se ele não obtiver essa linha ou não tiver um nome de domínio listado na linha GET /somedir/testpage.html , não saberá qual página inicial do site deve ser retornada. Portanto, ele pode retornar uma mensagem de erro ou retornar a home page de um site "padrão" para o servidor.

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

por 13.03.2016 / 17:17
6

Isso se deve ao cabeçalho Host: HTTP. Isso é bastante útil para hospedar vários sites no mesmo endereço IP. Por exemplo, o link e o link são ambos no mesmo endereço IP. No entanto, devido ao cabeçalho Host: , 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 do Firefox (não consegui encontrar um equivalente para o Chrome) e inicie a adulteração. Abra o link e edite o cabeçalho Host: na solicitação para ser link . Você verá um site possivelmente familiar, onde tudo é possível.

    
por 14.03.2016 / 04:38
4

O servidor da web pode ser configurado para aceitar apenas conexões com um domínio ou subdomínio específico. Poderia 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, ele irá, por padrão, ir para o primeiro vhost nomeado fora dos sites habilitados, que são ordenados alfa-numericamente.

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

link

    
por 13.03.2016 / 15:42