sábado, 29 de junio de 2013

Para programadores: Simular una conexión de red lenta

Cuando se desarrollan aplicaciones web se hace muy necesario para los programadores simular una conexión de internet que en la mayoría de las veces se asemeje a la conexión promedio del usuario promedio, aunque si bien es cierto que las velocidades de acceso a internet son cada vez mayores, no está demás comprobar el comportamiento de nuestra aplicación para velocidades más semejantes a las del usuario real promedio.

En mi caso particular, me gusta probar mis aplicaciones en conexiones promedio de 56kbps a 128kbps, aunque, por supuesto, el rendimiento será mucho mejor si en la realidad se supera este límite.


Generalmente mis desarrollos los mantengo alojados en un servidor en una red local o, en algunos casos, en mi propia PC en casa. Cuando se accesa a las direcciones locales o a "localhost/127.0.0.1" el rendimiento del sistema es vertiginoso. Cuando lo pruebo desde una conexión remota es cuando me doy cuenta que el rendimiento no es tan satisfactorio. Es por esto que me puse a indagar en internet sobre si existía algún "simulador" de redes lentas, o alguna herramienta en la cual se pudiera configurar la velocidad de la conexión.

Yo me he convertido en asíduo usuario de Linux, aunque sin mucha experticia, pero me ha dado resultados muy satisfactorios usar este sistema operativo para trabajar. Para este sistema operativo conseguí una herramienta perfecta para lo que deseaba según lo comentado arriba. Esta herramienta es la llamada tc (traffic control), la cual permite configurar los aspectos más "reales" de cualquier conexión promedio a internet (o inferior, o superior, según el gusto).

Sin agregar más detalles técnicos que pueden ser consultados en páginas especializadas en internet, les proveo los comandos de "tc" que me han resultado utilísimos y que se asemejan más a una conexión real:

Para la activación en direcciones locales (locahost/127.0.0.1) configuramos la interfaz de red "lo":
$> sudo tc qdisc add dev lo root handle 1: htb default 12
$> sudo tc class add dev lo parent 1:1 classid 1:12 htb rate 56kbps ceil 128kbps
$> sudo tc qdisc add dev lo parent 1:12 netem delay 200ms

Para la desactivación:
$> sudo tc qdisc del dev lo root

Para consultar el estado actual del control de tráfico:
$> sudo tc -s qdisc ls dev lo

Si se desea utilizar para otras interfaces de red, tales como eth0..ethn o wlan0..wlann, sólo sustituimos lo por la interfaz que nos interese. Por ejemplo para la wifi: wlan0, nos quedaría como sigue:
Activación:
$> sudo tc qdisc add dev wlan0 root handle 1: htb default 12
$> sudo tc class add dev wlan0 parent 1:1 classid 1:12 htb rate 56kbps ceil 128kbps
$> sudo tc qdisc add dev wlan0 parent 1:12 netem delay 200ms
Desactivación:
$> sudo tc qdisc del dev wlan0 root

Sé que no es difícil escribir un script para ejecutar estos comandos y pasar la interfaz de red como parámetro. Algo así como $> slownet eth0 on/off. Eso prefiero dejárselo a otros expertos (o inexpertos aventureros, jejeje).

Espero que sea de utilidad para programadores web.

sábado, 22 de junio de 2013

Conexión SSH remota a un PC Linux dentro de una red LAN

No soy un experto Linux, pero en mis proyectos más reciente y personalmente estoy usando linux como sistema operativo. En varias ocasiones he tenido necesidad de conectarme de manera remota a algún PC o Servidor que se encuentra dentro de una red LAN para cumplir con algún mantenimiento, utilizando la herramienta ssh.

Esta LAN no está abierta para el acceso directo, pues la red LAN pertenece y es soportada por el cliente, por lo que casi siempre tengo obstáculos para conectarme (cortafuegos).

Para evitar estas situaciones protocolares con el cliente suelo instalar Logmein Hamachi, el cual tiene la gran ventaja de que funciona para los sistemas operativos que uso (Linux y Windows), y además me permite un acceso total por IP a través de una red virtual que mantiene unas direcciones IP estables.

En la mayoría de las ocasiones instalo esto en el servidor (Linux) para poder dar soporte directo al cliente.



Así para conectarme al servidor utilizo la IP que me otorga la red virtual de Hamachi de la siguiente manera:
$> ssh -l usuario <IP Hamachi>

Sin embargo he tenido últimamente necesidad de conectarme a más de un PC Linux dentro de esta red LAN. Lo primero que pensé fué en instalarle a todos esos PC el Logmein Hamachi, sin embargo no me agradaba la idea de tener esa lista extensa de PC's en mi lista de nodos de hamachi, por lo que busqué información sobre si era posible, teniendo un solo computador en la red virtual, conectarse a cualquier otro dentro de esa red LAN, y voilá: la herramienta ssh permite una conexión limpia a cualquier computador usando una sola IP virtual.

Lo único que hace falta es saber la dirección IP (o nombre, según cómo se use) del PC destino dentro de la red LAN.

Para esto se usa el comando ssh de la siguiente manera:
$> ssh -A -t -l <usuario del PC que tiene hamachi> <ip hamachi> ssh -l <usuario del PC en la LAN> <IP/nombre del PC en la LAN>

Así, suponiendo que la IP del computador que tiene instalado hamachi es 25.55.55.55, usuario1, y la IP del computador dentro de la LAN al que nos interesa conectarnos fuera 192.168.0.57, usuario2, el comando quedaría así:
$> ssh -A -t -l usuario1 25.55.55.55 ssh -l usuario2 192.168.0.57

Como es de esperar, la utilidad ssh pedirá las contraseñas de manera secuencial, es decir, primero la del PC con hamachi y luego la del PC en la LAN.

Si fuera necesario hacer más de un "salto" ssh a través de más de una red, el comando funciona de igual forma:
$> ssh -A -t -l usuario1 ip1 ssh -A -t -l usuario2 ip2 ... ssh -l usuarion ipn

Espero que sea de utilidad a aquellos que, como yo, no son tan expertos en este fabuloso sistema operativo.