Apache vhost não funciona de forma consistente

Apache vhost não funciona de forma consistente

Eu tenho um vhost no meu servidor cujo único objetivo é retornar o endereço IP do cliente:

petrus@bzn:~$ cat /home/vhosts/domain.org/index.php
<?php echo $_SERVER['REMOTE_ADDR']; echo "\n" ?>

Isso me ajuda a solucionar problemas de rede, especialmente quando há NAT envolvido. Como tal, nem sempre tenho resolução de nomes de domínio e este serviço precisa de funcionar mesmo que seja consultado pelo seu endereço IP.

Estou usando desta forma:

petrus@hive:~$ echo "GET /" | nc 88.191.133.41 80
191.51.4.55

petrus@hive:~$ echo "GET /" | nc ydct.org 80
191.51.4.55

router#more http://88.191.133.41/index.php
88.191.124.254

No entanto, descobri que não estava funcionando pelo menos em um computador:

petrus@seth:~$ echo "GET /" | nc ydct.org 80
petrus@seth:~$

petrus@seth:~$ echo "GET /" | nc 88.191.133.41 80
petrus@seth:~$

O que eu verifiquei:

Isso não está relacionado ao ipv6:

petrus@seth:~$ echo "GET /" | nc -4 ydct.org 80
petrus@seth:~$ 

petrus@hive:~$ echo "GET /" | nc ydct.org 80
2a01:e35:ee8c:180:21c:77ff:fe30:9e36

netcata versão é a mesma (exceto plataforma, i386 vs x64):

petrus@seth:~$ type nc
nc est haché (/bin/nc)
petrus@seth:~$ file /bin/nc
/bin/nc: symbolic link to `/etc/alternatives/nc'
petrus@seth:~$ ls -l /etc/alternatives/nc
lrwxrwxrwx 1 root root 15 2010-06-26 14:01 /etc/alternatives/nc -> /bin/nc.openbsd

petrus@hive:~$ type nc
nc est haché (/bin/nc)
petrus@hive:~$ file /bin/nc
/bin/nc: symbolic link to `/etc/alternatives/nc'
petrus@hive:~$ ls -l /etc/alternatives/nc
lrwxrwxrwx 1 root root 15 2011-05-26 01:23 /etc/alternatives/nc -> /bin/nc.openbsd

Funciona quando usado sem o tubo:

petrus@seth:~$ nc ydct.org 80
GET /
2a01:e35:ee8c:180:221:85ff:fe96:e485

E a tubulação funciona pelo menos com um serviço de teste ( netcatescutando em 1234/tcp e saída para stdout)

petrus@bzn:~$ nc -l -p 1234
GET /
petrus@bzn:~$

petrus@seth:~$ echo "GET /" | nc ydct.org 1234
petrus@seth:~$

Não sei se esse problema está mais relacionado a netcatou Apache, mas agradeceria qualquer indicação para solucionar esse problema!

bzné o servidor, hiveé um cliente funcional e sethé o cliente no qual tenho o problema.

Editar: Funciona também com, telnetmas telnetnão permite tubulação.

2ª edição em resposta a MickeyB:

Na verdade, os cabeçalhos do host não são transmitidos, mas como visto no hivehost acima, configurei o defaultvhost do Apache para se comportar como ydct.orgo vhost:

petrus@bzn:/etc/apache2/sites-available$ cat default
<VirtualHost *:80>
        ServerAdmin webmaster@localhost
        ServerName 88.191.133.41
        ServerAlias 2a01:e1b:1:132:1a0a:a9ff:fec8:f0a9
        DocumentRoot /home/vhosts/ydct.org/
</VirtualHost>

No entanto, funciona com curl!

petrus@seth:~$ curl ydct.org
2a01:e35:ee8c:180:221:85ff:fe96:e485

Saída de apache2 -Spostado parahttp://pastebin.com/aSf446Jv

Mas gostaria de saber por que não funciona com netcat...

Responder1

Resumindo, é a versão do netcat que você está executando.

Testei a string de comando em minhas máquinas da seguinte maneira:

Mac OS X Leão:

yvaine:sqlite user$ echo -e "GET /" | nc 88.191.133.41 80
XX.XX.XX.168

FreeBSD:

[root@freebsd82 /usr/ports]# echo -e "GET /" | nc 88.191.133.41 80
XX.XX.XX.168

CentOS:

[root@kvm0001 ~]# echo -e "GET /" | nc 88.191.133.41 80
XX.XX.XX.168

Debian (versão 6)

root@debian:~# echo -e "GET /" | nc 88.191.133.41 80
XX.XX.XX.168

Só quando cheguei ao Ubuntu "lúcido" (que é o que você aparentemente está executando) é que recebi isto:

root@ubuntu:~# echo -e "GET /" | nc 88.191.133.41 80
root@ubuntu:~# 

Parece que o padrão do Ubuntu é nc.openbsd em vez de nc.traditional (que é o padrão no Debian). Depois de usar a versão tradicional, recebi o resultado desejado:

root@ubuntu:~# echo -e "GET /" | nc.traditional 88.191.133.41 80
XX.XX.XX.168

O que é curioso é que ambas as máquinas clientes possuem nc.openbsd, mas têm comportamento diferente. Claro, pode ser que um deles tenha uma versão diferente do nc.openbsd ou uma versão completamente diferente do Ubuntu. Em ambos, você pode sincronizar suas versões do nc.openbsd ou mudar para nc.traditional.

Responder2

Funciona para mim :)

michael@challenger:~$ echo -e "GET /\n" | nc 88.191.124.41 80
<html><body><h1>It works!</h1>
<p>This is the default web page for this server.</p>
<p>The web server software is running but no content has been added, yet.</p>
</body></html>

Se você está tentando acessar o vhost, está fazendo isso incorretamente. Você precisa enviar um cabeçalho Host: para identificar o host virtual que deseja usar.

A melhor maneira de usar o serviço 'qual é o meu IP' seria curl. Ei, olhe, vejo o mesmo problema do meu lado quando faço o que você está fazendo:

michael@challenger:~$ echo -e "GET /" | nc ip.mydomain.ca 80
michael@challenger:~$ curl ip.mydomain.ca
192.168.0.135


CONSERTE SEUS VHOSTS!!!

michael@challenger:~$ curl -v 88.191.124.41
* About to connect() to 88.191.124.41 port 80 (#0)
*   Trying 88.191.124.41... connected
* Connected to 88.191.124.41 (88.191.124.41) port 80 (#0)
> GET / HTTP/1.1
> User-Agent: curl/7.21.3 (x86_64-pc-linux-gnu) libcurl/7.21.3 OpenSSL/0.9.8o zlib/1.2.3.4 libidn/1.18
> Host: 88.191.124.41
> Accept: */*
> 
< HTTP/1.1 200 OK
< Date: Fri, 25 Nov 2011 22:11:31 GMT
< Server: Apache/2.2.14 (Ubuntu)
< Last-Modified: Wed, 25 Aug 2010 08:11:38 GMT
< ETag: "840d09-b1-48ea16e57f5a6"
< Accept-Ranges: bytes
< Content-Length: 177
< Vary: Accept-Encoding
< Content-Type: text/html
< X-Pad: avoid browser bug
< 
<html><body><h1>It works!</h1>
<p>This is the default web page for this server.</p>
<p>The web server software is running but no content has been added, yet.</p>
</body></html>
* Connection #0 to host 88.191.124.41 left intact
* Closing connection #0

Responder3

Defina um tempo de espera e tente novamente:

$ echo "GET /" | nc -w 3 88.191.124.41 80

informação relacionada