Clicky

Potentes herramientas para desarrolladores desde la línea de comandos

línea de comandos o consola

Curl, Ngrep, Netcat, Sshuttle, Siege y Mitmproxy

La vida como desarrollador web puede ser difícil cuando las cosas empiezan a ir mal. El problema puede estar en cualquier número de lugares. ¿Hay algún problema con las peticiones que enviamos?, ¿está el problema con las respuestas?, ¿hay algún problema con una petición a una biblioteca de terceros que utilizamos?, ¿está fallando una API externa?

Las buenas herramientas son de gran valor para averiguar dónde están los problemas, y también pueden ayudar a evitar que ocurran problemas en el primer lugar, o simplemente ayudarte a ser más eficiente en general. Las herramientas desde la línea de comandos son particularmente útiles porque se prestan bien a la automatización y secuencias de comandos, y se pueden combinar y reutilizar de todo tipo de maneras diferentes. Aquí veremos brevemente seis herramientas especialmente potentes y versátiles que pueden ayudar a hacer tu vida como desarrollador web un poco más fácil.

Curl

Curl es una herramienta de transferencia de red que es muy similar a Wget, la principal diferencia es que, por defecto, Wget guarda en un archivo y curl hace salidas a la línea de comandos. Esto hace que sea muy simple para ver el contenido de un sitio web. Aquí, por ejemplo, con el comando ifconfig.me podemos obtener nuestra IP actual o desde la línea de comandos la IP del servidor:

$ curl ifconfig.me
46.105.123.120

Las opciones de Curl -i (muestra encabezados) y -I (muestra sólo encabezados) hacen que sea una gran herramienta para la depuración de las respuestas HTTP y averiguar exactamente lo que nos está enviando un servidor :

$ curl -I www.vistaalmar.es

HTTP/1.1 200 OK
Server: Apache/2.2.15
P3P: CP="NOI ADM DEV PSAi COM NAV OUR OTRo STP IND DEM"
X-Logged-In: False
Expires: Mon, 1 Jan 2020 00:00:00 GMT
Cache-Control: max-age=600, private, must-revalidate
Pragma: no-cache
Vary: *,User-Agent,Accept-Encoding
Content-Type: text/html; charset=UTF-8
Content-Length: 135254
Date: Sat, 03 Nov 2012 14:13:24 GMT
X-Varnish: 861142978
Age: 0
Via: 1.1 varnish
Connection: keep-alive

La opción -L es muy útil, y hace que Curl siga automáticamente las redirecciones (enlaces salientes de nuestro sitio). Curl tiene soporte para autenticación básica HTTP, cookies, ajuste manual de encabezados y mucho, mucho más.

Ngrep

Para el análisis serio de paquetes de red existe Wireshark, con sus miles de configuraciones, filtros y opciones de configuración. También hay una versión desde la línea de comandos, TShark. Para tareas sencillas encuentro que Wireshark puede ser una exageración y, a menos que yo necesite algo más potente, ngrep es mi herramienta preferida. Te permite hacer con los paquetes de red lo hace grep con los archivos.

Para el tráfico Web casi siempre querremos que aparezcan las opciones -W byline, que conserva los saltos de línea, y -q  que es un argumento útil que suprime la parte de la producción adicional acerca de la no coincidencia de paquetes. Aquí hay un ejemplo que captura de todos los paquetes que contienen GET o POST:

ngrep -q -W byline "^(GET|POST) .*"

También se puede pasar a otras opciones de filtrado de paquetes, como limitar los paquetes adaptados a una serie de determinada IP o puerto. Aquí vamos a filtrar todo el tráfico que va o viene de Google, utilizando el puerto 80 y que contengan la palabra "search".

ngrep -q -W byline "search" host www.google.com and port 80

[Si no lo tienes instalado en tu servidor, en Centos 6.3 lo puedes hacer con un simple: $ yum install ngrep ]

Netcat

Netcat, o nc, es una autodenominada navaja suiza de redes. Es una aplicación muy simple pero también muy potente y versátil que te permite crear conexiones de red arbitrarias. Aquí vemos que está siendo utilizada como un escáner de puertos:

$ nc -z www.vistaalmar.es 20-100

Connection to www.vistaalmar.es 21 port [tcp/ftp] succeeded!
Connection to www.vistaalmar.es 25 port [tcp/smtp] succeeded!
Connection to www.vistaalmar.es 80 port [tcp/http] succeeded!

Además de crear conexiones arbitrarias, Netcat también puede escuchar las conexiones entrantes. Aquí se utiliza esta característica de nc, junto con tar, para una manera muy rápida y eficiente de copiar archivos entre servidores. En el servidor, ejecuta:

$ nc -l 9090 | tar -xzf -

Y en el cliente:

$ tar -czf dir/ | nc server 9090

Podemos utilizar Netcat para exponer cualquier aplicación en la red. A continuación exponemos una shell a través del puerto 8080:

$ mkfifo backpipe
$ nc -l 8080 0<backpipe | /bin/bash > backpipe

Ahora podemos acceder al servidor desde cualquier cliente:

$ nc example.com 8080

uname -a
Linux li228-162 2.6.39.1-linode34 ##1 SMP Tue Nov 4 10:29:24
EDT 2011 i686 GNU/Linux

Mientras que los dos últimos ejemplos son un poco artificiales (en realidad sería más probable usar herramientas como rsync para copiar archivos y SSH para acceso remoto a un servidor), sí muestran la potencia y flexibilidad de Netcat, y un indicio de las diferentes cosas que se pueden lograr mediante la combinación de Netcat con otras aplicaciones.

Sshuttle

Sshuttle permite acceder de forma segura a través de un túnel al tráfico de cualquier servidor al que se tenga acceso SSH. Es muy fácil de configurar y usar, no requiere la instalación de ningún software en el servidor o cambiar cualquier configuración de proxy local.

Con un túnel del tráfico a través de SSH, te aseguras contra herramientas como Firesheep y dsniff cuando estás en conexión Wi-Fi pública no segura o desde otras redes no confiables. Todas las comunicaciones de red, incluidas las solicitudes de DNS, se pueden enviar a través del servidor SSH:

$ sshuttle -r <server> --dns 0/0

Si se proporciona el argumento --daemon, Sshuttle se ejecutará en segundo plano como un demonio. En combinación con otras opciones, puede hacer que los alias se inicien fácil y rápidamente y detener el tráfico del túnel:

alias tunnel='sshuttle --D --pidfile=/tmp/sshuttle.pid -r
<server> --dns 0/0'
alias stoptunnel='[[ -f /tmp/sshuttle.pid ]] && kill
`cat /tmp/sshuttle.pid`'

También se pueden utilizar para moverse por sshuttle los filtros de geolocalización basados en IP que se utilizan ahora por muchos servicios, tales como BBC iPlayer, que requiere que estés en el Reino Unido, y Turntable, el cual requiere que estés en los EE.UU.. Para ello, necesitarás acceso a un servidor en el país de destino. Amazon tiene un nivel libre de instancias EC2 Micro que están disponibles en muchos países, o puedes encontrar un servidor privado virtual (VPS) barato en casi cualquier país del mundo.

En este escenario, en lugar de un túnel para todo nuestro tráfico, lo que se quiere es enviar el tráfico sólo por el servicio que está apuntando. Desafortunadamente, sshuttle sólo acepta los argumentos de direcciones IP y no nombres de host, por lo que tenemos que hacer uso de dig para resolver primero el nombre de host:

$ sshuttle -r <server> `dig +short <hostname>`

Siege

Siege es una herramienta de benchmarking HTTP. Además de las funciones de prueba de carga, cuenta con una práctica opción -g que es muy similar a la de Curl -iL, excepto que también muestra los encabezados de solicitud. He aquí un ejemplo con Google (he eliminado algunas cabeceras para abreviar):

$ siege -g www.google.com
GET / HTTP/1.1
Host: www.google.com
User-Agent: JoeDog/1.00 [en] (X11; I; Siege 2.70)
Connection: close

HTTP/1.1 302 Found
Location: http://www.google.co.uk/
Content-Type: text/html; charset=UTF-8
Server: gws
Content-Length: 221
Connection: close

GET / HTTP/1.1
Host: www.google.co.uk
User-Agent: JoeDog/1.00 [en] (X11; I; Siege 2.70)
Connection: close

HTTP/1.1 200 OK
Content-Type: text/html; charset=ISO-8859-1
X-XSS-Protection: 1; mode=block
Connection: close

Pero si Siege es realmente bueno es con la prueba de la carga del servidor. Al igual ab (una herramienta de benchmarking del servidor HTTP Apache), puede enviar un número de peticiones simultáneas a un sitio y ver cómo se maneja el tráfico. Con el siguiente comando, vamos a probar Vista al Mar con 20 conexiones simultáneas durante 30 segundos y, a continuación, obtener un buen informe final:

$ siege -c20 www.vistaalmar.es -b -t30s

** SIEGE 2.72
** Preparing 20 concurrent users for battle.
The server is now under siege...
Lifting the server siege... done.

Transactions: 317255 hits
Availability: 100.00 %
Elapsed time: 29.28 secs
Data transferred: 7328.26 MB
Response time: 0.00 secs
Transaction rate: 10835.21 trans/sec
Throughput: 250.28 MB/sec
Concurrency: 19.78
Successful transactions: 317255
Failed transactions: 0
Longest transaction: 1.00
Shortest transaction: 0.00

FILE: /root/siege.log
You can disable this annoying message by editing
the .siegerc file in your home directory; change
the directive 'show-logfile' to false.

Y lo comparamos contra una página de Google:

$ siege -c20 www.google.co.uk -b -t30s

** SIEGE 2.72
** Preparing 20 concurrent users for battle.
The server is now under siege...
Lifting the server siege... done.

Transactions: 100 hits
Availability: 100.00 %
Elapsed time: 29.72 secs
Data transferred: 1.02 MB
Response time: 5.08 secs
Transaction rate: 3.36 trans/sec
Throughput: 0.03 MB/sec
Concurrency: 17.08
Successful transactions: 100
Failed transactions: 0
Longest transaction: 5.09
Shortest transaction: 5.07

FILE: /root/siege.log
You can disable this annoying message by editing
the .siegerc file in your home directory; change
the directive 'show-logfile' to false.

Una de las características más útiles de Siege es que puede tener un archivo de las direcciones URL como entrada, y después hacer clic en las direcciones URL en lugar de sólo una sola página. Esto es ideal para pruebas de carga, ya que se puede jugar de nuevo contra el tráfico real de un sitio y ver cómo funciona, en lugar de golpear la misma URL una y otra vez. He aquí cómo se usaría Siege para reproducir los registros de Apache contra otro servidor para la prueba de carga:

$ cut -d ' ' -f7 /var/log/apache2/access.log > urls.txt
$ siege -c<concurrency rate> -b -f urls.txt

[Si no tienes instalado Siege en tu server Centos 6.3 lo puedes hacer con un simple $ yum install siege ]

Mitmproxy

Mitmproxy es un SSL-capable, man-in-the-middle proxy HTTP, que permite inspeccionar el tráfico HTTP y HTTPS, y pide reescritura sobre la marcha. La aplicación ha estado detrás de un buen número de escándalos de privacidad en aplicaciones iOS, incluyendo "Path"™s address book upload scandal". Su capacidad de reescribir peticiones sobre la marcha también se ha utilizado como objetivo del iOS, incluyendo el establecimiento de una fake high score in GameCenter.

Lejos de ser sólo útil para ver lo que están enviando las aplicaciones móviles a través del cable o para falsificar cuentas, mitmproxy puede ayudar con una amplia gama de tareas de desarrollo web. Por ejemplo, en lugar de estar constantemente presionando F5 o borrando la memoria caché para asegurarnos de que estamos viendo el contenido más reciente, se puede ejecutar:

$ mitmproxy --anticache

que automáticamente borrará todas las cabeceras de control de caché y te asegura de que siempre obtendrás el contenido actualizado. Por desgracia no configura automáticamente el reenvío como hace sshuttle, así que después de iniciar mitmproxy todavía se tiene que cambiar nuestro sistema o específicar la configuración de proxy del navegador.

Otra característica muy útil de mitmproxy es la capacidad de grabar y reproducir interacciones HTTP. La documentación oficial ofrece un ejemplo de un inicio de sesión de red inalámbrica. La misma técnica se puede utilizar como un marco Web de pruebas de base. Por ejemplo, para confirmar que funciona el flujo de registro de usuario, puedes iniciar la grabación de la sesión:

$ mitmdump -w user-signup

Luego pasar por el proceso de registro de usuario, que a estas alturas debería funcionar como se esperaba. Detener la grabación de la sesión con Ctrl + C . En cualquier momento podremos reproducir lo grabado y comprobar el código de estado 200:

$ mitmdump -c user-signup | tail -n1 | grep 200 && echo "OK" ||
echo "FAIL"

Si el flujo de registro se rompe en cualquier punto, vamos a ver un mensaje FAIL, en lugar de un OK. Se puede crear un conjunto completo de estas pruebas y ejecutarlas con regularidad para asegurarse de recibir una notificación si alguna vez hemos roto algo en nuestro sitio sin querer.

Aquí tienes una guía de instalación de Mitmproxy

¿Cuántas de estas herramientas utilizas habitualmente? ¿Qué comandos son tus preferidos? Si te apetece, háznoslo saber en los comentarios.

Jesus_Caceres