¿Como hacer funcionar Firefox3 con Proxy FTP transparente (Frox)?


No sé si les ha pasado, pero si tienen un proxy transparente frox corriendo en un gateway/router a internet, habrán notado que firefox3 no abre los sitios ftp pero cualquier otro cliente de ftp (hasta donde yo sé) sí los abre sin problemas.

Y me volví casi loco (aunque un poco loco ya estaba de antes) tratando de descubrir qué pasaba. Me había agarrado rabia y todo…

Bueno, aquí explico qué pasaba y cómo lo solucioné.

Resulta que firefox no abría los ftp sino que se quedaba esperando como casi 1 minuto y luego devolvía 426 (Connection closed, transfer aborted).

Y así me hacía con cualquier servidor ftp que quisiera conectarme, inclusive con el mío público de Internet! o sea que el problema andaba localmente no parecía ser cosa del acceso a internet.

Obviamente que el problema era bien local: firefox versión 3.

Hice varias pruebas (inclusive mirar/modificar el fuente de frox, cambiar a modo debug a frox, configurar también a modo debug mi servidor ftp) pero la que me llevó a la solución fue utilizar wireshack para capturar los paquetes.

Capturé los paquetes de un cliente que funcionaba (el plano y llano comando ftp desde un terminal) y luego los paquetes que enviaba firefox3.

De esa captura de paquetes descubrí que firefox se quería conectar al puerto del host del ftp y no al puerto de mi servidor proxy ftp.

Entonces descubrí que firefox3 ignora del comando PORT el IP, entonces cuando firefox3 recibía un comando que le decía:

227 Entering Passive Mode (10,0,0,1,195,149)

En lugar de tomar ambos datos sólo tomaba el puerto (que por cierto se calcula así: 195*256+149 = 50069). Entonces firefox3 obviaba el host y consideraba que debía utilizar como host el mismo host que era el de la conexión de control (puerto 21 de ftp).

Entonces como mi servidor le estaba pidiendo que hiciera una conexión de datos al puerto 50069 (este puerto se elige aleatoriamente, sólo aplica a este ejemplo) en el IP 10.0.0.1, firefox3 simplemente obviaba la parte del IP y consideraba que el IP era el mismo del host donde estaba conectándose al puerto de control. Por ejemplo: ftp.gnome.org

Entonces eso hacía que en realidad se intentara conectar al otro host donde no había nadie (ningún servicio) esperando una conexión a ese puerto por lo tanto no funcionaba y se perdía la conexión después de un tiempo de espera agotado.

¿Cómo lo solucioné?

Pues, pensé, si firefox quiere conectarse al mismo host del ftp siempre y yo necesito que se conecte al servidor. Entonces se me ocurrió que podía hacer creer a firefox 3 que se estaba conectando a donde él quería y listo, ya estaba solucionado. Y eso se lograría haciendo traducción de destino (DNAT).

Así que establecí que los puertos pasivos, activos, y de control altos de frox se quedaran solo limitados entre 40000 y 50000 (se logra con la configuración de frox). Eso lo hice para no tener que abarcar tantos puertos en la traducción. Luego cualquier conexión que fuera a esos puertos debía ser traducida al IP del servidor.

Con la regla de firewall siguiente se puede conseguir dicho objetivo:

iptables -A PREROUTING -i eth0 -p tcp -dport 40000:50000 -j DNAT –to-destination 10.0.0.1

Eso es válido para todo paquete que pretende entrar por eth0 a los puertos comprendidos entre 40000 y 50000 (a los que limité frox). Convirtiendo el destino (cualquiera sea originalmente) siempre en 10.0.0.1.

Que era lo que yo necesitaba que firefox3 hiciera.

Así que ahora firefox3 cree que todas las conexiones las está haciendo al host ftp al que se conecta pero en realidad las está haciendo con mi servidor, jaja.

Resultado final: Firefox 1 – Anyeos 2

Aclaración

Resulta que no sé si es así como debe cumplirse la implementación FTP. Aunque yo creo que sí, eso de obviar el IP y considerar que es el mismo del host ftp no me parece que esté cumpliendo con el estándar FTP. Aunque desconozco realmente si debe ser así, pero me parece raro que tantas aplicaciones lo hagan así, inclusive versiones anteriores de firefox y que firefox 3 ahora lo haga de esta forma.
Así que no puedo decir que firefox 3 está incumpliendo un estándar. Pero me deja pensando por qué está hecho así y yo creo que puede ser por razones de seguridad aunque no tiene sentido si la comunicación la hizo con un ftp quién va a querer iniciar un canal de datos con otro IP para robar información? No le veo tampoco el punto a la inseguridad que FTP sea así. Pero es una posibilidad. Si alguien tiene alguna idea al respecto le agradecería la comentara aquí.

Saludos.

  1. Deja un comentario

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: