web-dev-qa-db-ja.com

SSHトンネル経由で接続すると、MySQLアクセス拒否エラー

何ヶ月もの間、ローカルテストサーバーで実行されているMySQLインスタンスにSSHトンネル経由で問題なく接続してきました。しかし、突然、何も変わらないと思いますが、サーバーがSequel Proからのログイン試行を次のエラーで拒否し始めました。

アクセスが拒否されたため、ホスト127.0.0.1に接続できません。

ユーザー名とパスワードを再確認し、現在地からのアクセスが許可されていることを確認してください。

MySQLによると、ユーザー 'root' @ 'localhost'のアクセスは拒否されました(パスワードを使用:YES)

SSHトンネル経由ではなく、SSH経由でサーバーに直接接続すると、ターミナルからログインできます。この問題はSequel Proや特定の個人に固有のものではありません。MySQLWorkbenchを介して接続するときに、オフィスの他のユーザーと同じエラーが発生します。私は正気のためにmysqladminでパスワードをリセットしましたが、それは間違いなく問題ではありません。

詳細を調べ始めたところ、エラーがサーバーをSequel Proで入力した「127.0.0.1」ではなく「localhost」として報告していることに気付きました。友人はそれはおそらく単にエラー処理が悪いのではないかと提案しましたが、MySQLでのlocalhostと127.0.0.1の大きな違いを考えると奇妙に思えます。

トンネリングの問題を回避するために、直接接続できるようにroot @%へのアクセスを許可しました。これはほとんどの部分で機能し、テーブルデータを表示したり、新しいデータベースを作成したりできます。唯一の問題は、ユーザーを作成するときにエラーが発生することです。

ユーザー 'root' @ '%'のアクセスが拒否されました(パスワードを使用:YES)

奇妙なことに、ユーザーは実際に作成されていますが、それは付与の問題にすぎないと思います。繰り返しますが、ターミナルからrootとしてログインすると何でもできます。

トンネル接続と(おそらく)grantコマンドがアクセス拒否エラーを受け取っている理由を誰かが明らかにするのを手伝ってくれる人はいますか?

参考までに、MySQはバージョン5.6.16で、ほとんどがデフォルト設定で、MAC OS X ServerマシンにHomebrewを介してインストールされています。

更新

Rootが現在アクセスを許可されているホストのリストは次のとおりです。

mysql> select Host,user from mysql.user where user='root';
+----------------+------+
| Host           | user |
+----------------+------+
| %              | root |
| 127.0.0.1      | root |
| ::1            | root |
| localhost      | root |
+----------------+------+
4 rows in set (0.00 sec)

私が理解しているように、最初の行( "%")は他の行を本当に冗長にする必要がありますか?

更新2

助成金の問題を修正しました。 root @%ユーザーには、追加のwith grant option最後に、付与以外のすべてを実行できます。ただし、SSHトンネルが拒否されている理由を知りたいと思っています。

12
Adam

MySQLでは、localhostキーワードはMySQLソケットを使用した接続用に予約されており、127.0.0.1上のMySQLネットワークポートへのTCP接続には、ip-address 127.0.0.1を使用する必要があります。つまり、両方のサーバーは、127.0.0.1およびからユーザーに特権を付与する必要があり、クライアントは、ローカルに接続する代わりに-h 127.0.0.1を使用してトンネルを通過する必要があります。ソケット。

SSHポート転送を使用してアクセスできるようにするには、次のようなものが必要です。

GRANT SELECT ON *.* TO user@`127.0.0.1`

そして実行する

FLUSH PRIVILEGES;

そしておそらく

FLUSH QUERY CACHE;

それでも機能しない場合は、サーバープロセスを再起動します。

エラーメッセージで、逆DNSルックアップがlocalhostに変換された後の127.0.0.1は、デバッグを困難にします。

manual がそれを説明しているように:

Unixでは、MySQLプログラムはホスト名localhostを特別に扱います。これは、他のネットワークベースのプログラムと比較して、予想とは異なる可能性があります。 localhostへの接続の場合、MySQLプログラムはUnixソケットファイルを使用してローカルサーバーへの接続を試みます。これは、ポート番号を指定するために--portまたは-Pオプションが指定されている場合でも発生します。クライアントが確実にローカルサーバーへのTCP/IP接続を確立するには、--Hostまたは-hを使用して、127.0.0.1のホスト名値、またはローカルサーバーのIPアドレスまたは名前を指定します。 --protocol=TCPオプションを使用して、localhostの場合でも、接続プロトコルを明示的に指定することもできます。例えば:

Shell> mysql --Host=127.0.0.1
Shell> mysql --protocol=TCP

--protocolオプションを使用すると、他のオプションが通常は他のプロトコルにデフォルト設定される場合でも、特定のタイプの接続を確立できます。

18
HBruijn

これまでにssh tunelsで見たことがありますが、「localhost」へのすべての付与と「127.0.0.1」へのすべての付与には違いがあるため、「localhost」付与の代わりに、または「127.0.0.1」に付与してみてください。

1
Sverre

Sequelを使用してトンネルを作成する代わりに、自分でトンネルを作成するにはどうすればよいですか。

ssh -Cc blowfish -Nf -vv -L3306:localhost:3306 sshuser @ domain

次に、Sequelで127.0.0.1:3306に接続します。接続できますか?ターミナル(またはSSHクライアントログ)に何か表示されますか?

0
Florian Bidabe