Cómo Hacer Túneles SSH
Una de las funcionalidades extraordinarias que posee openssh es la de encapsular el tráfico inseguro a puertos TCP. A continuación vemos algunos ejemplos útiles de cuándo y cómo utilizarlos.
Algunas suposiciones:
-
openssh-server.example.com
: Es el host que posee el servicio ssh y el servicio sin cifrar -
otrohost.example.com
: Es un host que posee un servidor web sin TLS pero que carece de ssh. -
192.0.2.1/24
: Es la dirección IP del cliente ssh. -
filtrado.example.com
: Es un host que tiene el puerto del servicio al que queremos acceder pero se encuentra filtrado para el exterior. -
casa.example.com
: Es un host remoto respecto a un servidor ssh accesible desde la red defiltrado.example.com
. Este host está en un lugar en el cual podemos trabajar cómodamente 😊 por fuera de la infraestructura defiltrado.example.com
.
Caso 1: Redireccionado desde un puerto local a un puerto remoto para segurizar un servicio sin cifrar
Queremos segurizar el acceso a un servidor web sin TLS.
ssh -N -f -L 10001:localhost:80 openssh-server.example.com
-
80
: Es el puerto que tiene el servicio sin cifrar -
localhost
: Es la dirección en el host servicio-remoto.example.com que escucha en el puerto 80. -
10001
: Es el puerto local al cual tendremos que conectarnos para obtener el servicio web. -
-N
No ejecuta comandos en el lado remoto. -
-f
El proceso va al segundo plazo antes de la ejecución de comandos.
El url que habrá que poner en el navegador es http://localhost:10001
Caso 2: Redireccionado desde un puerto local a un puerto remoto permitiendo el acceso al túnel usuarios de la misma red local para Segurizar un servicio sin cifrar
Queremos permitir que otros hosts de la red puedan acceder nuestro servicio encapsulado.
ssh -g -N -f -L 10001:localhost:80 openssh-server.example.com
-
-g
Permite acceder a otros hosts de la red 192.0.2.0/24 acceder a el url http://192.0.2.1:10001/
Caso 3: Redireccionado desde un puerto local a un puerto remoto usando otro servidor ssh para acceder a un servicio sin TLS ni ssh
ssh -N -f -L 10001:otrohost.example.com:80 openssh-server.example.com
- Aquí la url será http://localhost:10001
Caso 4: Crear un túnel en dirección inversa para acceder a un puerto SSH filtrado (utilización de un túnel remoto)
En este caso, queremos acceder al puerto SSH de filtrado.example.com
, que no es accesible desde internet. Utilizamos casa.example.com
con acceso SSH temporal para redirigir el puerto SSH de filtrado.example.com
.
El comando debe ejecutarse en filtrado.example.com
:
ssh -N -f -R 9000:localhost:22 casa.example.com
-
22
: Es el puerto SSH defiltrado.example.com
. -
9000
: Es el puerto redirigido encasa.example.com
.
Para conectarse al puerto SSH de filtrado.example.com
desde casa.example.com
:
ssh -p 9000 localhost
Caso 5: Redireccionamiento remoto para permitir acceso compartido a un puerto filtrado
En este caso, queremos redirigir el puerto SSH de un servidor filtrado (filtrado.example.com
) hacia un servidor intermedio (casa.example.com
) y permitir que otros hosts que están en la misma red local puedan acceder al túnel.
Comando para configurar el túnel:
ssh -N -f -R 0.0.0.0:9000:localhost:22 casa.example.com
-
0.0.0.0:9000
: Permite que el puerto redirigido esté accesible en todas las interfaces de red decasa.example.com
. -
localhost:22
: Redirige el tráfico al puerto SSH defiltrado.example.com
.
Para conectarse al túnel desde cualquier host con acceso a casa.example.com
:
ssh -p 9000 casa.example.com
Requisito en casa.example.com
Habilitar GatewayPorts
en /etc/ssh/sshd_config
:
GatewayPorts clientspecified
Con esta configuración si el cliente no especifica explícitamente 0.0.0.0 al crear el túnel, los puertos siguen siendo locales por defecto.
Reinicia el servicio SSH:
sudo systemctl restart sshd
Notas de Seguridad
Si el servidor casa.example.com
tiene una IP pública, usar firewalls para limitar el acceso al puerto 9000
y restringirlo solo a las máquinas necesarias. Para mayor seguridad, se puede especificar una interfaz específica en lugar de 0.0.0.0
.
Troubleshooting
En todas las casos usar la opción -v
para obtener realizar debugging. Recordar que dicha opcioń se puede usar múltiples veces para aumentar el detalle.
Comentarios
Comments powered by Disqus