2017-07-20 2 views
0

Je ne comprends pas (même après avoir lu quelques articles dédiés à ssh tunelling) quels paramètres de la commande CLI ssh dans ce script. Fondamentalement, je dois me connecter à un serveur (je l'ai appelé 'ssh_tunnel_host: 22'), que de se connecter à db_host en utilisant ce tunnel.Accéder à la base de données distante via tunnel ssh (Python 3)

with SSHTunnelForwarder(
    ('ssh_tunnel_host', 22), 
    ssh_username="ssh_username", 
    ssh_pkey="/somepath/id_rsa", 
    local_bind_address=('0.0.0.0', 1234), 
    remote_bind_address=('127.0.0.1', 3306) 
) as tunnel: 
    client = paramiko.SSHClient() 
    client.load_system_host_keys() 
    client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) 
    client.connect('127.0.0.1', 1234) 
    db_connection = pymysql.connect(host=db_host, port=3306, db='mysql', user='user', 
            password='password', charset='utf8mb4') 

Quelqu'un pourrait-il me expliquer:

  1. Qu'est-ce que local_bind_address - est-il mon adresse locale ou ssh_tunnel_host adderss local? Où puis-je apprendre l'IP et le port?
  2. Dépend de la question précédente - qu'est-ce que remote_bind_address - est-ce l'adresse de ssh_tunnel_host ou de db_host? Où puis-je apprendre ces IP et port?
  3. Où dois-je me connecter avec client.connect()? Lier localement ou à distance?

(j'ai essayé de lire les documents, mais il est toujours déconner)

Répondre

1

penser comme une connexion proxy. Vous vous connectez à ssh_tunnel_host:22 et vous le dites aux connexions proxy à partir de ses <db host>:3306, ce qui signifie le port 3306 sur db_host accédé par ssh_tunnel_host à vous, le client.

Vous pouvez spécifier le port IP local (vers vous) sur lequel vous souhaitez que la connexion proxy soit disponible ou laisser le client en choisir un libre. Omettre local_bind_address fait ce dernier.

Vous vous connectez ensuite à votre port local qui est en réalité un proxy à remote_bind_address:3306.

local_bind_address < ->ssh_tunnel_host < ->remote_bind_address

code

devrait être:

db_host = '<address reachable only by ssh_tunnel_host>' 
with SSHTunnelForwarder(
    ('ssh_tunnel_host', 22), 
    ssh_username="ssh_username", 
    ssh_pkey="/somepath/id_rsa", 
    remote_bind_address=(db_host, 3306) 
) as tunnel: 
    port = tunnel.local_bind_port 
    db_connection = pymysql.connect(
     host='127.0.0.1', port=port, db='mysql', user='user', 
     password='password', charset='utf8mb4') 
  1. locale à l'adresse client. Vous pouvez en définir un ou laisser le client choisir et trouver son port auprès de tunnel.local_bind_port.

  2. L'adresse à laquelle vous souhaitez que ssh_tunnel_host vous renvoie. S'il s'agit d'un service local au serveur, l'adresse IP sera 127.0.0.1 et le port du service. Il peut s'agir de n'importe quelle autre adresse IP ou IP dans le réseau ssh_tunnel_host qui n'est pas visible à l'extérieur de l'hôte de tunnel SSH.

  3. Nulle part. Le tunnel fournit un ip: port local qui assure la connexion à distance. Une fois le tunnel terminé, aucun autre client n'est nécessaire. Connectez-vous simplement à l'adresse IP locale: port.

+0

Vous ne pouvez pas essayer votre avis pour le moment. Mais pourquoi db host ne participe pas à la chaîne de connexion? –

+0

L'hôte db '127.0.0.1: 3306' n'est-il pas vu depuis 'ssh_tunnel_host'? Comment est-ce qu'il est tunnelisé autrement. Per (2), si l'hôte DB n'est pas local à l'hôte du tunnel, vous devez l'avoir comme adresse de liaison distante, c'est-à-dire 'remote_bind_address = (db_host, 3306)'. – danny

+0

Merci, enfin je me suis connecté à mon db, définissez db_host comme remote_bind_address host - Je pense que je n'ai pas dit clairement que mon db n'est pas sur ssh_tunnel_host, sur un autre serveur auquel j'accède seulement via ssh_tunnel_host: 'remote_bind_address = (db_host , 3306) ' –