Desde hace unos días estaba teniendo problemas con la conexión a Internet ADSL que me provee Telefónica de Argentina, a través de Speedy. Particularmente, para acceder a los sitios webs.
En un principio, atribuí el problema a mi proxy-caché local (squid) y a Privoxy, ya que paso por medio de estos dos y quizás alguno estuviera fallando, en especial squid. Para intentar localizar el problema, traté de conectarme usando telnet a alguno de los servidores a los que no podía conectarme (que me daban el error “Respuesta tamaño cero” o “Tiempo de espera agotado”), como por ejemplo, Google, y me sorprendí al ver que tampoco conseguía respuesta.

corrideat@quaik:~$ telnet Google.com 80
Trying 72.14.207.99...
Connected to Google.com.
Escape character is '^]'.
GET http://www.google.com/ HTTP/1.1
Host: www.google.com
User-Agent: Mozilla/4.0 (compatible; MSIE 4.0; Linux)
Connection: close



Intenté quitar la configuración de proxies de mis navegadores, pero tampoco funcionó. Entonces le atribuí el problema al modo transparente de squid que creí haber desactivado, por lo que procedí a parar al proxy, en vano.
Tiempo después me ocurrió algo extraño: me conecté a un servidor web que no era el que se correspondía por DNS a la petición que haría.
Lo que hice fue:

corrideat@quaik:~$ telnet msl37.org 80
Trying 72.52.177.44...
Connected to msl37.org.
Escape character is '^]'.
GET http://www.msl37.org/ HTTP/1.1
Host: www.google.com
User-Agent: Mozilla/4.0 (compatible; MSIE 4.0; Linux)
Connection: close

El servidor debió haber respondido

HTTP/1.1 200 OK
Date: Sun, 24 Jun 2007 02:04:59 GMT
Server: Apache/1.3.37 (Unix) mod_fastcgi/2.4.2 mod_gzip/1.3.26.1a mod_auth_passthrough/1.8 mod_log_bytes/1.2 mod_bwlimited/1.4 FrontPage/5.0.2.2635.SR1.2 mod_ssl/2.8.28 OpenSSL/0.9.7a PHP-CGI/0.1b
Last-Modified: Sun, 24 Jun 2007 02:04:29 GMT
ETag: “262802f-223-467dd12d”
Accept-Ranges: bytes
Content-Length: 547
Connection: close
Content-Type: text/html

<!DOCTYPE HTML PUBLIC “-//IETF//DTD HTML 2.0//EN”>
<!– Begin template –>
<HTML><HEAD>
<TITLE>msl37</TITLE>
</HEAD><BODY>
<!– Text block –>
THIS IS THE msl37 WEBSITE.<BR>
IF YOU ARE SEEING THIS, IT IS BECAUSE YOU ARE USING AN INCORRECT IP ADDRESS TO RESOLVE THE DOMAIN.<BR>
TRY <A HREF=”http://www.msl37.com.ar/>WWW.MSL37.COM.AR</A> INSTEAD, OR VERIFY YOUR DNS SETTINGS.<BR>
THIS SITE SHOULD RESOLVE <!– IP field –><B>200.29.4.70<B>.<BR> THANK YOU.<BR>
<!– End text block –>
<HR><I>The msl37 staff</I>
</BODY></HTML>

<!– End template –>

Pero en cambio, me respondió
HTTP/1.1 301 Moved Permanently
Date: Sun, 24 Jun 2007 01:46:18 GMT
Content-Type: text/html; charset=iso-8859-1
Connection: close
Server: Apache/2.2.3 (Debian) DAV/2 SVN/1.4.2 mod_python/3.2.10 Python/2.4.4 PHP/5.2.0-8+etch4 mod_ssl/2.2.3 OpenSSL/0.9.8c mod_perl/2.0.2 Perl/v5.8.8
Location: http://www.msl37.org/index.u/false

Lo cual me asombró, sobre todo la línea Server, que indica que no se trataba del servidor al cual iba dirig¡da la petición.
Ahí, eso, que me resultó extraño, me quedó en mi cabeza, causando intriga.
Este viernes (22 de junio) me ocurrió lo que me hizo llegar a la conclusión de que estoy atrás de un proxy: encontré la IP de un proxy chino en Internet. Ese proxy corría en el puerto 80. Entoces, lo configuré en mi navegador e hice una comprobación de mi IP, que en vez de devolverme la IP del proxy, me arrojó la mía propia.
Inmediatamente agarré telnet y procedí a establecer una conexión con ese proxy y pedir ese y otros sitios que arrojen mi IP, pero todo parecía indicar que algún proxy estaba procesando mis peticiones. Era difícil que sea mi squid, porque éste hace pasar el tráfico por Privoxy, y si pedía http://p.p/, la página de configuración de Privoxy, el servidor me cerraba la conexión.
Para asegurarme, reinicié mi PC y la arranqué con una distribución Live-CD, Necromantux. Configuré la red por DHCP, dejando que mi router configure la conexión, y comencé a hacer pruebas. Básicamente, probé conectarme a servidores como google.com y pedir otra web, por ejemplo, microsoft.com o yahoo.com. En todos los casos, se me respondía como si me hubiera conectado al servidor correcto. Pondré un ejemplo de lo que obtuve en una petición a microsoft.com:
necromantux / # telnet microsoft.com 80
Trying 207.46.197.32...
Connected to microsoft.com.
Escape character is '^]'.
HEAD http://www.msl37.org/ HTTP/1.1
Host: msl37.org
User-Agent: telnet/3.0 (compatible; GNU/Linux)

HTTP/1.1 301 Moved Permanently
Date: Sun, 24 Jun 2007 19:30:24 GMT
Content-Type: text/html; charset=iso-8859-1
Connection: close
Server: Apache/2.2.3 (Debian) DAV/2 SVN/1.4.2 mod_python/3.2.10 Python/2.4.4 PHP/5.2.0-8+etch4 mod_ssl/2.2.3 OpenSSL/0.9.8c mod_perl/2.0.2 Perl/v5.8.8
Location: http://www.msl37.org/index.u/false

Connection closed by foreign host.

Me apresuré e hice esta misma prueba desde el servidor de msl37. Ahí obtuve algo más coherente:
msl37@llaima:~$ telnet microsoft.com 80
Trying 207.46.197.32...
Connected to microsoft.com.
Escape character is '^]'.
HEAD http://www.msl37.org/ HTTP/1.1
Host: msl37.org
User-Agent: telnet/3.0 (compatible; GNU/Linux)

HTTP/1.1 301 Moved Permanently
Connection: close
Date: Sun, 24 Jun 2007 19:43:50 GMT
Server: Microsoft-IIS/6.0
X-Powered-By: ASP.NET
Location: http://www.microsoft.com
Content-Length: 31
Content-Type: text/html
Set-Cookie: ASPSESSIONIDAADSCTBQ=EABCBLMAHBOJBKJAMGOPDBIG; path=/
Cache-control: private

Connection closed by foreign host.

También probé conectarme, desde mi PC, a otros servidores, en este caso, IPs al azar.
La IP que elegí para hacer la demostración es 1.1.1.1, que está reservada por la IANA, y por eso no existe y probablemente nunca existirá en internet.
Entonces probé conectarme a esta Ip, al puerto 80. El resultado del proceso:
webserver / # telnet 1.1.1.1 80
Trying 1.1.1.1…
Connected to 1.1.1.1.
Escape character is ‘^]’.
GET http://www.google.com/
<HTML><HEAD><meta http-equiv=”content-type” content=”text/html;charset=utf-8″>
<TITLE>302 Moved</TITLE></HEAD><BODY>
<H1>302 Moved</H1>
The document has moved
<A HREF=”http://www.google.com.ar/”>here</A>.
</BODY></HTML>
Connection closed by foreign host.

Una prueba más con este “host” inexistente:
webserver / # telnet 1.1.1.1 80
Trying 1.1.1.1…
Connected to 1.1.1.1.
Escape character is ‘^]’.
TRACE http://1.1.1.1/ HTTP/1.1
Host: 1.1.1.1
Max-Forwards: 0

HTTP/1.1 200 OK
Date: Mon, 09 Jul 2007 19:28:18 GMT
Content-Length: 66
Content-Type: message/http
Server: NetCache appliance (NetApp/6.0.5P2D2)

TRACE http://1.1.1.1/ HTTP/1.1
Host: 1.1.1.1
Max-Forwards: 0
Connection closed by foreign host.

Hasta acá se pueder ver que algo está procesando mis peticiones a ese puerto y pasándolas al servidor correcto. Haré una petición a mi Proxy local para que se pueda ver claramente a lo que me refiero:
webserver / # telnet server 8080
Trying 192:168::5...
Connected to server.
Escape character is '^]'.
GET http://google.com/
<HTML><HEAD><script>function PrivoxyWindowOpen(){return(null);}</script><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>301 Moved</TITLE></HEAD><BODY>
<H1>301 Moved</H1>
The document has moved
<A HREF="http://www.google.com/">here</A>.
</BODY></HTML><script>function PrivoxyWindowOpen(a, b, c){return(window.open(a, b, c));}</script>
Connection closed by foreign host.

webserver / # telnet server 8080
Trying 192:168::5...
Connected to server.
Escape character is '^]'.
TRACE http://1.1.1.1/ HTTP/1.1
Host: 1.1.1.1
Max-Forwards: 0

HTTP/1.0 200 OK
Server: squid/2.6.STABLE13
Date: Mon, 09 Jul 2007 19:38:52 GMT
Content-Type: text/plain
Content-Length: 52
Expires: Mon, 09 Jul 2007 19:38:52 GMT
X-Cache: MISS from quaik.localnet.pc
X-Cache-Lookup: NONE from quaik.localnet.pc:8080
Via: 1.0 quaik.localnet.pc:8080 (squid/2.6.STABLE13)
Proxy-Connection: close

TRACE / HTTP/1.0
Host: 1.1.1.1
Max-Forwards: 0

Connection closed by foreign host.

Como se ve, el proxy-caché recibe la petición, la realiza al servidor adecuado (google.com) y me la devuelve. También se puede observar que pasó a través de Privoxy, por la función JavaScript.
En el segundo caso, vemos que la petición TRACE nos devuelve la identificación del proxy.
Conectándome desde otro servidor, que no pasa por ningún proxy-caché, la IP 1.1.1.1 no corre nada:
-bash-2.05b$ telnet 1.1.1.1 80
Trying 1.1.1.1...
telnet: Unable to connect to remote host: Connection timed out

También hice una prueba de esto con nmap desde mi PC:

webserver / # nmap -p80 1.1.1.1

Starting Nmap 4.20 ( http://insecure.org ) at 2007-06-24 17:06 ART
Interesting ports on 1.1.1.1:
PORT STATE SERVICE
80/tcp open http

Nmap finished: 1 IP address (1 host up) scanned in 0.529 seconds
webserver / # nmap -sV -p80 1.1.1.1

Starting Nmap 4.20 ( http://insecure.org ) at 2007-06-24 17:06 ART
Interesting ports on 1.1.1.1:
PORT STATE SERVICE VERSION
80/tcp open http?

Service detection performed. Please report any incorrect results at http://insecure.org/nmap/submit/ .


Al principio me fijo si el puerto 80 de 1.1.1.1 está abierto. Me dice que sí porque el proxy-caché está redireccionando las peticiones a ese puerto. En la segunda prueba, pongo a nmap a detectar el programa que está a la escucha de ese puerto. Entonces me responde que lo desconoce, como es de esperar, porque ese programa redirecciona a uno u otro servidor y no responde por sí. Si fuera un servidor “real” el que está en esa Ip, hubiera recibido algo como 80/tcp open http Apache httpd 1.3.23 ((Ubuntu) PHP/4.4.4 mod_perl/1.17 mod_ssl/2.8.6 OpenSSL/0.9.7i).
Espero haber sido claro e informativo. Cualquier ambiguedad o consulta, puede ser hecha a través del sistema de comentarios.
Saludos.