Bonjour (Zeroconf) en Microsoft Windows

Investigando sobre Avahi, y tras una pequeña confusión con netbios, he aprendido que Microsoft Windows no entiende de mDNS, DNS-SD ni cosas de esas. Parece ser que necesita Bonjour, la implementación de Zeroconf de Apple.

Apple no ofrece Bonjour por separado, viene empaquetado con iTunes, Quicktime, iCloud, dos kilos de hormigón, una piedra en el riñón y una vaca muerta. Para instalar sólo Bonjour descargad iTunes, y en vez de ejecutar el instalador abridlo con 7zip o WinRAR. En su interior están los instaladores de la piedra en el riñón, la vaca muerta y Bonjour (bonjour.msi o bonjour64.msi), extraedlo e instaladlo.

En el caso de no querer descargar los ~150 MB de iTunes aquí dejo los instaladores de Bonjour para 32 y 64 bits.

  • Bonjour 32 bits: Bonjour.msi - 2,55 MB - MD5 e14a6762e68472c648ea0eea0ebe01a0

  • Bonjour 64 bits: Bonjour64.msi - 2,56 MB - MD5 8dcf5c9eaacdaf4568220d103f393dea

Más sobre Avahi

¿Y qué pasa si no puede instalarse en el dispositivo?

Es posible que en el dispositivo al que quiere accederse no sea posible instalar Avahi o Bonjour, por ejemplo un router. Se puede difundir el nombre e IP del ese equipo mediante mDNS a través de un tercer equipo que si tenga Avahi instalado. Esto es, el equipo A difunde el nombre e IP en nombre del equipo B.

Para esto es necesario añadir el nombre e IP del equipo en el archivo /etc/avahi/hosts de la misma forma que se haría en el archivo hosts del sistema operativo.

~$ echo " router.local" >> /etc/avahi/hosts

Y reiniciar avahi-daemon:

~$ service avahi-daemon restart

Dominios .local en tu red con Avahi

Avahi es la versión de Zeroconf para Linux y BSD. Implementa mDNS (Multicast Domain System) que permite asociar el nombre de un equipo a una IP sin necesidad de un servidor DNS del lado de la red local. Viene instalado de serie en algunas distros como Ubuntu. En el caso de la instalación mínima de Debian, como en la que estoy trabajando, es necesario instalarla manualmente.

¿Y por qué es útil?

Sencillamente porque permite acceder al dispositivo desde otros equipos de la misma red mediante su nombre más el dominio .local, sin necesidad de conocer su IP o tener que añadirla manualmente al archivo hosts. Por ejemplo a un servidor web o un NAS.

Para instalarlo en Debian:

~$ apt-get install avahi-daemon avahi-discover avahi-utils libnss-mdns mdns-scan

Con esos paquetes el equipo difundirá su nombre por la red mediante mDNS y además será capaz de descubrir otros dispositivos que usen Zeroconf (Avahi en Linux y BSD, y Bonjour en aparatos de Apple o con Windows).

Puede comprarse si funciona usando ping:

~$ ping nombredelequipo.local

Instalar Nginx en Debian

Hay muchas formas de instalar Nginx en Debian. Puede instalarse desde los propios repositorios del sistema operativo, desde los repositorios del proyecto o construirlo desde su código fuente. La opción que más me gusta es utilizar los repositorios del proyecto, ya que se dispone siempre de la última versión y por tanto de las actualizaciones de seguridad más reciente.

Lo primero es añadir los repositorios de Nginx a nuestra colección:

~$ cd /etc/apt/sources.list.d
~$ echo "deb wheezy nginx" >> nginx.list
~$ echo "deb-src wheezy nginx" >> nginx.list

En el caso de que Wheezy no sea la versión de Debian, hay que sustituirla por la correcta.

Ahora es necesario añadir la llave con la que los paquetes de ese repositorio han sido firmados. Sirve para asegurarnos de que los archivos que se instalan son efectivamente los que deben ser.

~$ wget -q -O- | sudo apt-key add -

Para instalarlo, simplemente:

~$ apt-get update && apt-get upgrade
~$ apt-get install nginx

Para saber si el servidor funciona, abrid localhost, o la IP del equipo donde se haya realizado la instalación, en un navegador.

De Debian Wheezy a Testing en dos pasos

Para actualizar Debian de la versión actual “Wheezy” a “Testing” sólo hay que cambiar los repositorios de nuestro sistema operativo. La lista de repositorios se encuentra en el archivo /etc/apt/sources.list. El archivo debe tener un aspecto parecido a este:

deb wheezy main
deb-src wheezy main

deb wheezy/updates main
deb-src wheezy/updates main

# wheezy-updates, previously known as 'volatile'
deb wheezy-updates main
deb-src wheezy-updates main

deb wheezy nginx
deb-src wheezy nginx

Sólo hay que modificar los repositorios pertenecientes a Debian, en mi caso los seis primeros ya que el séptimo y octavo pertenecen a otro software, Nginx. En cada uno de ellos hay que sustituir el nombre “wheezy” por “testing”, esto es.

deb testing main
deb-src testing main

deb wheezy/testing main
deb-src wheezy/testing main

# wheezy-updates, previously known as 'volatile'
deb testing-updates main
deb-src testing-updates main

deb wheezy nginx
deb-src wheezy nginx

Una vez cambiados los repositorios se guarda el archivo y se actualiza Debian con:

~$ apt-get update && upgrade

Why surveillance is not OK

I live in a country generally assumed to be a dictatorship. One of the Arab spring countries. I have lived through curfews and have seen the outcomes of the sort of surveillance now being revealed in the US. People here talking about curfews aren’t realizing what that actually FEELS like. It isn’t about having to go inside, and the practicality of that. It’s about creating the feeling that everyone, everything is watching. A few points:

1) the purpose of this surveillance from the governments point of view is to control enemies of the state. Not terrorists. People who are coalescing around ideas that would destabilize the status quo. These could be religious ideas. These could be groups like anon who are too good with tech for the governments liking. It makes it very easy to know who these people are. It also makes it very simple to control these people.

Lets say you are a college student and you get in with some people who want to stop farming practices that hurt animals. So you make a plan and go to protest these practices. You get there, and wow, the protest is huge. You never expected this, you were just goofing off. Well now everyone who was there is suspect. Even though you technically had the right to protest, you’re now considered a dangerous person.

With this tech in place, the government doesn’t have to put you in jail. They can do something more sinister. They can just email you a sexy picture you took with a girlfriend. Or they can email you a note saying that they can prove your dad is cheating on his taxes. Or they can threaten to get your dad fired. All you have to do, the email says, is help them catch your friends in the group. You have to report back every week, or you dad might lose his job. So you do. You turn in your friends and even though they try to keep meetings off grid, you’re reporting on them to protect your dad.

2) Let’s say number one goes on. The country is a weird place now. Really weird. Pretty soon, a movement springs up like occupy, except its bigger this time. People are really serious, and they are saying they want a government without this power. I guess people are realizing that it is a serious deal. You see on the news that tear gas was fired. Your friend calls you, frantic. They’re shooting people. Oh my god. you never signed up for this. You say, fuck it. My dad might lose his job but I won’t be responsible for anyone dying. That’s going too far. You refuse to report anymore. You just stop going to meetings. You stay at home, and try not to watch the news. Three days later, police come to your door and arrest you. They confiscate your computer and phones, and they beat you up a bit. No one can help you so they all just sit quietly. They know if they say anything they’re next. This happened in the country I live in. It is not a joke.

3) Its hard to say how long you were in there. What you saw was horrible. Most of the time, you only heard screams. People begging to be killed. Noises you’ve never heard before. You, you were lucky. You got kicked every day when they threw your moldy food at you, but no one shocked you. No one used sexual violence on you, at least that you remember. There were some times they gave you pills, and you can’t say for sure what happened then. To be honest, sometimes the pills were the best part of your day, because at least then you didn’t feel anything. You have scars on you from the way you were treated. You learn in prison that torture is now common. But everyone who uploads videos or pictures of this torture is labeled a leaker. Its considered a threat to national security. Pretty soon, a cut you got on your leg is looking really bad. You think it’s infected. There were no doctors in prison, and it was so overcrowded, who knows what got in the cut. You go to the doctor, but he refuses to see you. He knows if he does the government can see the records that he treated you. Even you calling his office prompts a visit from the local police.

You decide to go home and see your parents. Maybe they can help. This leg is getting really bad. You get to their house. They aren’t home. You can’t reach them no matter how hard you try. A neighbor pulls you aside, and he quickly tells you they were arrested three weeks ago and haven’t been seen since. You vaguely remember mentioning to them on the phone you were going to that protest. Even your little brother isn’t there.

4) Is this even really happening? You look at the news. Sports scores. Celebrity news. It’s like nothing is wrong. What the hell is going on? A stranger smirks at you reading the paper. You lose it. You shout at him “fuck you dude what are you laughing at can’t you see I’ve got a fucking wound on my leg?”

"Sorry," he says. "I just didn’t know anyone read the news anymore." There haven’t been any real journalists for months. They’re all in jail.

Everyone walking around is scared. They can’t talk to anyone else because they don’t know who is reporting for the government. Hell, at one time YOU were reporting for the government. Maybe they just want their kid to get through school. Maybe they want to keep their job. Maybe they’re sick and want to be able to visit the doctor. It’s always a simple reason. Good people always do bad things for simple reasons.

You want to protest. You want your family back. You need help for your leg. This is way beyond anything you ever wanted. It started because you just wanted to see fair treatment in farms. Now you’re basically considered a terrorist, and everyone around you might be reporting on you. You definitely can’t use a phone or email. You can’t get a job. You can’t even trust people face to face anymore. On every corner, there are people with guns. They are as scared as you are. They just don’t want to lose their jobs. They don’t want to be labeled as traitors.

This all happened in the country where I live.

You want to know why revolutions happen? Because little by little by little things get worse and worse. But this thing that is happening now is big. This is the key ingredient. This allows them to know everything they need to know to accomplish the above. The fact that they are doing it is proof that they are the sort of people who might use it in the way I described. In the country I live in, they also claimed it was for the safety of the people. Same in Soviet Russia. Same in East Germany. In fact, that is always the excuse that is used to surveil everyone. But it has never ONCE proven to be the reality.

Maybe Obama won’t do it. Maybe the next guy won’t, or the one after him. Maybe this story isn’t about you. Maybe it happens 10 or 20 years from now, when a big war is happening, or after another big attack. Maybe it’s about your daughter or your son. We just don’t know yet. But what we do know is that right now, in this moment we have a choice. Are we okay with this, or not? Do we want this power to exist, or not?

You know for me, the reason I’m upset is that I grew up in school saying the pledge of allegiance. I was taught that the United States meant “liberty and justice for all.” You get older, you learn that in this country we define that phrase based on the constitution. That’s what tells us what liberty is and what justice is. Well, the government just violated that ideal. So if they aren’t standing for liberty and justice anymore, what are they standing for? Safety?

Ask yourself a question. In the story I told above, does anyone sound safe?

I didn’t make anything up. These things happened to people I know. We used to think it couldn’t happen in America. But guess what? It’s starting to happen.

I actually get really upset when people say “I don’t have anything to hide. Let them read everything.” People saying that have no idea what they are bringing down on their own heads. They are naive, and we need to listen to people in other countries who are clearly telling us that this is a horrible horrible sign and it is time to stand up and say no.


048d:1336 Integrated Technology Express, Inc.

Hace tiempo que juego con el SDK de Android, ADB y sus máquinas vistuales, pero hoy, por primera vez, he probado a correr una aplicación directamente en un dispositivo conectado al ordenador.

Soy un tio raro, y para esto no iba a ser menos. El dispositivo es un CUBOT GT99, un teléfono móvil chino con un procesador Mediatek, y como era de esperar no ha sido fácil. Al conectarlo y comprobar si funcionaba me he encontrado con:

~$ adb devices
List of devices attached
???????????? no permissions

Claro, es lo Google dice al respecto:

If you’re developing on Ubuntu Linux, you need to add a udev rules file that contains a USB configuration for each type of device you want to use for development. In the rules file, each device manufacturer is identified by a unique vendor ID, as specified by the ATTR{idVendor} property. For a list of vendor IDs, see USB Vendor IDs, below.

El identificador que aparece para Mediatek en la lista es 0e8d y como suele pasar en estos casos no era correcto para este dispositivo. Así que me puse las gafas, volví a conectar el teléfono y…

~$ lsusb
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 004 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 002: ID 8087:0024 Intel Corp. Integrated Rate Matching Hub
Bus 002 Device 002: ID 8087:0024 Intel Corp. Integrated Rate Matching Hub
Bus 003 Device 002: ID 1058:1021 Western Digital Technologies, Inc. Elements 2TB
Bus 002 Device 003: ID 048d:1336 Integrated Technology Express, Inc.
Bus 002 Device 004: ID 07d1:3c0a D-Link System DWA-140 RangeBooster N Adapter(rev.B2) [Ralink RT3072]

¡Sorpresa! Ningún dispositivo concide con la ID proporcionada.

Tras identificar cada dispositivo y descartarlos uno a uno, llego a la conclusión de que el teléfono es el Bus 002 Device 003: ID 048d:1336 Integrated Technology Express, Inc.. Así que el identificador es 048d.

Me aseguro de que mi usuario pertenece al grupo plugdev y creo el archivo /etc/udev/rules.d/51-android.rules como administrador con el contenido:

SUBSYSTEM=="usb", ATTR{idVendor}=="048d", MODE="0664", GROUP="plugdev"

Y acabo con:

~$ sudo chmod a+r /etc/udev/rules.d/51-android.rules
~$ sudo udevadm control --reload-rules

Ahora si que aparece:

~$ adb devices
List of devices attached
0123456789ABCDEF device

Compartir una clave GPG

Existen dos métodos para compartir una clave pública PGP. La primera es creando una versión ASCII de la mísma y compartirla personalmente con nuestros contactos o incluyendola en nuestros correos electrónicos. Para ello crearemos el archivo con el comando:

~$ gpg --output 'clave.asc' --export -a E08F4856

E08F4856 es el identificador de la clave GPG que se desea compartir, en este caso corresponde a la clave creada en el artículo anterior. La opción -a indica a GnuPGP que la clave esté codificada en ASCII.

La otra opción es compartir la clave GPG en un servidor de claves como el del MIT o el de Symantec mediante el comando:

gpg --keyserver --send-keys E08F4856

Si la clave ha sido enviada correctamente la respuesta será:

"success sending to `' (status=200)"

De este modo quien quiera contactar con nosotros podrá encontrar nuestra clave pública mediante nuestra dirección de correo electrónico en esos servidores y descargarla.

Ambos métodos tienen sus peligros. Es recomendable entregar la clave pública a nuestros contactos personalmente, que cada uno verifique que la clave pertenece al propietario y que la firme para certificar su autenticidad.

Crear una pareja de claves con GnuPG

En el artículo anterior se explicó como revocar una clave GPG, pero claro, antes de revocarla hay que tener una. Por eso en este artículo explicaré como crear una pareja de claves GPG.

Para crear la pareja de claves puede utilizarse GnuPG (Si no te sientes cómodo usando la consola te recomiendo utilizar GPG4win, GPGTools o Seahorse). Está disponible para la mayoría de plataformas y en el caso de Debian puede instalarse con:

~$ sudo apt-get install gnupg

En Mac OSX puede instalarse mediante brew:

~$ brew install gpg

Una vez instalado el programa crear la clave es tan sencillo como:

~$ gpg --gen-key

Al ejecutar el comando el programa pregunta que combinación se desea para la pareja de claves.

gpg (GnuPG) 1.4.11; Copyright (C) 2010 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Por favor seleccione tipo de clave deseado:
(1) RSA y RSA (predeterminado)
(2) DSA y Elgamal
(3) DSA (sólo firmar)
(4) RSA (sólo firmar)
¿Su selección?: 1

Para cifrar y firmar archivos, correos electrónicos y mensajes es recomendable elegir una pareja RSA/RSA (opción 1).

La siguiente pregunta es el tamaño de la clave.

las claves RSA pueden tener entre 1024 y 4096 bits de longitud.
¿De qué tamaño quiere la clave? (2048) 4096
El tamaño requerido es de 4096 bits

En algunos foros se dice que ya es posible descifrar mensajes encriptados con claves RSA de 1024 bits, así que es preferible que el tamaño de la clave sea el mayor posible, en este caso 4096 bits

Por favor, especifique el período de validez de la clave.
0 = la clave nunca caduca
= la clave caduca en n días
w = la clave caduca en n semanas
m = la clave caduca en n meses
y = la clave caduca en n años
¿Validez de la clave (0)? 0

La caducidad de la clave es una cuestión personal. En mi caso prefiero cambiar la clave de forma anual.

Necesita un identificador de usuario para identificar su clave. El programa construye el identificador a partir del Nombre Real, Comentario y Dirección de Correo electrónico de esta forma:
"Heinrich Heine (Der Dichter) <>"

Nombre y apellidos: Jorge García
Dirección de correo electrónico:

Por último se solicita el nombre de usuario, una dirección de correo y un comentario. Su finalidad es identificar al usuario para terceras personas que busquen la clave pública. Los tres son opcionales.

Tras introducir los datos el programa comenzará la creación la clave. Para ello necesita entropía que se genera con movimientos del ratón, al apretar teclas del teclado y de otros elementos del equipo. A mayor tamaño más tiempo.

gpg: clave 29E1A667 marcada como de confianza absoluta claves pública y secreta creadas y firmadas.

gpg: comprobando base de datos de confianza
gpg: 3 dudosa(s) necesarias, 1 completa(s) necesarias, modelo de confianza PGP
gpg: nivel: 0 validez: 3 firmada: 0 confianza: 0-, 0q, 0n, 0m, 0f, 3u
gpg: siguiente comprobación de base de datos de confianza el: 2014-12-31
pub 4096R/29E1A667 2014-01-15
Huella de clave = 1924 89D9 4363 A8AE 4804 17D1 114D 7EDA 29E1 A667
uid <> Jorge García
sub 4096R/E08F4856 2014-01-15

Con esto ya tenemos nuestra clave PGP. Ahora ya podemos compartila con nuestros contactos, pero eso es otra historia.

Revocar una clave GPG

Una de las cosas que hago todos los Año Nuevo es renovar mis claves GPG. Para ello tengo que revocar las anteriores antes de publicar las nuevas.

Para inhabilitar una clave GPG es necesario crear un certificado de revocación. Es posible que en algún momento se pierda el acceso a la clave privada, sea comprometida o deje de usarse. Por eso es importante crear el certificado de revocación al crear la clave GPG y guardarlo en un lugar seguro (incluso impreso en papel). El comando para crear el certificado de revocación es:

~$ gpg --gen-revoke 0933F5A3

0933F5A3 es el identificador de la clave. Para ver las claves guardadas en el equipo y sus identificadores puede utilizarse el comando:

~$ gpg --list-keys

Al crear el certificado de revocación el programa pregunta por la razón por la que la clave es revocada (Si la clave ha sido comprometida, si ha dejado de usarse…) y por la contraseña de la mísma. GPG devuelve un certificado con un aspecto parecido a éste:

Version: GnuPG v1.2.4 (GNU/Linux)
Comment: A revocation certificate should follow



Es posible copiar el certificado y guardarlo en un archivo de texto, pero es mas cómodo enviar la salida del programa directamente a un archivo con:

~$ gpg --gen-revoke 0933F5A3 > cert_revoc.asc

A continuación se importa el certificado al llavero (no tengo muy claro si en castellano es así, en inglés es keyring) con:

~$ gpg --import cert_revoc.asc

Al importar el certificado se invalida la clave GPG. Solo queda enviar la clave revocada a todos los servidores donde la clave pública esté almacenada con:

~$ gpg --keyserver --send-keys 0933F5A3

Si la llave ha sido recibida correctamente por el servidor su respuesta es:

gpg: success sending to `' (status=200)

Y con estos pasos la clave ha sido revocada y puede procederse a crear una nueva para sustituirla, pero eso es otra historia.