El SSH Tunneling es una técnica que nos permitirá navegar por la web de forma segura, estableciendo un túnel SSH contra un servidor SSH remoto, ya sea configurado en nuestro hogar en un servidor NAS o en nuestro router, o en un servidor VPS remoto. Hoy en RedesZone os vamos a enseñar paso a paso cómo configurar tanto el servidor SSH, como también el cliente SSH para establecer un túnel SSH y navegar seguro por la web.
Aunque no hayas oído hablar nunca, o si quieres profundizar más acerca de los que son los túneles SSH, lo cierto es que hay que comenzar conociendo exactamente qué son y para qué te pueden servir. Un claro ejemplo es que son una buena solución para que se pueda entrar en un sitio web que no está disponible desde tu conexión. Pero, para que puedas tener esto más claro, en las siguientes líneas te explicamos cada uno de sus detalles más importantes.
Desde ese punto, entonces será más sencillo conocer cómo se puede configurar, cuál es la configuración que se debe hacer en Windows, además de otra serie de preguntas y respuestas que te van a venir bien para resolver posibles dudas sobre el tema.
¿Qué es un túnel SSH y para qué sirve?
Este túnel SSH que vamos a crear únicamente cifra las comunicaciones si configuramos un Proxy en nuestro navegador, o en el programa que nosotros tengamos, en nuestras pruebas hemos usado Mozilla Firefox, pero cualquier navegador es compatible. Este método no cifra los servicios que no permiten configurar un proxy, como Dropbox (instalado en nuestro equipo) u otros programas que necesitan conexión a Internet, pero no tienen un menú para configurar el proxy.
Cualquier programa que tenga la posibilidad de configurar un proxy SOCKS vamos a poder reenviar todo su tráfico a través del túnel SSH, y salir a Internet a través de la dirección IP pública que tenga dicho servidor SSH, de esta forma, todo el tráfico desde nuestro equipo hasta el servidor SSH estará cifrado y autenticado, con los algoritmos de cifrado simétrico que use el servidor SSH, aunque normalmente es AES-256-GCM, tal y como ocurre con los servicios de VPN.
Un detalle muy importante, es que, si necesitas cifrar absolutamente todo el tráfico, entonces tendrás que configurar un servidor VPN, ya sea de tipo OpenVPN o WireGuard. El protocolo OpenVPN es ampliamente utilizado en entornos domésticos, sobre todo porque los principales servidores NAS lo incorporan por defecto, e incluso algunos routers como los ASUS también incorporan este protocolo. WireGuard es un protocolo VPN muy nuevo que todavía no está en los principales fabricantes de servidores NAS, como QNAP, Synology o ASUSTOR, sin embargo, sí lo encontraremos en un servidor Linux que nosotros configuremos, e incluso también lo tenemos disponible en sistemas operativos orientados a firewall o router como DD-WRT y pfSense entre otros. Gracias a que WireGuard se encuentra integrado en el Kernel de Linux, obtendremos un rendimiento excelente en términos de velocidad y latencia de la conexión.
Beneficios del SSH Tunneling
Debido a lo simple que es el cifrado SSH se convierte en un protocolo especialmente útil, sobre todo porque no fue diseñado para atravesar firewalls, simplemente para ejecutar comandos y transferir archivos de una manera segura. Por otro lado, si te encuentras en un lugar como China, Rusia o Turquía, los túneles SSH pueden ayudarte a acceder a la mayoría de contenido bloqueado, ya que SSH en sí mismo no se encuentra supervisado debido a que todo el tráfico va cifrado y autenticado. Además, se pueden utilizar estos túneles para vencer la limitación de las ISP, ya que viajan a través de puertos únicos.
Otro de los usos modernos más extendidos de SSH es acceder de forma segura a sitios web que bloquean VPN. Si su servicio de red privada virtual está bloqueado, simplemente puedes cambiar por la opción de SSH tunneling, presione el botón de recarga y el contenido se mostrará de inmediato. Lógicamente necesitamos un servidor que tenga configurado SSH Tunneling, de lo contrario no podremos conectarnos correctamente.
Desventajas del SSH Tunneling
A pesar de que se ha mantenido de manera bastante constante durante décadas, el SSH es un protocolo al estilo de la vieja escuela construido cuando Internet era mucho más pequeño de lo que es hoy en día. La descarga de gigabytes de películas o la transmisión de contenido de video HD y 4K simplemente no formaba parte de la web en ese entonces. Y esta es una de las razones por la que, la mayoría de los usuarios modernos verán SSH como un método de encriptación increíblemente lento, poco adecuado para cualquier cosa más allá de ver sitios web o enviar correos electrónicos.
Dada la naturaleza del tráfico de los túneles SSH, debemos utilizarlo con una VPN que admita el protocolo de forma nativa. La mayoría de los casos, los servicios VPN públicos no permiten SSH, desafortunadamente, lo que significa que tendrá que crear su propia VPN auto hospedada o encontrar un producto público con buen soporte SSH.
Otra desventaja de la experiencia del SSH Tunneling es que el protocolo se puede bloquear. El tráfico SSH es detectable, al igual que el tráfico VPN. Es un poco más difícil de detectar, pero ciertamente no es ni mucho menos imposible. Aun así, debido a que SSH tiene muchos usos legítimos, es raro verlo bloqueado por ISP o censores gubernamentales. Eliminar SSH por completo destruiría los usos legítimos del protocolo, por lo que generalmente se deja solo.
¿Cuándo es buena idea usarlo?
Los beneficios quedan claros con las líneas anteriores. Ahora bien, hay que tener claro cuáles son aquellos momentos en los que se marca la diferencia a la hora de poner en funcionamiento un túnel SSH. Por ejemplo, una de las primeras utilidades es sin duda alguna para navegar por Internet con mayor seguridad, sobre todo cuando se esté en una red local que no sea segura. Más que nada, porque al usar este tipo de soluciones se consigue garantizar la confidencialidad de los usuarios al navegar por la red. De esta forma, nadie podrá tener conocimiento de las páginas web que se visitan ni tampoco de la actividad en Internet que se tenga.
Además de esto, es conviente usar esta alternativa cuando se pretenda garantizar la integridad de los datos que se transmitan y de la información que se va a recibir. Y todo porque nunca se sabe cuál es la probabilidad que hay de que alguien pueda modificar los datos que se envían o reciben, por lo que con esta solución la probabilidad es muy baja.
Y no son las únicas ocasiones en las que puedes ver con buenos ojo el hecho de crear un túnel SSH. Por ejemplo, se convierte en una de las mejores opciones en el caso de que se busque garantizar la comunicación entre dos máquinas, así como el hecho de buscar fortalecer los protocolos más débiles, como pueden ser HTTP, SMTP, entre otros. Y sin duda alguna, también sirve para vulnerar diferentes restricciones que estén impongan los operadores. Por lo que hay varios momentos en los que es más que recomendable usar esta alternativa.
Tunel SSH inverso
Cuando queremos administrar algún servidor u otro equipo, estableciendo medidas de seguridad que no se deben modificar, existen algunas herramientas. Pero en este caso, tenemos el tunel SSH inverso. La cual resulta simple y eficaz. Esta no es más que una conexión entre diferentes equipos puerto a puerto con SSH, pero tiene la peculiaridad. La petición que se realiza, la envía el propio dispositivo al que queremos tener acceso. Y no desde el que vamos a acceder.
Esto puede ocurrir cuando el otro equipo tiene establecido algún router o un firewall, al cual no podemos acceder. Al mismo tiempo, nuestros mismos router y firewall hacen lo mismo con las peticiones entrantes desde cualquier puerto. Por lo cual estamos ante una situación de inaccesibilidad. Pero si contamos con otro equipo añadido, si podremos establecer un acceso con SSH. Pero la única solución sería acceder al servidor desde el exterior, y se realizará mediante un túnel SSH inverso.
Lo que tendríamos que hacer para poder acceder al servidor, sería establecer una conexión desde una máquina al tercer equipo que mencionamos previamente. Luego de conectarnos a ese equipo, enlazaremos de forma indirecta al servidor. Esto es solo otro de los ejemplos, de los tantos que nos ofrece SSH para poder establecer conexiones. Y así gestionar equipos que no están directamente conectados a internet, o en otra subred tras algunas medidas de seguridad estrictas. Podremos acceder sin necesidad e modificar ninguna de las reglas del firewall, o habilitar algún otro puerto.
Si queremos probar esto antes de llevarlo a la práctica, lo más recomendable es utilizar máquinas virtuales. De esta forma no dejaremos expuesto ningún parámetro de seguridad en ningún momento. Siendo estas un buen campo de pruebas donde pulir procesos, y llevarlos luego a la práctica. Así, podremos estar más seguros de que vamos a configurar un sistema eficiente y que cobre todas las necesidades que se le requieren.
Rendimiento del túnel SSH
Un túnel SSH puede introducir cierta latencia en la conexión debido al cifrado y descifrado de datos. Este proceso puede requerir más recursos del sistema que una conexión no encriptada, lo que puede hacer que la conexión sea más lenta. Por otro lado, el impacto en el rendimiento de un túnel SSH puede ser mitigado mediante la optimización de la configuración y el uso de algoritmos de cifrado más eficientes. Por ejemplo, utilizar algoritmos de cifrado más rápidos como AES en lugar de Blowfish puede reducir el impacto en el rendimiento.
Además, también es importante tener en cuenta el ancho de banda disponible. Si el ancho de banda disponible es limitado, el cifrado y descifrado de datos puede consumir gran parte de los recursos disponibles, lo que puede provocar una disminución en el rendimiento de la red. Por otro lado, un túnel SSH también puede mejorar el rendimiento de la red en ciertos casos. Por ejemplo, si se está accediendo a una red desde una ubicación remota y se utiliza un túnel SSH para encriptar la conexión, puede mejorar el rendimiento de la conexión en comparación con una conexión no encriptada.
Para mejorar el rendimiento de un túnel SSH, hay varias opciones que se pueden considerar:
- Utilizar algoritmos de cifrado más eficientes, como AES en lugar de Blowfish, puede reducir el impacto en el rendimiento. Como mencionamos al inicio.
- Ajustar la configuración del servidor SSH para aumentar el tamaño del búfer de paquetes. Un tamaño de búfer más grande puede mejorar el rendimiento de la conexión.
- Utilizar la compresión SSH para reducir el tamaño de los datos transmitidos a través del túnel. Esto puede mejorar el rendimiento de la conexión en redes con ancho de banda limitado.
- Utilizar un hardware más potente en el servidor SSH puede mejorar el rendimiento de la conexión.
- Optimizar la configuración del sistema operativo en ambos extremos de la conexión SSH para maximizar el rendimiento de la red.
Qué tipos hay
Por otro lado, hay que tener en cuenta que podemos encontrar hasta tres tipos diferentes de túneles SSH: reenvío de puertos local, remoto o dinámico. Además de que estos están relacionados con el uso de túneles SSH, por ejemplo, que se puede encontrar en Linux. Por esto mismo hay que tener en cuenta los siguientes puntos.
Por ejemplo, uno de los primeros aspectos que podemos tener claros es que el método más común para configurar un túnel SSH es el reenvío local de puertos. Esto hace que sea posible acceder a los recursos de la red local desde tu PC local y así conseguir reenviar un puerto de tu equipo a un puerto del servidor SSH. Y después de esto, el puerto ya tiene la opción de ser reenviado a un puerto del PC que actúa como punto de destino.
Además del anterior tipo, también está el reenvío de puertos remotos. En este caso, hay que tener en cuenta que se conecta un puerto del servidor SSH a un puerto del PC que actúa como cliente, el cual puede fijar una conexión con el equipo de destino. En este caso, este tipo en particular de puertos se suele usar con el objetivo de dar a una persona externa un acceso en concreto a los servicios internos.
Y, por último, pero no menos importante, la tercera forma que podemos encontrar: el reenvío dinámico de puertos. En este caso, debemos tener en cuenta que podemos tener la oportunidad de usar un socket en nuestro PC local que se utilizará como un proxy Socks. Además, todas las apps que se usen en este, se conectarán con el servidor SSH y así se conseguirá enviar el tráfico a través del túnel en cuestión.
Configuración del servidor SSH
Para realizar correctamente el SSH Tunneling, o también conocido como túnel SSH, lo primero que debemos tener en cuenta es que deberemos contar con un servidor SSH accesible desde Internet, si no contamos con un servidor SSH, no podremos conectarnos a él para encapsular y cifrar todo el tráfico. Este servidor SSH puede estar en nuestro servidor NAS, en nuestro router, o directamente en un servidor remoto.
Primero debes configurar el servidor SSH con la directiva de «Permitir TCP forwarding«, si usas OpenSSH, la directiva que debes indicar es:
AllowTcpForwarding
También debes permitir la redirección del tráfico en tu servidor, es decir, debes poner:
sysctl net.ipv4.ip_forward=1
Una vez que tengamos el servidor SSH funcionando, procedemos a configurar el cliente. No obstante, también podríamos configurar este servidor SSH con un cifrado simétrico mejor, haciendo uso de la siguiente directiva:
Ciphers chacha20-poly1305@openssh.com,aes256-gcm@openssh.com,aes128-gcm@openssh.com,aes256-ctr,aes192-ctr,aes128-ctr
También podrías mejorar la seguridad incorporando MACs y algoritmos de intercambio de claves seguros, puedes añadir las siguientes directivas a OpenSSH para aumentar la seguridad:
KexAlgorithms curve25519-sha256@libssh.org,ecdh-sha2-nistp521,ecdh-sha2-nistp384,ecdh-sha2-nistp256,diffie-hellman-group-exchange-sha256
MACs hmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.com,umac-128-etm@openssh.com,hmac-sha2-512,hmac-sha2-256,umac-128@openssh.com
Otras medidas de seguridad muy recomendables que podrías hacer, tanto en el servidor SSH como en el cliente SSH, es utilizar claves SSH en lugar de utilizar un nombre de usuario y contraseña. Si utilizamos claves SSH podremos conectarnos directamente con el servidor SSH sin necesidad de introducir ninguna contraseña, además, es mucho más seguro (y cómodo) conectarnos a través de claves SSH que no utilizar la típica autenticación de usuario y contraseña.
Lo primero que debemos hacer es crear las claves SSH desde el ordenador donde nos vamos a conectar, debemos crear las claves y pasárselas al servidor. Para crear claves SSH podemos ejecutar la siguiente orden para crear claves SSH basadas en RSA de 4096 bits, aunque también podrías crear claves SSH basadas en curvas elípticas que nos proporcionarán mayor rapidez a la hora de conectarnos.
ssh-keygen -t rsa -b 4096
Os recomendamos hacerlo con ED25519 que es la más usada y segura:
ssh-keygen -t ed25519
En el asistente de generación de estas claves, nos pondrá donde queremos guardarla, posteriormente tendremos que pasarle la clave al servidor SSH donde nos vayamos a conectar. Si hemos usado PuTTY para generar las claves SSH deberás hacerlo a mano, si estás en un equipo Linux o con WSL de Windows podrás ejecutar este comando:
ssh-copy-id usuario@IP_servidor
Automáticamente la clave pública se copiará y habilitar la autenticación con solo clave pública en el fichero de configuración del servidor SSH:
PubkeyAuthentication yes
Una vez completado este proceso, tendríamos que ser capaces de hacer iniciar de sesión en este equipo sin introducir la contraseña:
ssh usuario@IP
Recordad poner la directiva «PasswordAuthentication no» para no permitir accesos vía usuario y clave, de lo contrario, el servidor SSH admitirá ambas formas.
Configuración del cliente SSH en Windows
El programa que vamos a utilizar es Putty, es un programa Windows, pero en Linux funciona perfectamente utilizando la utilidad WINE (comprobado). No obstante, si usas Linux es mejor utilizar directamente el comando de ssh para realizar esta configuración, es muchísimo más sencillo que en Windows.
Con este software, lo cierto es que resulta bastante sencillo llegar a completar el proceso de configuración de un túnel SSH. Por lo que no te resultará un proceso tan tedioso como en otros casos. Lo primero que se debe tener en cuenta es que hay que descargar en tu ordenador Windows este programa en particular.
Y lo bueno es que se puede descargar Putty desde su página web oficial. No hace falta instalarlo ya que es un programa Portable, por lo que es una de las ventajas de esta herramienta en concreto. Una vez descargado, abrimos Putty y tenemos la siguiente pantalla:
Nos vamos a SSH/Tunneling tal y como vemos en la captura. En Source Port ponemos el puerto que vamos a utilizar para el túnel (por ejemplo el 8081), destination lo dejamos en blanco y en las opciones de abajo lo ponemos en Dynamic y en AUTO. Y luego seleccionamos ADD (para añadir la configuración).
A continuación, nos conectamos al servidor SSH normalmente con Putty, en el apartado Session.
Y hacemos la conexión SSH, en la imagen podéis ver el servidor SSH de mi router con Tomato RAF.
No debemos tocar nada más, únicamente dejar la conexión abierta y no cerrar el programa, repito que todo este proceso os sirve en Windows y en Linux con WINE. Ahora procedemos a configurar Firefox.
Configuración del navegador Mozilla Firefox para el Proxy
Vamos a OPCIONES, AVANZADO, RED y pinchamos en CONFIGURACIÓN.
En la siguiente imagen configuramos el uso del Proxy.
Configuración Manual del Proxy, Servidor SOCKS: 127.0.0.1 y el puerto 8081 (el que pusimos anteriormente), elegimos SOCKS v5, tal y como podéis ver en la captura.
Pinchamos en aceptar y salimos a la pantalla principal del navegador, abrimos cualquier web y ya estaremos navegando a través de nuestro servidor SSH. Si accedemos a una dirección IP local, va a funcionar sin ningún tipo de problema:
Podéis usar cualquier servicio para mirar vuestra IP pública y veréis que tenéis la misma del servidor SSH.
Configuración del Cliente SSH en Linux (por consola)
Si los usuarios de Linux se quieren ahorrar la configuración de Putty basta con que tecleeis este comando en consola y no la cerréis:
ssh -D 8081 -p 22 usuario@ip_publica
- 8081 = puerto a usar en el túnel
- 22 = puerto del servidor ssh, si usamos el puerto 22 no hace falta poner -p 22 ya que el puerto 22 es del de por defecto.
- usuario = usuario del servidor para el login
- ip_publica = dirección IP, dominio o host dinámico.
Preguntas y respuestas
Ahora bien, lo cierto es que puede que tengas una serie de dudas con alguno de estos procesos o directamente acerca del uso de los túneles SSH. Así que no queda otra que conocer las preguntas más comunes que puedes tener como usuario antes de querer crear un túnel SSH. Por ello, aquí puedes encontrar una serie de preguntas y respuestas más habituales que te pueden rondar por la cabeza:
Pregunta: Si el servidor SSH se cae o cerramos el cliente ssh sin querer, ¿quedaremos desprotegidos sin darnos cuenta?
- Respuesta: No, porque Firefox dará un error de que el servidor Proxy no está respondiendo y no podrá cargar ninguna web.
Pregunta: ¿Qué es más seguro, esto o crear una VPN como la del manual?
- Respuesta: La VPN porque te cifra absolutamente todo al cambiar el enrutamiento del equipo, al principio puede parecer más pesado, pero cuando la VPN la tienes configurada es muy cómodo hacer doble click y listo.
Esperamos que con este tutorial podáis navegar seguro realizando un túnel SSH contra vuestro NAS, router u otro servidor donde tengáis el SSH.