Sincronización remota en 4 pasos con rsync

networking

A día de hoy es común que una persona tenga a su disposición dos ordenadores: un portátil y un sobremesa en casa. Con esta receta veremos cómo sincronizar el sobremesa de casa con nuestro portátil para o bien traer ficheros que estén en el sobremesa a nuestro portátil o bien hacer copias de seguridad del portátil al sobremesa, estemos donde estemos.

Necesitamos...

  • Obviamente: conexión a Internet en ambos ordenadores
  • Open SSH server (en el sobremesa)
  • rsync (en ambos ordenadores)

Primer paso: Servidor ssh en casa

Aquí trabajaremos exclusivamente con el ordenador de sobremesa.
Lo primero es lo primero, instalar el paquete openssh-server con

# apt-get install openssh-server

Con esto nuestro sobremesa ya tiene soporte para recibir órdenes remotas mediante ssh.

Segundo paso: Configurando el router

Seguimos en casa con nuestro sobremesa:
Como posiblemente (seguro) la conexión a Internet se hace mediante un router ADSL de la compañía X, hay que configurar el router para que dirija la conexión entrante por el puerto ssh (puerto 22) al ordenador, esto se hace siguiendo los siguientes pasos:

  1. Mirar la IP local del router, se puede hacer fácilmente con

    # route | grep default
    default         xxx.xxx.xxx.xxx    ...

    La dirección IP local del router es xxx.xxx.xxx.xxx (lo más seguro es que sea del tipo 192.168.x.1)

  2. Mira la IP local del ordenador, si estás conectado con cable:

    $ /sbin/ifconfig eth0

    y si estás conectado por inalámbrica:

    $ /sbin/ifconfig wlan0

    En la salida que te dé el comando busca en la segunda línea "Direc. inet" o "inet addr.". El número a su lado es la IP local de tu ordenador, que seguramente será del tipo 192.168.x.y

  3. Abre el navegador web
  4. Escribe en la barra de direcciones la IP local del router. Te saldrá un cuadro que te pedirá login para el router. Si no tocaste nada cuando te instalaron el router, el usuario y la contraseña serán "admin". Si cambiaste la configuración usa la que pusiste, y si no la cambiaste te insto a hacerlo, por seguridad.
  5. Dentro del router, pinchamos en un menú llamado "Advanced Setup" o similar, y en dicho menú vamos a la configuración "NAT"
  6. Una vez dentro, tenemos que crear (o añadir) un servidor virtual ("Virtual Servers"). Saldrá una tabla con los puertos que actualmente están abiertos, para qué servicio y hacia qué ordenador (mediante su IP) está dirigido. Encima o debajo de esa tabla habrá un botoncito de "add" y otro de "remove", pincha en "add".
  7. En "Server name", en la opción "select a server" expande el menú y selecciona "Secure Shell Server (SSH)" y debajo en "Server IP" pones la IP de tu ordenador.
  8. Automáticamente debería salir en una tabla debajo que los puertos para este servidor ("external port start/end" e "internal port start/end") son todos el 22 y el protocolo TCP. Abajo del todo, al terminar la tabla, hay un botón de "Save/Apply", pincha en él. Posiblemente te saldrá una ventanita diciendo que como el puerto 22 puede estar en uso, lo redirige al 2222 o alguno por ahí, dale a OK, no hay ningún problema, el software NAT sabe lo que hace para redirigir puertos (port forwarding)

IMPORTANTE: Si puedes configurar el servidor DHCP de tu router, haz que siempre asigne la misma IP a tu sobremesa. Si no puedes tiene arreglo: siempre que enciendas tu ordenador comprueba si la IP ha cambiado. Si cambió, debes repetir los pasos de configuración de NAT borrando el servidor virtual anterior y creando uno nuevo para la nueva IP de tu sobremesa.

Tercer paso: DNS para conectarse remotamente

Para este paso necesitamos trabajar en un ordenador conectado a la red local de casa, da igual si es nuestro sobremesa o nuestro portátil.
Este paso es significativamente más corto que el anterior en cuanto a explicación.
Dado que lo que queremos es acceder a nuestro ordenador de sobremesa cuando no estamos en casa, tener un DNS propio evita tener que memorizar la IP pública de tu router cada vez que lo enciendas (salvo que hayas contratado IP estática, cada vez que reinicies el router el servicio de conexión le dará una IP pública nueva).
Para obtener un nombre de dominio propio y gratuito podemos acudir a una página como DynDNS, donde podemos crear una cuenta gratuita y registrar la IP pública actual del router con un nombre de dominio gratuito. Para hacer esto, una vez que tienes la cuenta y has entrado en ella, debes seguir los siguientes pasos:

  1. Ir a "My services"
  2. Buscar "Host services" y pinchar en "Add hostname"
  3. Rellenar la cajita con un nombre de dominio válido (todo minúsculas, sin caracteres especiales...), por ejemplo "sobremesa-fulanito"
  4. En el menú de selección del "." elige uno gratuito, como por ejemplo "ath.cx", de forma que el nombre es "sobremesa-fulanito.ath.cx"
  5. En "Service type" marca la opción "Host with IP address"
  6. En "IP address" aparecerá un recuadro en blanco y debajo un texto en azul que dice "Use autodetected IP address xxx.xxx.xxx.xxx" (Usar dirección IP auto-detectada xxx.xxx.xxx.xxx), pincha ahí, la dirección xxx.xxx.xxx.xxx es la IP pública actual de tu router.
  7. No marques la casilla de "Mail routing" y dale a "Add to cart", sigue los pasos de "compra" (que sale por la cifra de 0.00$) y listos, tenemos nombre de dominio

IMPORTANTE: Cuando apagues y vuelvas a encender el router, entra de nuevo en tu cuenta, y en "Host services" pincha sobre tu nombre de dominio, mira si la IP de la cajita ha cambiado con respecto a la autodetectada y si es así, cámbiala y guarda los cambios.

NOTA: Este nombre de dominio sólo es útil para cuando estás fuera de tu red local de casa, ya que cuando estás "de puertas para dentro", no habría sido necesario configurar nada en el router, de hecho, si estás en tu casa, esto no tiene mucho sentido ya que es más lento que si coges un dispositivo USB, copias lo que sea y te lo llevas al otro ordenador y lo copias en él. Sin embargo, para pruebas de conectividad y que funciona, mira más abajo cómo hacerlo.

Cuarto paso: rsync

Necesitamos tener instalado en ambos ordenadores el programa rsync. Si no estuviese, lo instalamos con

# apt-get install rsync

Para más información sobre la gran cantidad de opciones de rsync, usar las páginas del manual del sistema sobre rsync. Nosotros necesitamos básicamente la opción -a para indicar a rsync que vamos a trabajar sobre archivos y si queremos -v para que nos muestre todo lo que va haciendo (modo verboso).

Una vez hecho todo esto, con nuestro sobremesa encendido en casa y todo puesto a punto, si queremos copiar algo del portátil al ordenador debemos escribir

$ rsync -av ruta_origen_en_portátil [usuario@]nombre-domino-sobremesa:/ruta_destino_en_sobremesa

Cuando rsync logre conectar por ssh al sobremesa, te pedirá la contraseña del usuario en el sobremesa (aunque puedes evitar que lo haga, mirando esta otra receta de David Villa) y una vez todo esté bien, rsync hará dos tablas de archivos: una del portátil y otra del sobremesa. Los archivos que no estén en el sobremesa los copiará, y si hay archivos más recientes los sobreescribirá. Hay que tener cuidado al usar esto, ya que podemos sobreescribir algo que no queríamos sobreescribir, añadir algo que no queríamos añadir...o borrar algo que no queríamos borrar, por eso lo mejor es trabajar con directorios vacíos en destino y directorios con sólo lo que nos interesa en el origen.

Si lo que queremos es hacer lo de antes desde el portátil pero que el sobremesa sea el origen, pues lo mismo pero cambiando el orden:

$ rsync -av [usuario@]nombre-domino-sobremesa:/ruta_origen_en_sobremesa ruta_destino_en_portátil

NOTA IMPORTANTE de SINTAXIS de RSYNC: Cuando una ruta de directorio tiene un espacio en blanco, en la terminal escribimos

$ cd directorio\ con\ espacios

Cuando una ruta de ese estilo tenemos que escribirla en rsync, debemos escribir \\\ en lugar de \ para que se pase bien el carácter blanco del espacio.

$ rsync <opciones> <ruta_origen> [usuario@]dominio:/ruta_a/directorio\\\ con\\\ espacios/

NOTA PARA NO INICIADOS: Para crear un directorio nuevo en el sobremesa desde el portátil usa el comando ssh:

usuario@portatil$ ssh [usuario@]nombre-dominio-sobremesa

y cuando hayas verificado tu identidad con la contraseña del usuario en el sobremesa, tu terminal cambiará a la del sobremesa y entonces puedes hacer:

usuario@sobremesa$ mkdir ruta_dir_padre/nombre_dir_nuevo
usuario@sobremesa$ exit

Y ya está, con esto tenemos sincronización básica entre nuestros ordenadores. Por supuesto hay miles de formas de mejorar esto, y se puede hacer muchas cosas con rsync.

Probando rsync y ssh desde casa

Los pasos 2 y 3 de esta receta son para poder acceder al ordenador de sobremesa que está detrás de un router cuando nosotros nos encontramos con el portátil en otra red distinta, pero, si queremos hacer pruebas de rsync y ssh entre el portátil y el sobremesa desde casa, no podemos usar el nombre de dominio, debemos usar directamente las IPs privadas de la red.

Por ejemplo, nuestro sobremesa tiene la IP privada 192.168.1.2, si queremos ejecutar comandos mediante ssh desde el portátil tendremos que hacer

$ ssh [usuario@]192.168.1.2

Si en vez de la IP hubiésemos escrito el nombre de dominio del paso 3, ssh nos dirá que la conexión fue rechazada, y lo mismo con rsync (puesto que usa ssh)

$ rsync <opciones> <ruta_origen> [usuario@]192.168.1.2:/ruta_destino

o viceversa, como hemos visto antes.

Para finalizar

Aquí en CRySoL hay más recetas sobre sincronización, control de versiones y ssh. Esta es sólo una forma más para sincronizar de forma remota un par de ordenadores. Con otras recetas se puede mejorar mucho lo que he explicado aquí, e insto a los curiosos e interesados en el tema a leerlas (por ejemplo sobre unison y git).

Referencias

Comentarios

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de david.villa

Solo una pequeña aclaración:

Solo una pequeña aclaración: ni git ni ningún otro sistema de control de versiones debería usarse como sistema de sincronización de ficheros o backup. Aunque se puede usar para tal cosa, hay que tener muy presente que los VCS llevan registro de todos los cambios (para eso sirven) y eso implica que resulta prohibitivo por rendimiento y ancho de banda, además del hecho de que se comportan bastante mal con ficheros binarios. Por si no fuera suficiente, los VCS distribuidos (como git) copian toda la historia, es decir, si tú hiciste 20 cambios a un fichero y luego yo actualizo mi copia, se trae los 20 cambios incluso aunque al final el fichero quedara como al principio. Eso puede ser muy útil para desarrollo pero es totalmente inútil (y caro) para sincronizar ficheros.

No soy portavoz de ningún colectivo, grupo o facción. Mi opinión es personal e intransferible.