Cómo usar SSH como proxy SOCKS

Ejecuta ssh -N -D 1080 user@server. Tu máquina tendrá un proxy SOCKS en el puerto 1080, y el tráfico que le envíes saldrá desde el servidor. Pruébalo con curl --socks5-hostname localhost:1080 https://example.com/. Usa la forma hostname para que los nombres los resuelva el servidor y no tu red local. Solo pasan por el proxy los programas configurados para usarlo.

Actualizada el . OpenSSH 10.0 y curl en Debian 13 en contenedores desechables, y OpenSSH 10.3 con curl y lsof en macOS, accediendo a un servidor web que solo el servidor SSH podía resolver y alcanzar, por HTTP sin cifrar.

Iniciar el proxy

ssh -N -D 1080 user@server

-D 1080 abre el proxy y -N significa que no hay comando remoto. Añade -f para ejecutarlo en segundo plano. Comprueba que escucha solo en tu propia máquina:

$ ss -ltn | grep 1080
LISTEN 0  128  127.0.0.1:1080  0.0.0.0:*
LISTEN 0  128      [::1]:1080     [::]:*

En un Mac usa en su lugar lsof -nP -iTCP:1080 -sTCP:LISTEN.

-D es la variante dinámica del reenvío de puertos SSH, junto a los túneles locales y remotos.

Probarlo con curl

curl --socks5-hostname localhost:1080 https://example.com/

Otras formas que hacen lo mismo:

curl -x socks5h://localhost:1080 https://example.com/
ALL_PROXY=socks5h://localhost:1080 curl https://example.com/

Para ver desde qué dirección sale tu tráfico, pregunta a un servicio que muestre tu IP, con y sin el proxy. Con el proxy debería salir la dirección del servidor:

curl https://ifconfig.me
curl --socks5-hostname localhost:1080 https://ifconfig.me

DNS: la diferencia entre socks5 y socks5h

Opción de curlQuién resuelve los nombres
--socks5, socks5://Tu máquina, con tu DNS local
--socks5-hostname, socks5h://El servidor SSH

Lo probamos con un nombre que solo existía en el servidor. --socks5-hostname y socks5h:// llegaron al sitio, mientras que --socks5 falló porque el nombre había que resolverlo en local.

Esto tiene dos consecuencias. La red local y tu proveedor de DNS pueden ver los nombres que consultas si no los resuelve el servidor, lo que se llama una fuga de DNS. Y los nombres que solo existen en la red del servidor funcionan únicamente con la forma hostname.

Ajustes del navegador

Estos pasos siguen la documentación de cada fabricante.

Firefox

Abre Ajustes, después Configuración de red, y elige Configuración manual del proxy. Pon localhost en Host SOCKS, 1080 en Puerto y elige SOCKS v5. Activa DNS por proxy al usar SOCKS v5; si no, los nombres se resuelven en local.

Chrome y Chromium

Inicia el navegador con un parámetro:

chrome --proxy-server="socks5://localhost:1080"

En un Mac, cierra Chrome primero y ábrelo con el parámetro desde Terminal:

open -a "Google Chrome" --args --proxy-server="socks5://localhost:1080"

La documentación de Chromium dice que algunos componentes todavía pueden hacer peticiones DNS directas, y añade este parámetro para impedirlo:

--host-resolver-rules="MAP * ~NOTFOUND , EXCLUDE localhost"

Safari y todo el Mac

Safari usa el proxy del sistema. En Ajustes del Sistema, abre Red, elige tu red, luego Detalles y Proxies, activa Proxy SOCKS e introduce localhost y el puerto 1080. Lo mismo desde Terminal, y para desactivarlo al terminar:

networksetup -setsocksfirewallproxy Wi-Fi localhost 1080
networksetup -setsocksfirewallproxystate Wi-Fi off

Cambia Wi-Fi por el nombre de tu servicio de red, tal como aparece en networksetup -listallnetworkservices.

No expongas el puerto

El proxy no tiene contraseña. Cualquiera que pueda llegar a él puede usar tu servidor como salida. Estas formas escuchan en todas las direcciones, como confirmamos con ss:

ssh -N -D 0.0.0.0:1081 user@server
ssh -N -g -D 1080 user@server

Quédate con el valor por defecto, o escríbelo explícitamente:

ssh -N -D 127.0.0.1:1080 user@server

Lo que no hace

  • Solo transporta los programas que apuntas hacia él. No es una VPN para todo el sistema.
  • Transporta TCP. La compatibilidad SOCKS de OpenSSH no tiene relé UDP.
  • El tráfico va cifrado solo entre tú y el servidor. Del servidor al sitio web va como use el sitio.
  • El sitio web ve la dirección del servidor, y el dueño del servidor puede ver las conexiones.

Si no funciona

Con AllowTcpForwarding no en el servidor, el puerto se abre en tu lado y la autenticación funciona, pero cada petición falla. curl informó connection to proxy closed en nuestra prueba. Comprueba el servidor con sudo sshd -T | grep -i allowtcpforwarding. Un puerto ya en uso da bind [127.0.0.1]:1080: Address already in use. Mira la guía de ese error.

Preguntas

¿Un proxy SOCKS por SSH es lo mismo que una VPN?

No. Solo pasan por el proxy los programas configurados para usarlo, y solo lleva TCP. Una VPN lleva todo el tráfico del equipo.

¿Qué diferencia hay entre socks5 y socks5h?

Con socks5h, o --socks5-hostname en curl, el servidor SSH resuelve los nombres. Con socks5 los resuelve tu equipo: los nombres internos fallan y las consultas DNS se ven en tu red local.

¿Puedo usar otro puerto que no sea 1080?

Sí. Sirve cualquier puerto local libre, por ejemplo ssh -N -D 1081 user@server. Después indica el mismo puerto a tus programas.

Fuentes

Más en Túneles y jump hosts

Todas las guías