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 curl | Quié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
- ssh(1), manual de OpenBSD
- Página de manual de curl
- Configuring a SOCKS proxy server in Chrome
- Connection settings in Firefox