SSH desde Mac: cómo conectar a un servidor de forma segura, de cero a experto
Guía completa de SSH desde Mac para conectar a un servidor: claves ed25519, ssh-copy-id, alias en ~/.ssh/config, túneles y copia de archivos con scp y rsync.
Alquilas tu primer VPS, el proveedor te manda un correo con una IP y una contraseña, y de pronto toca «entrar». La buena noticia es que para usar SSH desde el Mac y conectar a un servidor no tienes que instalar absolutamente nada: macOS incluye un cliente OpenSSH completo desde hace décadas. La mala es que si te quedas en «IP más contraseña» estás trabajando de la forma incómoda e insegura. Esta guía te lleva de cero a un acceso con clave, alias cortos y transferencia de archivos, todo con ejemplos copiables.
El proceso resumido: generas una clave ed25519 con ssh-keygen, la instalas en el servidor con ssh-copy-id, creas un alias en ~/.ssh/config y a partir de ahí conectas escribiendo solo ssh miservidor, sin contraseña y con seguridad real.
Qué es SSH y por qué tu Mac ya lo trae instalado
SSH (Secure Shell) es el protocolo estándar para administrar máquinas remotas de forma cifrada: todo lo que tecleas y todo lo que el servidor responde viaja cifrado de extremo a extremo. macOS es un sistema Unix certificado, así que el cliente ssh de OpenSSH viene preinstalado; puedes comprobarlo con:
ssh -V
Verás algo como OpenSSH_9.x, LibreSSL x.x. Si no te manejas con fluidez en la línea de comandos, repasa antes la guía de Terminal y Homebrew; todo lo que sigue ocurre ahí dentro.
Primera conexión: ssh usuario@servidor
La forma más básica de conectar por SSH desde el Mac a un servidor:
ssh usuario@203.0.113.10
La primera vez verás un aviso sobre la huella del servidor («The authenticity of host can't be established»). No es un error: SSH te pide confirmar que confías en esa máquina, y guarda su huella en ~/.ssh/known_hosts para avisarte si algún día cambia (señal de posible suplantación). Escribe yes, introduce la contraseña y estás dentro. Si el servidor escucha en un puerto distinto del 22, añade -p 2222.
Conectar así funciona, pero escribir una contraseña en cada sesión es incómodo y, sobre todo, deja el servidor expuesto a ataques de fuerza bruta. El siguiente paso es obligatorio.
Claves ed25519: adiós a la contraseña
La autenticación por clave pública es el estándar actual: tu Mac guarda una clave privada que nunca sale de él, y el servidor guarda la pública. El algoritmo recomendado hoy es ed25519: claves cortas, rápidas y sin los problemas de diseño de RSA antiguo. Lo recomiendan tanto la documentación de SSH Academy como la propia comunidad de OpenSSH.
ssh-keygen -t ed25519 -C "fran@macbook"
Te hará dos preguntas:
- Dónde guardar la clave: acepta la ruta por defecto,
~/.ssh/id_ed25519. - Passphrase: pon una, siempre. Es la contraseña que protege la clave privada si alguien roba tu Mac. No es opcional en una máquina portátil.
Se generan dos archivos: id_ed25519 (privada, jamás la compartas) e id_ed25519.pub (pública, la que va al servidor).
ssh-copy-id: instalar la clave en el servidor
Para que el servidor confíe en tu clave, su parte pública debe acabar en el archivo ~/.ssh/authorized_keys del usuario remoto. macOS incluye ssh-copy-id desde hace años, así que basta un comando (ver cómo funciona ssh-copy-id):
ssh-copy-id usuario@203.0.113.10
Te pedirá la contraseña una última vez. A partir de ahí, ssh usuario@203.0.113.10 entra directo, pidiéndote solo la passphrase de tu clave (y ni eso, si usas el agente, como verás abajo). Si ssh-copy-id no estuviera disponible, el equivalente manual es:
cat ~/.ssh/id_ed25519.pub | ssh usuario@203.0.113.10 "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"
~/.ssh/config: alias para no memorizar IPs
Aquí es donde SSH pasa de herramienta a comodidad. Crea el archivo ~/.ssh/config con bloques por servidor:
Host miservidor
HostName 203.0.113.10
User usuario
Port 22
IdentityFile ~/.ssh/id_ed25519
Host raspberry
HostName 192.168.1.50
User pi
Desde ese momento, ssh miservidor equivale a toda la línea larga. El alias también lo heredan scp, rsync y hasta el ssh:// de Git. Añade al principio un bloque general para mantener las conexiones vivas:
Host *
ServerAliveInterval 60
AddKeysToAgent yes
UseKeychain yes
ServerAliveInterval evita que la sesión muera si te levantas a por café, y UseKeychain yes junto a AddKeysToAgent yes guarda la passphrase en el llavero de macOS: la introduces una vez por sesión de trabajo, no en cada conexión.
Copiar archivos: scp, sftp y rsync
Con el alias configurado, mover archivos entre tu Mac y el servidor es trivial.
scp, para copias puntuales:
scp informe.pdf miservidor:/home/usuario/
scp miservidor:/var/log/nginx/access.log ./
sftp, para una sesión interactiva de transferencia:
sftp miservidor
Dentro usas put, get, ls y cd como en un FTP clásico, pero cifrado.
rsync sobre SSH, la opción seria para sincronizar carpetas: solo transfiere lo que ha cambiado, reanuda interrupciones y muestra progreso:
rsync -avz --progress ./proyecto/ miservidor:/var/www/proyecto/
Ojo con la barra final de la ruta de origen: ./proyecto/ copia el contenido de la carpeta; sin la barra, copia la carpeta entera dentro del destino. Este mismo patrón sirve para copias de seguridad en un NAS o disco remoto; la estrategia de copias con Time Machine cubre la parte local.
Reenvío de puertos: el superpoder de SSH
El reenvío local (-L) te permite acceder a un servicio del servidor como si estuviera en tu Mac. Ejemplo clásico: una base de datos que solo escucha en el localhost del servidor, inaccesible desde fuera:
ssh -L 5433:localhost:5432 miservidor
Mientras esa sesión esté abierta, apuntar tu cliente de base de datos a localhost:5433 en tu Mac conecta con el PostgreSQL remoto, todo cifrado por el túnel. También sirve para paneles web internos (-L 8080:localhost:80), un phpMyAdmin que no quieres exponer, o el puerto de depuración de una app. Si el túnel no responde, verifica la ruta con las herramientas de diagnóstico de red del Terminal antes de culpar a SSH.
Buenas prácticas de seguridad
Una vez que entras con clave, cierra la puerta por la que entraste:
- Desactiva el login por contraseña en el servidor: en
/etc/ssh/sshd_config,PasswordAuthentication no. Con la clave instalada, la contraseña solo sirve para que la fuercen. - No uses root directamente:
PermitRootLogin noy entra con un usuario normal que tengasudo. Es la recomendación estándar de la documentación de OpenSSH. - Passphrase sí o sí en la clave privada, con el llavero de macOS para no teclearla constantemente.
- Revisa las huellas: si SSH te avisa de que la huella del servidor ha cambiado y tú no has reinstalado nada, no conectes hasta entender por qué.
- Cambia el puerto solo como higiene, no como defensa: reduce el ruido de bots en los logs, pero la seguridad real la da la clave ed25519.
Preguntas frecuentes
¿Cómo conecto por SSH desde un Mac a un servidor Linux? Abre Terminal y ejecuta ssh usuario@IP-del-servidor. macOS trae el cliente SSH preinstalado, no hace falta instalar nada. Para uso habitual, configura una clave ed25519 y un alias en ~/.ssh/config.
¿Dónde se guardan las claves SSH en macOS? En la carpeta oculta ~/.ssh/ de tu usuario. La privada es id_ed25519 y la pública id_ed25519.pub. Accede desde Finder con ⇧⌘G y escribiendo ~/.ssh.
¿Por qué SSH me pide la contraseña si ya instalé la clave? Lo habitual: la clave pública no quedó bien en authorized_keys, los permisos de ~/.ssh en el servidor son demasiado abiertos (deben ser 700 la carpeta y 600 el archivo), o estás usando otro usuario. Ejecuta ssh -v usuario@servidor para ver qué método de autenticación se está intentando.
¿Qué diferencia hay entre scp y rsync? scp copia archivos tal cual, sin más. rsync compara origen y destino y solo transfiere las diferencias, además de reanudar transferencias cortadas: para carpetas grandes o sincronizaciones repetidas, siempre rsync.
Con esto tienes el flujo completo: clave ed25519 protegida con passphrase y llavero, alias en ~/.ssh/config, transferencia con rsync y túneles para los servicios internos. Es la configuración que usa cualquier administrador de sistemas, y tu Mac la soporta de fábrica desde el primer arranque.