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
netcat
a 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 ( netcat
escutando 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 netcat
ou Apache
, mas agradeceria qualquer indicação para solucionar esse problema!
bzn
é o servidor,hive
é um cliente funcional eseth
é o cliente no qual tenho o problema.
Editar: Funciona também com, telnet
mas telnet
nã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 hive
host acima, configurei o default
vhost do Apache para se comportar como ydct.org
o 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 -S
postado 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