Seit Monaten verbinde ich mich ohne Probleme über einen SSH-Tunnel mit der MySQL-Instanz, die auf unserem lokalen Testserver ausgeführt wird. Auf einmal hat der Server den Anmeldeversuch von Sequel Pro mit dem folgenden Fehler abgelehnt:
Verbindung zum Host 127.0.0.1 konnte nicht hergestellt werden, da der Zugriff verweigert wurde.
Überprüfen Sie Ihren Benutzernamen und Ihr Passwort und stellen Sie sicher, dass der Zugriff von Ihrem aktuellen Standort aus gestattet ist.
MySQL sagte: Zugriff verweigert für Benutzer 'root' @ 'localhost' (mit Passwort: JA)
Ich kann mich vom Terminal aus anmelden, wenn ich über SSH direkt mit dem Server verbunden bin, nur nicht über einen SSH-Tunnel. Das Problem ist nicht spezifisch für Sequel Pro oder nur für mich selbst. Beim Herstellen einer Verbindung über MySQL Workbench tritt derselbe Fehler auf wie bei anderen Benutzern im Büro. Ich habe das Passwort mysqladmin
nur aus Gründen der Vernunft zurückgesetzt, das ist definitiv nicht das Problem.
Als ich mich genauer damit beschäftigte, bemerkte ich, dass der Fehler den Server als "localhost" statt als "127.0.0.1" meldete, den ich in Sequel Pro eingegeben hatte. Ein Freund schlug vor, dass dies wahrscheinlich nur eine schlechte Fehlerbehandlung ist, aber es erscheint seltsam angesichts des signifikanten Unterschieds zwischen localhost und 127.0.0.1 in MySQL.
In einem Versuch, das Tunneling-Problem zu umgehen, habe ich den Zugriff auf root @% gewährt, damit ich eine direkte Verbindung herstellen kann. Dies funktioniert größtenteils, ich kann Tabellendaten anzeigen, neue Datenbanken erstellen usw. Das einzige Problem ist, wenn ich Benutzer erstelle, bekomme ich den Fehler:
Zugriff für Benutzer 'root' @ '%' verweigert (mit Passwort: JA)
Seltsamerweise wird der Benutzer tatsächlich erstellt, ich denke, es ist nur ein Problem mit der Gewährung. Auch hier kann ich vom Terminal aus alles tun, wenn ich als root angemeldet bin.
Kann jemand Aufschluss darüber geben, warum Tunnelverbindungen und (wahrscheinlich) Gewährungsbefehle den Fehler "Zugriff verweigert" erhalten?
Als Referenz dient MySQ Version 5.6.16 mit den meisten Standardeinstellungen, die über Homebrew auf einem MAC OS X Server-Computer installiert werden.
Aktualisieren
Hier ist die Liste der Hosts, auf die root derzeit Zugriff hat:
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)
Wie ich es verstehe, sollte die erste Zeile ("%") die anderen wirklich überflüssig machen?
Update 2
Das Grant-Problem wurde behoben. Dem Benutzer "root @%" wurden with grant option
am Ende nicht alle Berechtigungen mit dem Zusatz "extra" erteilt . Würde trotzdem gerne wissen, warum SSH-Tunnel verweigert werden.
quelle
Antworten:
In MySQL ist das
localhost
Schlüsselwort für die Verbindung über den MySQL-Socket reserviert und Sie sollten die IP-Adresse127.0.0.1
für TCP-Verbindungen zum MySQL-Netzwerkport auf 127.0.0.1 verwenden. Dies bedeutet , dass sowohl der Server Berechtigungen für Benutzer von speziell gewähren muß127.0.0.1
, und der Kunde muss verwenden-h 127.0.0.1
durch den Tunnel zu gehen , anstatt zu einer lokalen Steckdose zu verbinden.Um den Zugriff über die SSH-Portweiterleitung zu ermöglichen, benötigen Sie Folgendes:
und dann rennen
und möglicherweise
Wenn es immer noch nicht funktioniert, starten Sie den Serverprozess neu.
In Fehlermeldungen 127.0.0.1 wird nach einem Reverse-DNS-Lookup
localhost
das Debuggen erschwert.Wie im Handbuch beschrieben:
quelle
grant all on *.* to 'root'@'127.0.0.1' with grant option;
ssh -h 127.0.0.1 -u root -p
remote auf dem Server eingebe, wird die Verbindung ebenfalls abgelehnt.-h 127.0.0.1
fehlgeschlagenen Verbindungen auf dem Server durch einen Neustart von mysql behoben, aber der ssh-Socket funktioniert immer noch nichtIch habe in der Vergangenheit mit ssh tunels gesehen, dass es einen Unterschied gibt zwischen Grant all to "localhost" und grant all to "127.0.0.1". Versuchen Sie also, Grant to "127.0.0.1" stattdessen oder zusätzlich zu Ihrem "localhost" -Stipendium zu erteilen.
quelle
grant
Anweisungen mit erneut aus,identified by ..
um sicherzustellen, dass alle Root-Passwörter gleich sind, aber keine Freude bereitet.Anstatt die Fortsetzung zum Erstellen des Tunnels zu verwenden, was erstellen Sie den Tunnel selbst?
ssh -Cc blowfish -Nf -vv -L3306: localhost: 3306 sshuser @ domain
Stellen Sie dann eine Verbindung mit Sequel zu 127.0.0.1:3306 her. Können Sie eine Verbindung herstellen? Erscheint etwas auf Ihrem Terminal (oder in den ssh-Client-Protokollen)?
quelle