systemadmin.es > Redes > ¿Quien resuelve las direcciones usando un proxy?

¿Quien resuelve las direcciones usando un proxy?

Una pregunta típica es quien resuelve los dominios si hay un proxy de por medio, ya sea transparente o configurado en el navegador. Vamos a ver los datos que circulan por la red.

Cuando se realiza una petición a un dominio sin proxy, por ejemplo systemadmin.es, primero de todo es el cliente el que debe resolver el nombre de dominio a la IP a la que conectarse:

08:09:12.045897 IP 10.10.10.1.54150 > 10.10.10.50.53:  45695+ A? systemadmin.es. (32)
08:09:12.087514 IP 10.10.10.50.53 > 10.10.10.1.54150:  45695*- 1/2/1 A 22.222.222.22 (110)

A continuación el cliente se conecta a dicha IP pare realizar la petición web:

GET / HTTP/1.1
User-Agent: curl/7.15.5 (i686-redhat-linux-gnu) libcurl/7.15.5 OpenSSL/0.9.8b zlib/1.2.3 libidn/0.6.5
Host: systemadmin.es
Accept: */*

El servidor contesta con los headers y el contenido:

HTTP/1.1 200 OK
Date: Wed, 20 Jan 2010 14:40:53 GMT
Server: Apache/1.3.33 (Debian GNU/Linux) mod_ssl/2.8.22 OpenSSL/0.9.7e mod_perl/1.29
SLASH_LOG_DATA: shtml
X-Powered-By: Slash 2.005000152
X-Bender: Oh, so, just 'cause a robot wants to kill humans that makes him a radical?
Connection: close
Transfer-Encoding: chunked
Content-Type: text/html; charset=iso-8859-1
(...)

En el caso que el navegador tenga configurado un proxy la petición funciona de la siguiente manera. La petición se realiza tal cual al proxy según este configurado:

GET http://systemadmin.es HTTP/1.1
User-Agent: curl/7.15.5 (i686-redhat-linux-gnu) libcurl/7.15.5 OpenSSL/0.9.8b zlib/1.2.3 libidn/0.6.5
Host: systemadmin.es
Pragma: no-cache
Accept: */*
Proxy-Connection: Keep-Alive

Este recibe que se quiere hacer la petición GET http://systemadmin.es, la realiza resolviendo primero el nombre del dominio y realizando la misma petición (según este configurado añadiendo headers) y devolviendo el resultado al cliente:

HTTP/1.0 200 OK
Date: Wed, 20 Jan 2010 14:39:02 GMT
Server: Apache/1.3.33 (Debian GNU/Linux) mod_ssl/2.8.22 OpenSSL/0.9.7e mod_perl/1.29
SLASH_LOG_DATA: shtml
X-Powered-By: Slash 2.005000152
X-Fry: Please, Mr. Nixon! We're appealing to your sense of decency!
Content-Type: text/html; charset=iso-8859-1
X-Cache: MISS from 222.22.22.22
Proxy-Connection: close
(...)

En el caso que exista un proxy transparente en la red el funcionamiento es similar al caso que no exista ningún proxy. Primero de todo se resuelve el dominio a la IP:

08:09:12.045897 IP 10.10.10.1.54150 > 10.10.10.50.53:  45695+ A? systemadmin.es. (32)
08:09:12.087514 IP 10.10.10.50.53 > 10.10.10.1.54150:  45695*- 1/2/1 A 22.222.222.22 (110)

A continuación se realiza la conexión a la IP resuelta, pero la conexión se intercepta y redirige al proxy configurado para procesar estas peticiones. La regla de iptables podría ser similar a la siguiente:

iptables -t nat -A PREROUTING -i eth0 -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 3128

Es el proxy entonces que interpreta los datos que recibe:

GET / HTTP/1.1
User-Agent: curl/7.15.5 (i686-redhat-linux-gnu) libcurl/7.15.5 OpenSSL/0.9.8b zlib/1.2.3 libidn/0.6.5
Host: systemadmin.es
Accept: */*

Mediante el GET reconoce que recurso se desea acceder y mediante el header Host a que dominio. Entonces procede a resolver el nombre de dominio de nuevo:

08:09:12.045897 IP 20.20.20.1.54150 > 10.10.10.50.53:  45695+ A? systemadmin.es. (32)
08:09:12.087514 IP 10.10.10.50.53 > 20.20.20.1.54150:  45695*- 1/2/1 A 22.222.222.22 (110)

Se conecta a dicha IP y realiza la petición devolviendo al resultado al cliente. La presencia de más o menos headers que puedan revelar la existencia del proxy es simplemente una cuestión de configuración.

Así pues, en el caso de la existencia de un proxy siempre es éste quien se encarga de resolver los dominios a una IP, por lo que nunca se va a hacer caso al fichero host local del cliente. Esta característica puede ser la más fiable a la hora de descubrir “a mano” la presencia de un proxy.

4 comments to “¿Quien resuelve las direcciones usando un proxy?”

  1. No queda claro el artículo.
    Pone
    “en el caso de la existencia de un proxy siempre es éste quien se encarga de resolver los dominios a una IP”,

    pero previamente se indica

    “en el caso que exista un proxy transparente en la red el funcionamiento es similar al caso que no exista ningún proxy. Primero de todo se resuelve el dominio a la IP”

  2. Efectivamente, se hace dos veces:

    • cliente resuelve DNS: systemadmin.es?
    • DNS responde: 1.2.3.4

    El cliente se conecta a 1.2.3.4:80, pasa por el gateway que tiene las iptables:

    iptables -t nat -A PREROUTING -i eth0 -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 3128
    

    Que significan: “todo lo que vaya al puerto 80, redirige al proxy”

    El proxy pilla los datos de la conexión:

    GET /
    Host: systemadmin.es
    

    El proxy pregunta al DNS:

    • systemadmin.es?
    • DNS responde: 1.2.3.4

    Entonces el proxy conecta al 1.2.3.4 y le manda la misma petición:

    GET /
    Host: systemadmin.es
    

    La web contesta al proxy y este le manda lo que le han respondido al cliente.

    Realmente la primera petición DNS solo sirve para decidir si lo que buscas esta en la misma red o esta fuera (pasa por el gateway) Si el DNS interno siempre contestara IPs inventadas externas podrías acceder igualmente a webs porque es la resolución DNS que hace el proxy es la que importa.

  3. Proxy nivel 3 -> Resuelve el proxy
    Proxy tranparente -> DNS equipo

  4. En realidad no. El una configuración con proxy transparente el cliente realiza una resolución DNS pero no importa el resultado siempre y cuanto pase por el proxy transparente. Será realmente el proxy el que realice la resolución que realmente cuenta.

    He hecho un dibujo aquí:

    http://systemadmin.es/2010/02/resolucion-dns-en-configuraciones-con-proxy

Deja un comentario:

XHTML - Tags permitidos:<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>