¡Esta es una revisión vieja del documento!
Tabla de Contenidos
sshtunnel
Creación de túneles SSH a servidores remotos con Python
- 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.
