web-dev-qa-db-ja.com

SSHトンネルを介したMySQL接続

2つのサーバー[〜#〜] a [〜#〜]および[〜#〜] b [〜# 〜][〜#〜] b [〜#〜]にはMySQLサーバーがあり、これは機能します。

mysql -h localhost -P 3306 -u user -p

これはしませんが:

mysql -h 127.0.0.1 -P 3306 -u user -p

My.cnfには次の行がありますが:

bind-address        = 127.0.0.1
# Next addr differs slightly, but anyway
bind-address        = 99.99.99.99

トンネルについて。それは次を接続します:(A) localhost(9989) -> (B) localhost(3306)しかし(on[〜#〜] a [〜#〜]、ポートを転送した場合)

mysql -v -h 127.0.0.1 -P 9989 -u user userdb -p

ERROR 2013 (HY000): Lost connection to MySQL server at 'reading initial communication packet', system error: 0を取得します

そして私がするとき

mysql -v -h localhost -P 9989 -u user userdb -p

ERROR 1045 (28000): Access denied for user 'user'@'localhost' (using password: YES)を取得します

理由は何ですか?私は何を間違えていますか?

24
madfriend

ここには3つの問題があります。

1-今のところSSHトンネルを忘れる

MySQLを複数の特定のIPにバインドすることはできません。最初の_bind-address_句は、2番目の句によってオーバーライドされます(したがって、無視されます)。サーバーは_99.99.99.99_のみをリッスンします。

_-h localhost_で接続できるが_-h 127.0.0.1_では接続できない理由は、最初の形式では、実際にはTCP/IP経由ではなく、ローカルソケット経由で接続するためです。

_my.cnf_でsocket句を探します。

1つの冗長な_bind-address_句を削除します。 _bind-address=0.0.0.0_を使用すると、MySQLデーモンにallネットワークインターフェイスをリッスンするように指示できます。

2-SSHトンネルをセットアップしましょう

エラーERROR 2013 (HY000): Lost connection to MySQL server at 'reading initial communication packet', system error: 0の理由は私には明らかではありません。 IsuspectSSHトンネルは、実際には接続要求を受信したときにのみ確立されます(あなたの場合、mysqlクライアントを実行したとき)。サーバーは127.0.0.1をリッスンしないため(前の段落を参照)、SSHトンネルを確立できず、接続に失敗し、クライアントはそれをネットワーク障害として解釈します。

3-_mysql -v -h localhost -P 9989 -u user userdb -p_が失敗する理由

の出力を投稿してください

[編集:単に_...OR Host LIKE 'localhost'_を追加しました。これはトラブルシューティングの目的に関連する可能性があるためです]

_mysql > SELECT user, Host FROM mysql.user WHERE user LIKE 'user' OR Host LIKE 'localhost';
_

LIKE句の後の_'user'_を、必要に応じて実際のユーザー名に置き換えます)

MySQLアクセス制御は、ユーザーを識別するために、ユーザー名/パスワード(user)と接続の発信元(Host)の両方をチェックします。おそらくユーザー_'user'@'localhost'_を作成していません。

N.B .: mysql.comが現在の場所から到達できないため、関連するマニュアルページにリンクできません。

29
RandomSeed

まさにこの問題に遭遇しました。

私の場合、MySQLサーバーはbind-address: 192.168.4.4で構成されています。私はもともと一般的に言及されている-L 3306:localhost:3306 user@server文字列を使用してSSHトンネルをセットアップし、コンピューターからmysql -h 127.0.0.1で接続します。

これは、MySQLが.0.0.または"localhost"(別名127.0.0.1)でリッスンしなくなり、192.168.4.4のみをリッスンするため、機能しません。

正しいトンネル文字列は-L 3306:192.168.4.4:3306 user@serverである必要があります。これにより、MySQLが実際にリッスンするIPを使用して、リモートトンネルエンドがMySQLに接続するように指示されます。

10
Mxx

ステップバイステップのSSHトンネリング

- - サーバ側 - -

ターゲットマシン(IPまたはホストドメインで追加可能)には、構成ファイル/ etc/mysql/my.cnfがあります

bind-address    = 127.0.0.1

コンソールで確認済み

netstat -tapn |  grep mysql
// tcp    0    0 127.0.0.1:3306     0.0.0.0:*    LISTEN      18469/mysqld

これは、mysqlサーバーがローカルホストからのリクエストにのみ応答することを意味します

- - クライアント側 - -

cygwin、PuTTY、またはlinux_Shellを使用してログを記録するアカウント(最終的にはsshキー)を持っている

ssh user_name@Host_name

sSHトンネルを作成する

ssh -f -N -L 1000:127.0.0.1:3306    user_name@Host_name

つまり、私が入力したマシンのポート1000からリモートHost_name:3306への永続的な接続を作成することを意味します。 IPではなくUNIX(名前付き)ソケットに接続します...取得します 'ERROR 2002(HY000):Ca n't connect to local MySQL server through socket'/var/run /mysql.sock '(2)'mysqlをco接続しようとするとき

-f =バックグラウンドに入る-N =実行なし

両方の-f -N種類のnohoop-コンソールを閉じてトンネルを維持できます

- - サーバ側 - -

netstat -tapn |  grep ssh
// tcp  0  0  server_ip:22   clint_ip:port  ESTABLISHED 24915/sshd: user_name

これは、shhプロトコルを介した永続的な接続があることを意味します

- - クライアント側 - -

mysql -h 127.0.0.1 -P 1000 -u mysql_user -pmysql_pass

これで、(クライアント側の)mysqlクライアントはリモートmysqlサーバーに接続されます...ここで127.0.0.1はクライアントマシンです

ワークベンチ、heidiSQLでも同じ


sSHトンネルを殺す方法

ps fax | grep ssh
kill process_id
7
bortunac

Windowsでも同じ問題("Lost connection...")がありました(PuTTY経由でsshトンネルを使用中)。ここに2つの問題があります。

  1. 間違ったポートが使用されました。正しく設定しているかどうかを再確認してください
  2. PuTTY: Connection > SSH > Tunnels > Local ports accept connections from other hostsで有効にするのを忘れました
1
suz

私の場合、SSHデーモンの構成がトンネルをブロックしていました。 AllowTcpForwardingを有効にする必要があります。

AllowTcpForwarding yes
1
Carlos Devia

簡単なステップが私のために働いた...私はこれを共有するので、多分あなたの一部は頭痛を免れることができます。

私の設定

私の場合、Ubuntuで実行されているPerconaサーバーがあり、SSHを介して(Windows VMの)MySQL Workbenchに接続されています。クエリの処理中にエラー10060が発生するまで、サーバーは数日間正常に動作しました。

私のために働いた

Acquia.comのフォーラムで、ワークベンチがホストとして「127.0.0.1」を受け入れない場合があるため、「localhost」に変更する必要があることがわかりました。私はそれをしましたが、うまくいきました(奇妙なことに、Workbenchは既にパスワードが保存されていたとしてもパスワードを再度要求しましたが、それでもうまくいきました)。

0
VBAstard