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