====== sshtunnel ====== Creación de [[informatica:software:ssh#tunel_ssh|túneles SSH]] a servidores remotos con [[informatica:programacion:python|Python]]. * [[https://github.com/pahaz/sshtunnel/|Repositorio oficial]] (GitHub) ===== 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.