Utilizando rsync como un servicio
In English  

Si la computadora con la que nos queremos conectar no tiene el servicio de SSH (o RSH) corriendo, podemos configurar y utilizar rsync como un servicio en esa computadora. Esto haría que rsync escuche el puerto 873 por conexiones entrantes de otras computadoras utilizando rsync. Mientras que esto no es recomendable para la transferencia de archivos a través de redes inseguras, como lo es el Internet, debido a que la transferencia de datos no es cifrada, podemos utilizar esto para mantener información sincronizada entre diferentes computadoras en redes internas, así como realizar respaldos.

Hay dos diferentes maneras de tener rsync funcionando como servicio, una es lanzar el programa con el parámetro --daemon, y la otra es tener a inetd o a xinetd lanzando el programa y tenerlo corriendo como uno de los servicios que inetd o xinetd. Pero primero, debemos configurar el archivo /etc/rsyncd.conf y crear un archivo llamado rsyncd.secretos con los diferentes nombres de usuario a los que les será permitido conectarse al servicio de rsync.

Como ejemplo voy a hacer disponible una carpeta llamada Documentos dentro de mi carpeta personal (/home/juan) y mostrar como utilizar un comando para sincronizar desde una computadora diferente. Todos los usos que fueron cubiertos en la publicación Sincronizando carpetas con rsync pueden ser usados con rsync como servicio, lo único que cambia es la forma de direccionar ya sea la carpeta de origen o la carpeta de destino, la que sea que reside remotamente.

Temas
Configurando rsyncd.conf
Creando el archivo secretos
Lanzando rsync con el parámetro --daemon
Usando inetd para manejar el servicio de rsync
Utilizando xinetd para manejar el servicio de rsync
Conectándose al servicio de rsync

Configurando rsyncd.conf

Este archivo debe estar localizado en el directorio /etc, si no existe, necesitamos crearlo ahí. Abrimos el archivo en nuestro editor de texto preferido, voy a utilizar gedit para el ejemplo pero podemos utilizar cualquier editor como kato, nano, Vim, etc.

sudo gedit /etc/rsyncd.conf

En este archivo agregamos las siguientes lineas:

lock file = /var/run/rsync.lock
log file = /var/log/rsyncd.log
pid file = /var/run/rsyncd.pid

[documentos]
    path = /home/juan/Documentos
    comment = La carpeta documentos de Juan
    uid = juan
    gid = juan
    read only = no
    list = yes
    auth users = clientersync
    secrets file = /etc/rsyncd.secretos
    hosts allow = 192.168.1.0/255.255.255.0

Podemos dividir este archivo en dos secciones, los parámetros globales y la sección de módulos. Los parámetros globales definen el comportamiento de rsync. Además de los tres parámetros que uso aquí y que explico a continuación, podemos configurar cosas como el puerto que rsync estará escuchando, pero nos quedaremos con el default de 873.

  • lock file es el archivo que rsync utiliza para manejar el número máximo de conexiones
  • log file es donde rsync guarda un registro sobre su actividad; cuando comenzó a escuchar, cuando y de donde se conectan otras computadoras, y cualquier error que encuentre.
  • pid file es donde el servicio de rsync escribirá la ID del proceso que le fue asignada, esto es útil por que podemos utilizar esta id del proceso para detener el servicio.

Después de los parámetros globales, tenemos la sección de módulos, cada módulo es una carpeta que compartimos con rsync, las partes importantes aquí son:

  • [nombre] es el nombre que le asignamos al módulo. Cada módulo exporta un árbol de directorios. El nombre del módulo no puede contener diagonales o un corchete de cierre.
  • path es la ruta a la carpeta que estamos haciendo disponible con rsync
  • comment es un comentario que aparece junto al nombre del módulo cuando un cliente obtiene la lista de todos los módulos disponibles.
  • uid Cuando el servicio de rsync es ejecutado como root, podemos especificar que usuario es dueño de los archivos que son transferidos.
  • gid Esto nos permite definir el grupo que será dueño de los archivos que sean transferidos cuando el servicio es ejecutado como root.
  • read only determina si los clientes que se conectan a rsync pueden subir archivos o no, el valor por default de este parámetro es true (verdadero) para todos los módulos.
  • list le permite que el módulo sea listado cuando los clientes piden una lista de módulos disponibles, poniendo esto en false (falso) esconde el módulo del listado.
  • auth users es una lista de los usuarios que tienen permitido acceder al contenido de este módulo, los usuarios son separados por comas. Los usuarios no necesitan existir en el sistema, son definidos por el archivo secretos.
  • secrets file define el archivo que contiene los nombres de usuario y las contraseñas de los usuarios válidos de rsync
  • hosts allow son las direcciones que tienen permitido conectarse al sistema. Sin este parámetro cualquier computadora tiene permitido conectarse.

Creando el archivo secretos

Una vez que rsyncd.conf está apropiadamente configurado, necesitamos crear el archivo secretos. Este archivo contiene todos los nombres de usuario y las contraseñas que podrán conectarse al servicio de rsync, estos nombres de usuario y contraseñas son independientes de los usuarios que existen en el sistema, así que podemos crear usuarios que ya existen en el sistema sin problemas. Ya que especificamos el archivo /etc/rsyncd.secretos en rsyncd.conf, crearemos y editaremos este archivo en nuestro editor de texto preferido:

sudo gedit /etc/rsyncd.secretos

En este archivo agregamos los nombres de usuario y las contraseñas, uno por linea, separados por dos puntos (No utilizo contraseñas tan simples, y tu tampoco deberías):

clientersync:passWord
juan:PassWord
respaldo:Password
usuario:password

Finalmente, cambiamos los permisos de este archivo para que no pueda ser leído o modificado por otros usuarios, rsync fallará si los permisos de este archivo no están apropiadamente configurados:

sudo chmod 600 /etc/rsyncd.secretos

Lanzando rsync con el parámetro --daemon

Una vez que todo esta configurado, una de las maneras de usar rsync como servicio es lanzarlo con el parámetro --daemon. Si seguiste las instrucciones previas simplemente puedes utilizar este comando:

sudo rsync --daemon

Podemos ver si está funcionando revisando el archivo de registro que definimos en rsyncd.conf, en nuestro ejemplo este está localizado en /var/log/rsyncd.log. Adicionalmente, si el servicio está funcionando, el archivo /var/run/rsyncd.pid tendrá su identificador de proceso.

Si lanzamos rsync así, podemos detenerlo terminando su proceso, podemos obtener la ID del proceso leyendo los contenidos del archivo /var/run/rsyncd.pid y entonces invocando kill con esta ID del proceso, o podemos pasárselo directamente a kill utilizando:

sudo kill `cat /var/run/rsyncd.pid`

Usando inetd para manejar el servicio de rsync

inetd, InterNET Daemon, generalmente corre todos los servicios asociados con Internet, como FTP, telnet, y correo electrónico. Mientras que inetd sigue siendo utilizado, debido a preocupaciones de seguridad está siendo reemplazado por otros servicios, uno muy popular es xinetd (eXtended InterNET Daemon). Ya que rsync trabaja utilizando una conexión de Internet, podemos agregarlo a inetd o xinetd y permitirles manejarlo.

Para habilitar rsync en inetd, necesitamos abrir el archivo /etc/inetd.conf en nuestro editor de texto favorito y agregar la siguiente linea al mismo, asumiendo que rsync esté en /usr/bin como debe estar en las distribuciones de Linux:

sudo gedit /etc/inetd.conf

Entonces agrega la siguiente linea:

rsync stream tcp nowait root /usr/bin/rsync rsync --daemon

Cuando utilizamos inetd debemos asegurarnos de que el puerto 873 está apropiadamente mapeado a rsync en el archivo /etc/services, por default debe de estar, podemos revisar utilizando:

cat /etc/services | grep rsync

Debe de mostrarnos esto:

rsync 873/tcp

Si no ves esto, entonces abre el archivo /etc/services en un editor de texto y agrega esa linea.

Finalmente, reinicia el servicio de inetd:

killall -1 inetd

Utilizando xinetd para manejar el servicio de rsync

xinetd, eXtended InterNET Daemon, es un reemplazo ampliamente utilizado para inetd, ya que inetd no ofrece suficientes mecanismos de seguridad. El manejo de servicios es diferente de inetd. xinetd probablemente ya tiene una entrada para rsync que solo necesita ser activado, la configuración de rsync reside en el archivo /etc/xinetd.d/rsync, abre este archivo en tu editor de texto:

sudo gedit /etc/xinetd.d/rsync

y cambia la linea disable = yes a disable = no.

Si el archivo no existe todavía, puedes crearlo y editarlo:

sudo gedit /etc/xinetd.d/rsync

Y agrega las siguientes lineas a el:

service rsync
{
    disable         = no
    socket_type     = stream
    port            = 873
    protocol        = tcp
    wait            = no
    user            = root
    server          = /usr/bin/rsync
    server_args     = --daemon
    log_on_failure  += USERID
}

A diferencia de inetd, xinetd no necesita tener una entrada en /etc/services, puede manejar el puerto y el protocolo por si mismo. Si rsync está definido en /etc/services, las lineas puerto y protocolo pueden ser omitidas.

Y reinicia el servicio de xinetd:

killall -1 xinetd

Conectándose al servicio de rsync

Para conectarse a rsync cuando está corriendo como servicio, en vez de utilizar dos puntos como cuando estamos utilizando SSH, necesitamos usar un doble dos puntos, seguidos por el nombre del módulo, y el archivo o directorio que queremos copiar o sincronizar, podemos usar:

rsync -rtv usuario@direccion_servidor::modulo/origen/ destino/

Otra manera de acceder al archivo sería utilizando rsync:// seguido por la dirección del servidor, el módulo, y finalmente la localización de la carpeta que queremos acceder:

rsync -rtv rsync://usuario@direccion_servidor/modulo/origen/ destino/

Por ejemplo, tomando en consideración los parámetros dados en el ejemplo de el archivo rsyncd.conf que publiqué, una manera de transferir una carpeta llamada "origen" dentro de la carpeta /home/juan/Documentos sería usando cualquiera de estos dos parámetros, asumiendo que el servidor está localizado en 192.168.1.100

rsync -rtv juan@192.168.1.100::documentos/origen/ destino/
rsync -rtv rsync://juan@192.168.1.100/documentos/origen/ destino/

Solo recuerda que el usuario que aparece ahí es uno de los usuarios que definimos en /etc/rsyncd.secretos y no un usuario de la computadora servidor.