domingo, 18 de marzo de 2012

Servidor de archivos multimedia para Android usando GNU/Linux

Hola compañeros, antes de nada me gustaría anticipar que esta entrada va a ser un poquito larga, pero creo que a algunos de vosotros os puede merecer mucho la pena.

Ya hace tiempo que vengo usando un sistema bastante "curioso" para poder acceder desde mi tablet Android (Samsung Galaxy Tab 10.1) a mis archivos multimedia alojados en mi servidor con Debian GNU/Linux, y recientemente he conseguido lo mismo con el tablet de mi hermana (un iPad 2) y con el smartphone de mi primo (un Samsung Galaxy Mini).

El tema que nos ocupa es sencillo: poder reproducir desde el tablet o desde el móvil cualquier contenido multimedia en cualquier punto de la casa, ya sea en la cama, en el estudio, en el jardín (si lo hubiere), en el sofá, en el WC (¿y por qué no? xD) En resumen, desde cualquier punto físico en el que haya cobertura Wifi.

Lo cierto es que lo que os cuento no tiene ningún misterio, no se trata más que de un ordenador corriendo el servicio Samba que "exporta" aquellos directorios en los que tenemos alojada nuestra colección multimedia, ya sea películas, series, documentales, etc. De esta forma, el tablet, con los complementos adecuados, pasa de ser un mero artilugio para navegar por internet a convertirse en un auténtico reproductor multimedia. En mi opinión, esta es la manera definitiva de sacarle todo el partido al magnífico potencial multimedia que tiene un aparato de estos, por cierto infravalorados por mucha gente debido al desconocimiento generalizado de su potencial.

Pero por muy "elemental" que pueda parecernos a nosotros este sistema que os comento, la gente no deja de maravillarse cuando les muestro las cualidades de poder reproducir tantísimos archivos multimedia desde un tablet o desde un smartphone sin necesidad de que existan localmente en el dispositivo. Por lo visto la idea de que un tablet o un smartphone son similares a un ordenador no está muy extendida entre la gente.

Sin embargo, pese a que este sistema puede llevarse a cabo de una forma relativamente fácil, no quiero descuidar un aspecto muy importante: la seguridad. Al compartir en la red nuestros archivos, estamos permitiendo el acceso a ellos a una cantidad determinada de usuarios. Si esto no se gestiona adecuadamente, puede suponer un gran agujero de seguridad, sobre todo si nuestra red inalámbrica no es todo lo segura que debiera o si descuidamos los permisos sobre los archivos multimedia.

Así que después de esta introducción, pongámonos manos  a la obra.

Vamos a llevar a cabo este pequeño "proyecto" de forma que sea fácilmente ampliable en caso de que haya "futuras incorporaciones" en nuestra red multimedia. Para ello vamos a comenzar suponiendo que en nuestra red van a conectarse inicialmente tres usuarios, el primero de ellos el administrador, y los dos restantes usuarios limitados:

  • Usuario tony: administrador.
  • Usuario celia: acceso limitado.
  • Usuario jorge: acceso limitado.

Por supuesto, estos usuarios deben formar parte del sistema. Vamos a suponer también que el usuario administrador ya estaba inicialmente en el sistema, como suele ocurrir en nuestros equipos. Para añadir los dos usuarios restantes, podemos proceder con la herramienta gráfica destinada a ello, o mediante la terminal:

$ sudo adduser celia

Responderemos a las preguntas y confirmaremos la información introducida. Posteriormente haremos lo mismo con el segundo usuario:

$ sudo adduser jorge

Una vez tenemos generados los usuarios, vamos a crear un grupo llamado samba de tal forma que sólo los usuarios que formen parte de ese grupo tendrán acceso a nuestro servidor:

 $ sudo groupadd samba

Y para añadir los tres usuarios al grupo recién creado procedemos así:

$ sudo usermod -aG samba tony
$ sudo usermod -aG samba celia
$ sudo usermod -aG samba jorge

Si queremos comprobar que vamos bien, podemos ejecutar el comando groups seguido del nombre de usuario, de esta forma se listarán los grupos a los que pertenece un usuario.

Nótese que en caso de que en un futuro se incorpore a nuestra red un nuevo usuario, solo tendremos que añadirlo al grupo samba para que este usuario pueda disfrutar de nuestro servidor de archivos multimedia.

Bien, ahora instalaremos el servicio Samba. Como siempre, en Debian y derivados lo haremos así:

$ sudo aptitude install samba smbclient

Si el instalador nos hace una pregunta relativa al grupo de trabajo o Workgroup, podemos dejar el que está por defecto o poner uno a nuestro antojo. En mi caso, mi grupo de trabajo es Casa, original, ¿eh? ;-)

Después, procederemos a editar el fichero de configuración de Samba, cambiando nano por nuestro editor preferido:

$ sudo nano /etc/samba/smb.conf

Ahora es cuando hay que decidir cómo se quieren hacer las cosas. La teoría permite que cada recurso compartido por samba tenga sus propiedades particulares, de esta forma cada recurso puede tener permisos de acceso individuales y opciones de seguridad específicas. Pero para un caso como el que nos ocupa, considero que lo normal es que el usuario administrador tenga poderes absolutos sobre todos los archivos de todos los recursos, y los usuarios limitados tengan solamente permisos de lectura.

Por ello, lo que vamos a hacer es crearnos una sección personalizada dentro de la sección [global] donde pondremos "a saco" todas las opciones y permisos que nos servirán para todos los recursos compartidos presentes y futuros, y al final del fichero es donde iremos añadiendo los recursos compartidos.

Vamos pues a buscar la línea que dice bind interfaces only = yes (por ejemplo), dentro de la sección [global]. Nos situamos justo debajo para comenzar a escribir, dejando un par de líneas de espacio. Y a continuación, escribimos nuestra sección personalizada:

################################################################
#Modificaciones personales

writeable = yes
browseable = yes
guest ok = no
valid users = @samba
write list = tony
read list = @samba
################################################################

En mi caso particular tengo algún que otro modificador más, sobre todo relativos a máscaras de permisos y mecanismos de herencia, pero creo que para el caso que nos ocupa, esto es más que suficiente. 

Creo que puede entenderse más o menos el significado de cada línea. No profundizaré mucho en ello, pero cada línea viene a decir lo siguiente:

writeable = yes -> Se permite la modificación de los archivos y carpetas
browseable = yes -> Se permite la navegación por los archivos y carpetas
guest ok = no -> Se prohíbe el acceso de invitado al servidor
valid users = @samba -> Se permite el acceso al servidor únicamente a los usuarios del grupo samba
write list = tony -> Lista de usuarios con permisos de escritura (usuario administrador)
read list = @samba -> Lista de usuarios con permisos de lectura (usuarios limitados)

Ahora, para terminar con el aspecto de la seguridad, nos faltaría precisamente lo más importante. Debemos buscar, dentro de la sección Authentication, la línea comentada que dice security = user. Esta línea hace referencia al mecanismo de autenticación de Samba, algo extremadamente importante en un servicio como este. Los mecanismos de autenticación pueden ser dos:
  • share: los usuarios no necesitan autenticarse en el servidor, por tanto el acceso no puede ser controlado.
  • user:  es necesario autenticarse para acceder al servidor, por tanto, el usuario debe existir en el sistema.
Obviamente nosotros usaremos el mecanismo de autenticación por usuario, dejando así la línea en cuestión, y verificando que hemos quitado la almohadilla de principio de línea:

security = user

Y ahora sólo nos queda indicar qué carpetas de nuestro sistema se van a convertir en recursos compartidos.  Para ello nos situaremos al final del fichero y añadiremos tantas entradas como recursos tengamos de la siguiente forma:

[nombre_del_recurso]
          comment = descripcion_del_recurso
          path = ruta_al_recurso

En mi caso, tengo dos discos duros internos de dos terabytes cada uno dedicados exclusivamente a ficheros multimedia; el primer disco, llamado TOCHO, contiene películas y documentales, y el segundo disco, de nombre IGOR, contiene series. Así pues, las entradas necesarias para mi caso serían las siguientes:

[TOCHO]
          comment = Recurso para pelIculas y documentales
          path = /media/DISCOS/TOCHO

[IGOR]
          comment = Recurso para series
          path = /media/DISCOS/IGOR

Por supuesto, cada uno debe personalizárselo a su manera. Yo he preferido poner el mismo nombre para el disco y para el recurso porque de vez en cuando, si la necesidad de espacio libre apremia, reorganizo algunos archivos y los cambio de sitio, y así de esta manera no tengo que modificar Samba cada vez que lo hago.

También sería conveniente que la ruta del disco existiese aunque el disco no estuviese conectado, ya de de lo contrario, no tengo ni idea de cómo reaccionaría samba. Lo mejor para esto es crear la carpeta donde se montará siempre el disco, por ejemplo en la ruta /media/DISCO, y después crearse una entrada en el fichero /etc/fstab para ese disco de forma que cada vez que se conecte, el disco se monte sobre esa carpeta.

Bien, una vez guardado el documento, solo faltaría añadir a Samba los usuarios que van a acceder al servidor. ¿Pero eso no lo hemos hecho ya? La respuesta es no. Hemos añadido los usuarios al sistema operativo, pero no al servidor Samba. Faltaría, por así decirlo, darlos de alta en la lista de usuarios de Samba, que no tiene por qué ser la misma que la lista de usuarios del sistema. Para ello haremos lo siguiente:

$ sudo smbpasswd -a tony
$ sudo smbpasswd -a celia
$ sudo smbpasswd -a jorge

Con cada usuario se nos pedirá una nueva contraseña, que será la clave de acceso de cada usuario al servidor Samba.

Como apunte adicional, creo necesario mencionar un posible inconveniente con el acceso a los datos de los recursos. No debemos olvidar que Samba también tiene en cuenta los permisos locales de los archivos del servidor. Con esto quiero decir que debemos asegurarnos de que los datos de los recursos a los que van a acceder los usuarios tengan los permisos adecuados. 

Un ejemplo. Si ejecuto un ls (list) sobre la raíz de mi disco de Series, me podría encontrar con esto:

drwxr-xr-x   89   tony   tony   4,0K   mar   3 19:53   Series

¿Podría el usuario jorge acceder al interior de la carpeta Series? La respuesta corta es que sí podría, ya que la carpeta tiene habilitados los permisos de lectura (r) y ejecución (x) para otros. La respuesta larga es que sí podría, pero que sin embargo podríamos pensar que estamos "dejando pasar a demasiada gente", por así decirlo, ya que estamos permitiendo el acceso a usuarios que no están en la lista de acceso de la carpeta, en este caso, propietario tony y grupo tony.

Pero lo cierto es que no es necesario, bajo mi punto de vista, llegar al extremo de restringir también el acceso por esta vía. Me explicaré. Un usuario que ha intentado acceder a nuestro servidor Samba y lo ha conseguido (por ejemplo Jorge), significa que ha superado el filtro de seguridad que hemos establecido a nivel de recurso. Por tanto, esto quiere decir que este usuario pertenece por fuerza a nuestro sistema, y los permisos de lectura de que disfrutará (que no de escritura, ya que los tiene denegados por vía Samba a nivel de recurso) los determinarán los permisos locales de los elementos a los que acceda, ya sean archivos o carpetas.

Es por ello que ya disponemos de un filtro de seguridad muy efectivo a nivel de recurso compartido, por tanto no es necesario que establezcamos otro filtro de seguridad a nivel de elemento local, ya que, en teoría, estos usuarios sólo van a acceder a nuestro servidor a través de Samba. Así que teniendo esto en cuenta, únicamente debemos asegurarnos de que todos los elementos de nuestra colección (tanto archivos como carpetas) tengan permisos de lectura y ejecución para otros.

Bien, para hacer efectivos todos los cambios que hemos realizado en Samba, procedemos a reiniciar el servicio:

$ sudo /etc/init.d/samba restart

Si queremos comprobar que Samba está exportando debidamente los recursos que le hemos indicado, podemos lanzar lo siguiente:

$ smbclient -L localhost

Si todo ha ido bien, el sistema nos pedirá la contraseña del usuario que ha lanzado la orden, y si la introducimos correctamente, nos dará la lista de recursos compartidos por la máquina. En caso de ejecutarla un usuario que no haya sido dado de alta en Samba, arrojará un error de autenticación y no mostrará los recursos compartidos. Esto demuestra que nuestro servidor está funcionando correctamente. 

Y con esto, hemos terminado la parte relativa al servidor.

Ahora vamos a ver qué podemos hacer con nuestro dispositivo Android (tablet o smartphone) para poder acceder a nuestro servidor, y conseguir la tan ansiada reproducción multimedia a distancia ;-) En caso de disponer de un iPad, podemos ir directamente al tutorial para configurar el mismo.

Por supuesto, partimos de la base de que el tablet está conectado vía Wifi a la misma red local que el servidor Samba.

Primeramente necesitamos una forma de acceder a nuestros recursos de red. Es posible que rooteando el dispositivo pueda conseguirse el mismo efecto de forma nativa, pero nosotros lo vamos a hacer sin necesidad de acceso root (es posible que haya otras formas, así que acepto sugerencias).

El primer paso es acceder al Market, o al Play Store, como se llama ahora en mi tablet, y buscar la aplicación llamada ES Explorador de Archivos:


Esta aplicación, entre otras cosas, nos va a permitir acceder a recursos de red. Una vez instalada, la abrimos desde su lanzador, y nos encontraremos algo como esto:


Como podéis ver, esta aplicación está estructura por pestañas, y a nosotros nos interesa la pestaña LAN. Dicha pestaña, ahora vacía, será la que contendrá la lista de recursos compartidos a los que podremos tener acceso. 

Para crear un nuevo recurso, presionamos sobre el botón Nuevo y escogemos Servidor. Nos encontraremos algo así:


Bien, vamos a rellenar los campos con los siguientes datos, los demás los dejaremos vacíos:

Servidor: IP_del_servidor/nombre_del_recurso
Usuario: nombre de usuario con el que queremos acceder desde ese dispositivo determinado
Contraseña: la contraseña de acceso del usuario que hemos puesto arriba
Mostrar como: el nombre con el que se nos mostrará el recurso

En mi caso, la cosa quedaría así:


En lugar de IP he puesto el nombre de red del servidor, puesto que al tener un servidor DNS en mi red puedo hacerlo de esta forma, pero lo normal es que tengáis que poner la IP en lugar del nombre (otro día haremos un tuto sobre cómo montar un DNS casero).

Procederemos de esta forma con todos los recursos que tengamos (en mi caso dos) y cuando finalicemos, nos encontraremos con algo similar a esto:


Bien, este es el aspecto final de nuestra pantalla de recursos de red. Si todo ha ido bien, al entrar a algún recurso compartido nos encontraremos con todo su contenido, sea cual sea este. Así que, navegando por las carpetas necesarias, podemos llegar hasta donde tenemos nuestros archivos multimedia, y poder así reproducirlos. Pero para ello, necesitamos un reproductor que esté a la altura.

Nunca me ha funcionado bien el reproductor que lleva por defecto Android cuando he accedido a recursos de red. Sin embargo, hay un reproductor gratuito en el Market llamado MX Video que nos viene perfecto para nuestra tarea:


Una vez encontrado e instalado el reproductor MX Video, podemos acceder a través del explorador de archivos ES a nuestras carpetas de red, y buscar una carpeta que contenga archivos de vídeo:



Al acceder a alguno de estos vídeos, nos encontramos con un mensaje donde se nos pregunta el reproductor con el que queremos reproducir el archivo:


Así que ahora podemos elegir el reproductor MX Video para poder reproducir el archivo, y además hacerlo permanente para que no se nos vuelva a hacer esta pregunta.

Y este, compañeros, es el resultado final:


A partir de este momento, nuestro tablet o smartphone se ha convertido en un auténtico reproductor multimedia capaz de reproducir cualquier contenido que tengamos alojado en nuestro servidor, por supuesto sin necesidad de transferir los archivos al dispositivo.

Y todo ello con el nivel de seguridad que se merece. De esta forma, si hemos conectado los recursos con las credenciales de administrador, tendremos control total sobre los archivos, y podremos, por ejemplo, eliminar una película desde el tablet una vez la hayamos visto. Sin embargo, si hemos conectado los recursos con las credenciales de un usuario limitado, este usuario solamente podrá acceder en modo lectura a los archivos, sin posibilidad de hacer ninguna modificación. 

Como último apunte, si notáis que el reproductor MX va a trompicones o directamente no reproduce nada, puede ser debido a que por defecto usa el decodificador H/W. Debéis ir a las preferencias del reproductor, y cambiar al decodificador S/W.

Creedme, compañeros, que no tiene precio poder llevarse el tablet a la cama o al sofá y disfrutar sin despeinarse de cuatro terabytes de contenido multimedia ;-)

Y eso es todo amigos, espero que os haya resultado útil. Como ya he comentado, este tutorial sirve para cualquier dispositivo con Android en el que se puedan instalar las aplicaciones que hemos visto. Concretamente ha sido probado con éxito en tres dispositivos con Android: Samsung Galaxy Tab 10.1, Samsung Galaxy Mini y Samsung Galaxy S2. 

Por supuesto, se aceptan sugerencias, correcciones y críticas constructivas. Me reservo el derecho a escribir próximamente un tuto similar orientado al iPad.

Un saludo, y hasta pronto.

12 comentarios:

  1. la pantalla de mi galaxy mini es demasiado pequenia para ver pelis decentemente (mas, teniendo un monitor de 22" en la mesa), y mi red no me permite juguetear asi, pero me quedo con la parte del samba. siempre lo he tenido por cable con security=share, ahora ya se como hacerlo bien.

    por cierto... puesto que es android, por que no nfs??

    y 2. la parte de recursos desde android sigue sin quedarme clara. la mayoria de wifis se conectan con dhcp, con lo que la ip puede cambiar. estaria bien que explicaras, o como poner ips estaticas (trivial salvo que te conectes a mas de una red habitualmente), o como configurarel router para que, aun con dhcp entregue siempre una misma ip (problemon: depende del router), o la parte del dns, que parece la mas interesante. ;)

    PD> cachis...que y se suponia que me estaba peleando con el arranque de mi debian... ahora se me va a acumular el trabajo (aka, me han dado unas ganas enormes de hacerlo... no por el video, sino por la musica. al fin una manera simple de copiar la musica a android. AGH!!! NO!!! tengo que estudiar!!!!) :P

    ResponderEliminar
  2. ¡Hola niky! Muchas gracias por pasarte.

    Bueno, sí que es cierto que la pantalla de un Galaxy Mini es demasiado pequeña, pero para gustos... Mi primo está encantado con su Galaxy Mini y cada vez que viene por casa se conecta con su explorador de archivos a la red y se ve dos o tres capítulos de alguna serie, e incluso a veces alguna película, ¡todo esto en un móvil de 3 pulgadas!

    Bueno, lo que comentas sobre NFS es una muy buena pregunta. Lo cierto es que no lo he hecho con NFS por cuestiones de compatibilidad. Me explico: haciéndolo con NFS solamente podríamos conectarnos al servidor con un dispositivo en base Linux, sin embargo con Samba podemos conectarnos desde cualquier dispositivo, ya sea GNU/Linux, Android, iOS, MacOSX, Windows, etc. La idea de tener este servidor con Samba es que podamos conectarnos no sólo con Android, si no también con un PC o un tablet con Windows (que también los hay por ahí xD), con un iPad, con un iPhone, con un PC con GNU/Linux y en definitiva con cualquier dispositivo compatible con Samba, que hoy en día son casi todos, por no decir todos. En resumen, este servidor Samba nos sirve para prácticamente cualquier sistema operativo del mercado.

    En cuanto a lo de las direcciones IP tienes toda la razón, si hay más de un dispositivo que se conecta a la misma red puede haber problemas con el DHCP. Pero bueno, no lo he considerado de esa forma ya que he supuesto que al ser un servidor, este se comportaría como tal, es decir, siempre estaría encendido y con la misma IP. Pero muchas gracias por la idea, puede que una futura ampliación lo incluya ;-)

    Y por último, es evidente que aunque yo no lo haya mencionado en el tutorial, este sistema de cliente-servidor que venimos usando aquí también nos sirve para hacer transferencias de archivos entre el servidor y el tablet y viceversa. Así mismo es como yo copio la música de mi servidor a mi tablet para poder llevármela a cualquier parte. Así que niky te animo a intentarlo que verás como merece la pena ;-)

    ResponderEliminar
  3. respecto a nfs, windows se supone que tiene un cliente nativo (otra cosa que sea un dolor de cabeza hacerlo funcionar), andoroid, al estar basado en linux, imagino que tendra soporte, y... con cositas de apple no he tenido el placer de trabajar :S

    aun asi, samba es una apuesta segura... pero una esta demasiado acostumbrada a nfs. XDD

    pseud-edit:por cierto, como idea: el captcha parece una buena idea anti spam, pero creeme, mas de uno se desespera con el. mientras no recibas demasiados comentarios, el captcha no es una buena idea. ;) (digo... un blog con unos pocos comentarios al dia, se pueden revisar perfectamente a mano, y comprobar que no haya nada que no deba.)
    respecto al dhcp, muy pocos son los que tienen en casa un server 24/7. y aun asi, la ip se asigna periodicamente. mientras que en principio no deberia dar problemas, te aseguro que no seria nada raro ver que cambia la ip.

    y tema transferencias... seh, mi experiencia con el nfs se basa en eso. red local domestica. disco de 2 teras en el server, y resto de maquinas leyendo de ahi. windows includo (aunque este con samba, que el nfs era muy complicado). me pondre a ver que hay para el movil, porque el nfs ya esta montado (o algo asi, habria que tocar unas cositas....).

    cachisss... que tengo que estudiar!!! :P

    ResponderEliminar
  4. En efecto niky, así es como lo tengo yo montado en mi servidor, éste está continuamente corriendo Samba y NFS simultáneamente, Samba para cuando accedo al servidor con Windows, Android o iOS, y NFS para cuando accedo a través de GNU/Linux, que es la mayoría de las veces. Y no sólo para transferencias, si no también a modo de streaming.

    Muchísimas gracias por la recomendación del Captcha, intentaré evitarlos mientras sea posible, a mí tampoco me gustan nada (me desespero con ellos, palabra xD)

    ResponderEliminar
  5. Tony, excelente, me uno a niky, que este tutorial me a puesto en claro algunas cosas de samba que las tenia en el aire, y a las que le voy a sacar provecho, estoy ahora haciendo los pasos con mi Defy, mas que nada para ver los resultados, asi que apenas termine lo comento. Ah!!!, me quedo a la espera de como armar un servidor DNS, que nunca e entendido, lo único que e hecho es hacer un servidor LAMP.

    Saludos

    ResponderEliminar
  6. Muchísimas gracias Fanton, me alegro de que te haya servido, y espero que le saques todo el jugo a ese estupendo smartphone que tienes ;-)

    En cuanto a lo del servidor DNS, ya estoy dándole vueltas a la cabeza para ver cómo puedo abordar el asunto xD

    ResponderEliminar
  7. Yo soy más perezoso, yo meto directamente la música y pelis en la SD Card de mi Samsung Galaxy SII y me ahorro tener otra máquina enchufada xDD

    Excelente tutto ;)

    Un saludo

    ResponderEliminar
  8. Pues la verdad es que sí Yoyo, es una solución relativamente cómoda. Pero en mi caso tengo un ordenador que está 24 horas on-line, así que, ¿por qué no iba a meterle cuantas más cosas mejor? ;-)

    En cualquier caso, ¿qué pasa cuando no tienes en el móvil la película que quieres ver en un momento determinado? ¿O sencillamente te has visto todas las que ya tienes en el móvil y te has olvidado de meter nuevas?

    Yo solo te digo que tener un servidor multimedia con 4 TB de contenido accesible desde cualquier dispositivo en cualquier punto de la casa es prácticamente un sueño. ¡Es como si ampliaras los 16 GB que tiene tu tablet a 4 TB! xD

    ResponderEliminar
  9. Tony una pequeña corrección para la linea del reseteo de samba, la linea es:

    $ sudo /etc/init.d/samba restart

    ResponderEliminar
  10. ¡Uy! Muchísimas gracias Fanton, mi teclado me ha jugado una mala pasada ;-)

    Lo dicho, ¡mil gracias!

    ResponderEliminar
  11. No te compliques con dns y dhcp que no merece la pena.
    Ponle IP estática a tu server y jamás cambiará de IP aunque lo apagues...

    ResponderEliminar
  12. Este comentario ha sido eliminado por el autor.

    ResponderEliminar