2017-07-20 16 views
0

CLIのsshコマンドのどのパラメータがこのスクリプトのどこにあるのかわかりません(sshチューニング専用の記事を少し読んだ後でも)。 基本的に私はこのトンネルを使ってdb_hostに接続するよりも、( 'ssh_tunnel_host:22'という)いくつかのサーバーに接続する必要があります。sshトンネル経由でリモートDBにアクセスする(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') 

誰かが私に説明してもらえ:

  1. local_bind_addressは何ですか - それは私のローカルアドレスまたはssh_tunnel_hostローカルadderssのですか? IPとポートはどこで知ることができますか?
  2. 前の質問に依存します - remote_bind_addressとは何ですか - ssh_tunnel_hostまたはdb_hostのアドレスですか?これらのIPとポートはどこで知ることができますか?
  3. どこでclient.connect()に接続すればよいですか?ローカルまたはリモートバインド?

(私はドキュメントを読み取ろうでしたが、それはまだいじりれる)

答えて

1

プロキシ接続のように考えてください。 ssh_tunnel_host:22に接続して、<db host>:3306からssh_tunnel_hostにアクセスしたdb_hostのポート3306をクライアントとするプロキシ接続に指示します。

プロキシ接続を使用可能にするローカル(あなたへの)ip:portを指定するか、またはクライアントに空きを選択させることができます。後者はlocal_bind_addressを省略します。

次に、実際にremote_bind_address:3306のプロキシであるローカルポートに接続します。

local_bind_address < - >ssh_tunnel_host < - >remote_bind_address

コードは次のようになります。

クライアントアドレスへのローカル
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. 。いずれかを設定するか、クライアントがtunnel.local_bind_portからポートを選択して見つけさせます。

  2. ssh_tunnel_hostの代理返信先住所。サーバーサービスのローカルの場合、IPは127.0.0.1となり、サービスのポートになります。 ssh_tunnel_hostのネットワーク内の他のIPでもIPでも構いませんが、SSHトンネルホストの外側には見えません。

  3. ここではありません。トンネルには、リモート接続をプロキシするローカルのip:ポートがあります。トンネルが立ち上がったら、他のクライアントは必要ありません。ローカルのip:ポートに接続するだけです。

+0

すぐにアドバイスを試すことはできません。しかし、なぜDBホストが接続チェーンに参加していないのですか? –

+0

'ssh_tunnel_host'から見たdbホスト' 127.0.0.1:3306'はありませんか?どうやってそれがトンネリングされているのですか? Per(2)の場合、DBホストがトンネルホストに対してローカルではない場合、リモートバインドアドレス、つまり 'remote_bind_address =(db_host、3306)'にする必要があります。 – danny

+0

ありがとうございました。最後に私のdbに接続し、db_hostをremote_bind_addressホストに設定しました。私はdbがssh_tunnel_hostにないことを明示していないと思います。 'remote_bind_address =(db_host 、3306) ' –

関連する問題