web-dev-qa-db-ja.com

マルチホップSSHトンネルを介してTCP接続(具体的にはMyQSLクライアント->サーバー)を転送するにはどうすればよいですか?

リモートMySQLデータベースへの接続を開きたい。このデータベースは別のネットワーク上のプライベートサブネットにあるため、データベースへの接続を直接開くことはできません。 MySQLサーバーではリモートSSHアクセスも完全に無効になっています。

私の現在のプロセスはこれです:

公開されているサーバーHost_1を介してSSHトンネルを開きます。そのトンネルから、MySQLサーバー(MYSQL_Host)と同じサブネット上にあるサーバー(Host_2)へのSSH接続を開きます。その時点で(Host_2で)開いているSSHセッションを使用して、MySQLクライアントを使用してMYSQL_Hostへの接続を開きます。

これは、現在行われていることの超大まかな図です。

diagram of current connection

私がやりたいことは、ローカルコンピューターのMySQLクライアントを使用して127.0.0.1:3306に接続し、接続をからずっとトンネリングすることです。そもそもMySQLサーバーを127.0.0.1から実行しているかのように、Host_1、Host_2、そしてMYSQL_Hostへ。

繰り返しますが、Host_2からMYSQL_HostへのSSHトンネルを開くことができないため、そこからのトンネリングはありません。 MySQLクライアント接続をSSHトンネルを介してHost_2に転送し、Host_2にMySQLクライアント接続をMYSQL_Hostに転送させる方法を理解する必要があります。

これを実現するには、redirまたはncを使用できると思いました。でも、どうすればいいのかわかりません。

私が読んだいくつかの質問がありますが、私が探している答えを得るために情報をまとめるのに十分なすべてを理解していません:

  1. 複数のホップを介したSSHトンネル
  2. SSHトンネルを介したUDPトラフィック
  3. https://unix.stackexchange.com/questions/267090/reroute-mysql-connection-through-external-machine

このページに役立つ情報があることはわかっていますが、その使用方法がわかりません: http://sshmenu.sourceforge.net/articles/transparent-mulithop.html

ありがとう!

2

この回答は、sshdがHost_1およびHost_2でポート転送を許可するように構成されていることを前提としています。

必要なもののほとんどはすでに見つかりました(最初のリンクのMika Fischerの回答のオプション2)。

ローカルホストからホスト1へ、およびホスト1からホスト2へのトンネル:

ssh -L 9999:localhost:9999 Host1 ssh -L 9999:localhost:1234 -N Host2これにより、localhostからHost1へのトンネルと、Host1からHost2への別のトンネルが開きます。ただし、Host2:1234へのポート9999は、Host1の誰でも使用できます。これは問題になる場合と問題にならない場合があります。

アイデアは、ポート転送をつなぎ合わせることです(つまり、ローカルポートをリモートポートに転送し、それをさらにリモートポートに転送します)。

あなたの例では、コマンドは次のようになります

ssh -tt -L 3306:localhost:XXXX [user@]Host_1 ssh -L XXXX:MYSQL_Host:3306 [user@]Host_2ここで、XXXXは、まだ使用されていない1024を超えるポートです(両方のインスタンスを置き換えるには同じ番号を使用します)

パスワードなしのログインにSSHキーを使用している場合を除き、実行されると、パスワードの入力を2回(Host_1に1回、Host_2に1回)要求されます。 Host_1を介してHost_2に接続している限り、トンネルは機能します。

内訳は次のとおりです。

sshは、実行しているローカルsshクライアントです

-ttはpseudo-ttyの割り当てを強制します( stdinは端末ではないため、疑似端末は割り当てられません これが必要になる理由については)

-L 3306:localhost:XXXX [user@]Host_1は、ローカルシステムの3306をSSH接続の反対側の「localhost」のポートXXXXに転送するようにローカルsshクライアントに指示しています。ローカルコンピューターのユーザーがHost_1で接続しているユーザーと異なる場合にのみ、user@を指定する必要があります。より一般的には、3306以外のローカルポートを指定できますが、その場合、mysqlクライアントに127.0.0.1:[選択したポート]を指定します。

ssh(2番目)ご存知かもしれませんが、sshには、シェルを起動する代わりに単一のコマンドを実行するオプションがあります。これを使用して、Host_1で別のSSHセッションを実行し、ポート転送チェーンに次のリンクを作成します。

-L XXXX:MYSQL_Host:3306 [user@]Host_2このsshセッションはHost_1で実行されているため、ローカル側(Host_1)のXXXX(クライアントの3306から転送されている)をリモート側(Host_2)のMYSQL_Hostのポート3306に転送しています。 Host_1のユーザーが、Host_2で接続しているユーザーと異なる場合にのみ、user@を指定する必要があります。

追加のホップが必要な場合は、パス内のすべてのサーバーでXXXXが使用可能なポートである限り、途中のホップごとにssh -L XXXX:localhost:XXXX hostXのインスタンスを追加します。

1
Omnipresence

Host_1を介してHost_2へのSSH接続をプロキシしているため、単一の-Lポートフォワードでのみプロキシ接続を実行できます。

ssh -A -o'ProxyCommand = ssh -q user @ Host_1 nc%h%p 'user @ Host_2 -L 3306:MYSQL_Host:3306

これは基本的に現在行っていることを実行します。Host_1へのssh接続を介してプロキシされたHost_2へのssh接続を開き、ローカルホスト上の3306からMYSQL_Host:3306に接続を転送します。 MYSQL_Hostは、Host_2からの接続を認識することに注意してください。これは、そこでトンネルを出て、通常のTCP接続に戻るためです。

ところで、ローカルコンピューターとHost_1の両方にOpenSSH 7.3以降がある場合は、 new -Jオプション(またはssh構成ファイルのProxyJumpディレクティブ)を使用してSSHプロキシを簡略化できます。 )

ssh -A -J user @ Host_1 user @ Host_2 -L 3306:MYSQL_Host:3306

これにより、複数のSSHプロキシを簡単に通過できるようになります。

ssh -A -J user @ Host_1、user @ Host_3、user @ Host_3 user @ Host_4 -L 3306:MYSQL_Host:3306

1
Gordon Davisson