Herramientas de usuario

Herramientas del sitio


informatica:programacion:python:modulos:sshtunnel

¡Esta es una revisión vieja del documento!


Tabla de Contenidos

sshtunnel

Creación de túneles SSH a servidores remotos con Python

Instalación

Se puede instalar a través de pip:

pip install sshtunnel

Uso

Los típicos escenarios de uso de este módulo es cuando queremos conectarnos a un puerto de un servidor remoto que solo tiene abierto el puerto del servidor SSH:

----------------------------------------------------------------------

                            |
-------------+              |    +----------+
    CLIENTE  |              |    | SERVIDOR | :22 SSH
     LOCAL   | <== SSH ========> |  REMOTO  | :8080 Apache
-------------+              |    +----------+
                            |
                         FIREWALL (solo abierto puerto 22)

----------------------------------------------------------------------

Como se puede ver, en ese ejemplo solo tenemos acceso al servidor remoto mediante por el puerto 22 (SSH) y queremos acceder al 8080:

from sshtunnel import SSHTunnelForwarder
 
server = SSHTunnelForwarder(
    'servidor.remoto.com',
    ssh_username="usuario",
    ssh_password="secreto",
    remote_bind_address=('127.0.0.1', 8080)
)
 
server.start()
 
print(server.local_bind_port)  # show assigned local port
# work with `SECRET SERVICE` through `server.local_bind_port`.
 
server.stop()

Otro escenario habitual es acceder a otro equipo que está conectado al servidor SSH, pero no tiene visibilidad desde el exterior:

----------------------------------------------------------------------

                            |
-------------+              |    +----------+               +---------
    CLIENTE  |              |    | SERVIDOR |               | SERVIDOR
     LOCAL   | <== SSH ========> |  REMOTO  | <== local ==> | PRIVADO
-------------+              |    +----------+               +---------
                            |
                         FIREWALL (solo abierto puerto 443)

----------------------------------------------------------------------

Para poder conectarnos al servidor privado, se debe de crear un túnel SSH a través del puerto 443 del servidor remoto:

import paramiko
import sshtunnel

with sshtunnel.open_tunnel(
    (REMOTE_SERVER_IP, 443),
    ssh_username="usuario",
    ssh_password="secreto",
    remote_bind_address=(PRIVATE_SERVER_IP, 22),
    local_bind_address=('0.0.0.0', 10022)
) as tunnel:
    client = paramiko.SSHClient()
    client.load_system_host_keys()
    client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    client.connect('127.0.0.1', 10022)
    # do some operations with client session
    client.close()
print('FINISH!')

En el ejemplo anterior estamos estableciendo un túnel SSH entre un equipo local y un servidor remoto con SSH y a través de ese túnel creamos una conexión entre el equipo local y el servidor privado solo accesible desde el servidor remoto con SSH.

informatica/programacion/python/modulos/sshtunnel.1631256263.txt.gz · Última modificación: por tempwin