SSH Tunneling: Manual para crear un túnel SSH y navegar seguro

SSH Tunneling: Manual para crear un túnel SSH y navegar seguro

Sergio De Luz

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.

¿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.

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 una 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.

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.

Podéis descargar Putty desde su página web oficial. No hace falta instalarlo ya que es un programa Portable, 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

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.

53 Comentarios