Guía · SSH
Túnel SSH en Mac: reenvío local, remoto y dinámico
Actualizado el · 6 min de lectura
Un túnel SSH reenvía un puerto a través de una conexión SSH cifrada. En Mac se crea desde Terminal con el ssh que ya trae el sistema:
-L(local): un puerto de tu Mac llega a un servicio del servidor.ssh -N -L 5433:localhost:5432 usuario@servidory conectas a PostgreSQL enlocalhost:5433.-R(remoto): un puerto del servidor llega a un servicio de tu Mac.-D(dinámico): un proxy SOCKS en tu Mac que sale a internet desde el servidor.
En esta página
Antes de empezar
- Acceso SSH al servidor (mejor con clave; si ya tienes un alias en
~/.ssh/config, úsalo en lugar deusuario@servidor→ guía ssh config). - El servidor debe permitir reenvíos (
AllowTcpForwarding, activado por defecto en OpenSSH). -Nsignifica "no ejecutes ningún comando remoto, solo el túnel". El túnel vive mientras esa ventana de Terminal siga abierta.
Reenvío local (-L): llegar a una base de datos remota
La sintaxis es -L puerto_local:destino:puerto_destino. El destino se resuelve desde el servidor, así que localhost significa "el propio servidor".
PostgreSQL que solo escucha en localhost del servidor
ssh -N -L 5433:localhost:5432 usuario@servidorEn otra pestaña:
psql -h localhost -p 5433 -U app midbUsamos 5433 en el Mac para no chocar con un PostgreSQL local en 5432. Tu cliente gráfico (TablePlus, DBeaver, Postico) se configura igual: host localhost, puerto 5433.
MySQL o MariaDB
ssh -N -L 3307:127.0.0.1:3306 usuario@servidormysql -h 127.0.0.1 -P 3307 -u app -pUsa 127.0.0.1, no localhost: con localhost el cliente de MySQL intenta un socket Unix local e ignora el túnel.
Base de datos en otra máquina de la red privada
Si la base de datos está en db.interno y solo el servidor llega a ella:
ssh -N -L 5433:db.interno:5432 usuario@servidorEn segundo plano
ssh -f -N -o ExitOnForwardFailure=yes -L 5433:localhost:5432 usuario@servidor-f lo manda al fondo después de autenticar y ExitOnForwardFailure=yes hace que falle en vez de quedarse abierto sin túnel. Para cerrarlo:
pkill -f "5433:localhost:5432"Reenvío remoto (-R): enseñar un puerto de tu Mac al servidor
Sintaxis: -R puerto_remoto:destino:puerto_destino. Ahora el destino se resuelve desde tu Mac.
ssh -N -R 8080:localhost:3000 usuario@servidorEn el servidor, curl http://localhost:8080 llega a la app que tienes en el puerto 3000 de tu Mac. Útil para recibir un webhook en desarrollo o para que un proceso del servidor use un servicio local.
Por defecto el puerto remoto solo escucha en el loopback del servidor. Para abrirlo a otras máquinas, el administrador debe poner GatewayPorts clientspecified en /etc/ssh/sshd_config y tú indicar la interfaz:
ssh -N -R 0.0.0.0:8080:localhost:3000 usuario@servidorHazlo solo si sabes quién puede llegar a ese puerto.
Reenvío dinámico (-D): proxy SOCKS
ssh -N -D 1080 usuario@servidorAbre un proxy SOCKS5 en el puerto 1080 de tu Mac; el tráfico sale a internet desde el servidor. Pruébalo:
curl --socks5-hostname 127.0.0.1:1080 https://ifconfig.meDebe devolver la IP del servidor. Para que lo usen las apps del Mac:
networksetup -setsocksfirewallproxy "Wi-Fi" 127.0.0.1 1080
networksetup -setsocksfirewallproxystate "Wi-Fi" off # para desactivarloCambia "Wi-Fi" por el nombre de tu interfaz (networksetup -listallnetworkservices).
Dejar los túneles fijos en ~/.ssh/config
Host prod-db
HostName servidor.ejemplo.com
User usuario
LocalForward 5433 localhost:5432
ServerAliveInterval 30
ExitOnForwardFailure yesCon eso, ssh -N prod-db abre el túnel. Las directivas equivalentes a -R y -D son RemoteForward 8080 localhost:3000 y DynamicForward 1080.
Añadir un túnel a una conexión que ya está abierta
Si usas ControlMaster (una conexión maestra reutilizable), puedes añadir y quitar reenvíos sin abrir otra sesión:
ssh -O forward -L 5433:localhost:5432 prod-db
ssh -O cancel -L 5433:localhost:5432 prod-dbErrores comunes
bind [127.0.0.1]:5433: Address already in use. Otro proceso ocupa ese puerto en tu Mac. Míralo conlsof -nP -iTCP:5433 -sTCP:LISTENy elige otro puerto o cierra ese proceso.channel 2: open failed: connect failed: Connection refused. El túnel funciona, pero desde el servidor no hay nada escuchando endestino:puerto. Comprueba en el servidor conss -ltnque la base de datos escucha en ese puerto y esa interfaz.administratively prohibited: open failed. El servidor tieneAllowTcpForwarding no. Solo lo cambia quien administra el servidor.Warning: remote port forwarding failed for listen port 8080. En un-R: el puerto ya está en uso en el servidor o no está permitido.- El cliente MySQL no pasa por el túnel. Estás usando
-h localhost; cámbialo por-h 127.0.0.1. - El túnel se corta tras un rato sin uso. Un router o firewall cierra conexiones inactivas. Añade
ServerAliveInterval 30. Privileged ports can only be forwarded by root. Los puertos por debajo de 1024 en tu Mac requieren root. Usa uno alto (5433, 8080…).
Con Terminalia
Hacerlo con Terminalia
Terminalia añade los reenvíos locales (-L) y remotos (-R) desde un formulario y los activa o desactiva en caliente sobre la misma conexión SSH, sin volver a autenticarte. Te enseña el comando ssh equivalente, te avisa si el puerto local está ocupado y qué proceso lo usa, e importa los LocalForward y RemoteForward de tu ~/.ssh/config. Si la red cae, al reconectar vuelve a levantar los túneles. El reenvío dinámico (-D) no está en el formulario: ábrelo desde la terminal integrada con el comando de esta guía.
Gratis · sin registro · macOS 14+ · Apple Silicon e Intel
Preguntas frecuentes
¿Cuál es la diferencia entre -L y -R?
Con -L escuchas en un puerto de tu Mac y el tráfico llega a un servicio que ve el servidor: es lo que usas para una base de datos remota. Con -R escucha un puerto del servidor y el tráfico llega a un servicio de tu Mac: sirve para exponer algo local al servidor.
¿Es seguro abrir un túnel SSH a la base de datos de producción?
Más que abrir el puerto de la base de datos a internet. El tráfico va cifrado dentro de SSH y, por defecto, el puerto local solo escucha en 127.0.0.1, así que otras máquinas de tu red no lo ven. Sigue usando un usuario de base de datos con los permisos justos.
¿Cómo sé qué túneles tengo abiertos en mi Mac?
Lista los procesos ssh que escuchan en puertos locales con lsof -nP -iTCP -sTCP:LISTEN | grep ssh. Verás el puerto de cada túnel y su PID. Para cerrar uno, usa kill con ese PID, o ssh -O cancel si el túnel cuelga de una conexión maestra.