Cómo transferir archivos de forma segura en Linux utilizando SCP

Scp Transfer Linux 00 Featured Image

Al transferir archivos a un servidor Linux remoto, tienes algunas opciones. Una de las mejores maneras es usar un programa llamado Secure Copy, o SCP, que se ejecuta sobre el protocolo SSH para transferir rápidamente archivos a través de tu red a un sistema remoto. Este tutorial te muestra cómo transferir archivos de forma segura utilizando SCP en Linux.

Tabla de Contenidos

  • Configuración de SSH
  • Conectando a tu sistema a través de SSH
  • Usando SCP para transferir archivos
  • Comprimiendo la transferencia de archivos en SCP
  • Optimizando una transferencia de datos con SCP
  • Limitando el uso de ancho de banda en SCP
  • Transferencia remota a remota con SCP
  • Usando un proxy con SCP
  • Cambiando el puerto por defecto en SCP
  • Usando el modo silencioso de SCP
  • Preguntas frecuentes

Configuración de SSH

En tu servidor remoto, necesitarás instalar un servidor SSH. El más común en Linux es el servidor OpenSSH. Para instalarlo, ejecuta uno de los siguientes comandos:

# Servidor basado en Debian/Ubuntu  
sudo apt install ssh  
  
# Fedora  
sudo dnf install openssh

Scp Transfer Linux 01 Installing Ssh

Dependiendo de tu distribución, puede que necesites permitir SSH a través de algunos firewalls de software. En Ubuntu, este problema no existe, pero en Fedora, también tendrás que ejecutar los siguientes comandos:

sudo firewall-cmd --add-service=ssh --permanent  
sudo firewall-cmd --reload

Scp Transfer Linux 02 Fedora Enable Firewall

Conectando a tu sistema a través de SSH

Antes de que puedas conectarte a través de SSH, necesitas averiguar la dirección IP del servidor remoto. En servidores gráficos, la dirección IP se muestra en el applet de red en la configuración del sistema. En la mayoría de los servidores, deberías usar el comando ip en el terminal.

ip addr

Scp Transfer Linux 04 Check Ip Address

En la salida, busca la línea que comienza con inet bajo ethX o enpXsy, dependiendo de cómo esté conectada tu interfaz de red al sistema. En mi caso, es 192.168.68.108.

Para probar la conexión SSH, muévete a otra máquina Linux y escribe:

ssh usuario@dirección.ip.del.servidor.remoto

Cambia “usuario” por el nombre de usuario real en el servidor.

Scp Transfer Linux 05 Connecting To Remote Server

Ingresa la contraseña de esa cuenta y ya estarás listo. Si aparece una pregunta sobre la “autenticidad del host no puede ser establecida”, solo responde “sí”. Es un chequeo de seguridad diseñado para asegurarte de que te estás conectando a tu servidor real y no a un impostor. Deberías ver el mismo aviso que aparece en tu sistema cliente que ves al iniciar sesión directamente en el servidor, lo que significa que la conexión fue exitosa. También deberías configurar tus conexiones SSH para máxima seguridad, o incluso configurar la autenticación de doble factor, antes de proceder al siguiente paso.

Usando SCP para transferir archivos

Ahora que has probado la conexión SSH, comienza a copiar archivos entre las dos máquinas. La copia segura se logra utilizando el comando scp. El formato básico del comando scp es:

scp /RUTA/AL/ARCHIVO USUARIO@DIRECCIÓN-IP:RUTA/AL/DESINO/DESEADO

Por ejemplo, para copiar el archivo “backup.tar.gz” desde la máquina local a la carpeta “backups” en el directorio personal del usuario “ramces” en el servidor remoto con dirección IP 192.168.68.165, usa:

scp backup.tar.gz [email protected]:~/backups/

Scp Transfer Linux 06 Basic Copying

Al igual que cuando te conectas con ssh, se te pedirá la contraseña. No se te pedirá el nombre de usuario, ya que se especificó en el comando.

También puedes usar comodines como el siguiente:

scp *.tar.gz [email protected]:~/backups/

Scp Transfer Linux 07 Glob Matching Copy

Para copiar un archivo desde el servidor remoto a la máquina local, simplemente invierte los parámetros:

scp [email protected]:~/backups/backup.tar.gz ./

Scp Transfer Linux 08 Inverse Copying

¿Notas el punto al final del comando? Significa “el directorio actual”, como lo hace con los comandos estándar cp o mv. Podrías especificar fácilmente otro directorio si así lo quisieras.

scp -r [email protected]:~/backups/ backups-del-servidor/

Y lo mismo con los comodines:

scp [email protected]:~/backups/*.txz ./

Para copiar recursivamente un directorio a un servidor remoto, usa la opción -r:

scp -r backups/ [email protected]:~/backups/

Scp Transfer Linux 09 Recursive Copying

Para copiar recursivamente un directorio desde el servidor remoto a la máquina local, utiliza:

scp -r [email protected]:~/backups/ ./

Scp Transfer Linux 10 Reverse Recursive Copying

Comprimiendo la transferencia de archivos en SCP

Aparte de la copia básica, también es posible modificar cómo SCP se comporta durante estas transferencias de archivos. Por ejemplo, puedes usar la bandera -C para comprimir los datos que SCP envía a los clientes remotos:

scp -C backup.tar.gz [email protected]:/home/ramces/

Esta opción funciona comprimiendo cada paquete de datos a medida que se envía a través del programa SCP. Por lo tanto, esto puede ser increíblemente útil si estás en una conexión limitada de ancho de banda y deseas enviar de manera confiable un archivo a un servidor remoto.

Scp Transfer Linux 11 Data Compression Copy

Al igual que las opciones anteriores, también puedes usar -C junto a la bandera -r para comprimir y transferir archivos recursivamente a una máquina remota. Por ejemplo, el siguiente comando comprime y recupera el archivo “backup.tar.gz” de mi servidor remoto:

scp -Cr [email protected]:/home/ramces/backups /home/ramces/

Scp Transfer Linux 12 Reverse Data Compression Copy

Optimizando una transferencia de datos con SCP

En su mayor parte, SCP intenta usar el algoritmo de encriptación AES-128 para todas sus transferencias de archivos. Sin embargo, hay instancias donde este algoritmo en particular no será adecuado para los archivos que deseas transferir.

Sabiendo esto, es posible optimizar aún más y asegurar SCP al cambiar directamente el algoritmo de cifrado para una transferencia específica. Para hacer esto, necesitas usar la bandera -c seguida del cifrado que deseas utilizar.

Por ejemplo, el siguiente comando transfiere el archivo “backup.tar.gz” a mi servidor remoto utilizando AES-256:

scp -c aes256-ctr ./backup.tar.gz [email protected]:/home/ramces/

Scp Transfer Linux 13 Change Default Cipher

Además, la opción -c también te permite proporcionar una lista de cifrados que deseas utilizar para una transferencia de archivos particular. Por ejemplo, el siguiente comando utiliza tanto AES-192 como AES-256 mientras transfiere el archivo “backup.tar.gz” a mi servidor remoto:

scp -c aes192-ctr,aes256-ctr ./backup.tar.gz [email protected]:/home/ramces/

Scp Transfer Linux 14 Create Cipher Preference List

Limitando el uso de ancho de banda en SCP

Mientras que comprimir los paquetes de archivo puede ayudarte a usar SCP en condiciones de red deficientes, también es posible limitar el ancho de banda que el programa utiliza durante una transferencia. Esto es útil en casos donde estás usando una conexión medida y no quieres que SCP domine tu ancho de banda de red.

Para limitar el ancho de banda efectivo del programa, necesitas usar la bandera -l seguida del límite superior que deseas en kilobit por segundo (Kb/s). Por ejemplo, ejecutar el siguiente comando transferirá el archivo “backup.tar.gz” a mi servidor remoto a un ancho de banda efectivo de 1,600 Kb/s:

scp -l 1600 ./backup.tar.gz [email protected]:/home/ramces/

Scp Transfer Linux 15 Limit Bandwidth During Copy

Transferencia remota a remota con SCP

Aparte de copiar archivos locales a tu servidor remoto y viceversa, también puedes usar SCP para administrar múltiples servidores remotos desde tu máquina local, ya que SCP solo se ocupa de la transferencia de archivos y no discrimina entre una máquina local y remota.

Para transferir entre dos servidores remotos, necesitas especificar explícitamente el nombre de usuario y la dirección de cada una de esas máquinas. Por ejemplo, ejecutar el siguiente comando transferirá mi archivo “remote-backup.tar.gz” entre mis dos servidores remotos:

scp [email protected]:/home/ramces/remote-backup.tar.gz [email protected]:/home/ramces/

Scp Transfer Linux 16 Remote To Remote Copy

Usando un proxy con SCP

Por defecto, SCP utiliza la dirección IP de tu máquina local siempre que transfiere archivos entre diferentes hosts. Si bien esto está perfectamente bien en situaciones normales, puede ser un problema si tu red local restringe cualquier actividad de SCP. Una forma rápida de solucionar este problema es pasar tu conexión local a través de un proxy SSH.

Para hacer esto, necesitas usar la bandera -o seguida de la opción ProxyCommand. Esto te permite crear una conexión SSH básica a una nueva máquina que, a su vez, ejecutará tu comando SCP. Por ejemplo, ejecutar lo siguiente creará un nuevo proxy SSH con una máquina remota y transferirá el archivo “backup.tar.gz” usándolo:

scp -o "ProxyCommand ssh [email protected] nc %h %p" ./backup.tar.gz [email protected]:/home/ramces/

Scp Transfer Linux 17 Ssh Proxy Bypass

Cambiando el puerto por defecto en SCP

Aparte de crear un proxy SSH básico, también puedes cambiar el puerto por defecto para SCP. Esto es especialmente útil si estás asegurando tu servidor Linux y no deseas exponer ningún puerto por defecto.

Para usar SCP con un puerto diferente, necesitas usar la bandera -P seguida del número de puerto que deseas utilizar. Por ejemplo, el siguiente comando copiará recursivamente mi directorio “backup” y se conectará a mi servidor remoto utilizando el puerto 2222:

scp -r -P 2222 ./backup [email protected]:/home/ramces/

Scp Transfer Linux 18 Using Custom Port

Usando el modo silencioso de SCP

Por último, también es posible eliminar completamente cualquier salida de terminal de un comando SCP. Esto es especialmente útil si deseas crear un script no interactivo que se ejecute en tu máquina. No solo eso, sino que también puedes automatizar completamente este proceso creando un cronjob y transfiriendo una clave SSH privada a tu servidor.

Para crear una transferencia SCP silenciosa, necesitas usar la bandera -q. Por ejemplo, el siguiente comando transferirá mi archivo “backup.tar.gz” silenciosamente a mi servidor remoto:

scp -q ./backup.tar.gz [email protected]:/home/ramces/

Scp Transfer Linux 19 Quiet Mode

Preguntas frecuentes

Mi transferencia remota a remota en SCP no funciona. ¿Cómo puedo solucionarlo?

Este problema es probablemente debido a un puerto bloqueado en uno de los archivos de configuración de tus máquinas remotas. Para solucionar este problema, asegúrate de que el puerto por defecto para SSH esté abierto en ambas máquinas.

Este problema también puede deberse a que una de tus máquinas remotas está detrás de una conexión CG-NAT, por lo que cualquier conexión externa a tu máquina remota no se resolverá correctamente. Para solucionarlo, necesitas usar un programa de LAN Virtual, como Yggdrasil, que te permitirá atravesar CG-NAT.

Ejecuté un proxy SCP y el host remoto cerró la conexión. ¿Qué puedo hacer?

Este problema es probablemente debido a un problema con tu máquina proxy. Para iniciar correctamente un proxy SSH, asegúrate de que la máquina que deseas usar tenga el servidor OpenSSH y netcat. Para instalar estos programas en Ubuntu, ejecuta el siguiente comando: sudo apt install ssh netcat.

¿Es posible conocer todos los cifrados disponibles para SCP?

Por defecto, el programa SCP se basa mucho en el protocolo SSH para sus funciones criptográficas. Debido a eso, puedes usar el programa SSH para imprimir una lista de los cifrados que puedes usar junto a SCP. Por ejemplo, puedes ejecutar ssh -Q ciphers para imprimir una breve lista de todos los cifrados disponibles en tu máquina.

Créditos de imagen: Unsplash. Todas las alteraciones y capturas de pantalla por Ramces Red.