it-swarm.com.de

MySQL-Verbindung über SSH-Tunnel

Ich habe einen SSH-Tunnel zwischen zwei ServernAundBeingerichtet.Bhat MySQL-Server und das funktioniert:

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

Während dies nicht tut:

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

My.cnf hat zwar folgende Zeilen:

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

Nun zum Tunnel. Es verbindet folgendes: (A) localhost(9989) -> (B) localhost(3306) Aber wenn (aufEIN, mit weitergeleiteten Ports), mache ich das 

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

Ich bekomme ERROR 2013 (HY000): Lost connection to MySQL server at 'reading initial communication packet', system error: 0

Und wenn ich das tue

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

Ich bekomme ERROR 1045 (28000): Access denied for user 'user'@'localhost' (using password: YES)

Was könnte der Grund sein? Was mache ich falsch?

24
madfriend

Hier gibt es drei Probleme.

1 - Vergiss den SSH-Tunnel vorerst

Sie können MySQL nicht an mehr als eine bestimmte IP-Adresse binden. Die erste bind-address-Klausel wird von der zweiten Klausel überschrieben (daher ignoriert). Ihr Server hört nur auf 99.99.99.99.

Der Grund, warum Sie mit -h localhost eine Verbindung herstellen können, aber nicht mit -h 127.0.0.1, besteht darin, dass Sie im ersten Formular keine Verbindung über TCP/IP, sondern über einen lokalen Socket herstellen.

Suchen Sie in Ihrem my.cnf nach einer socket-Klausel.

Entfernen Sie eine redundante bind-address-Klausel. Möglicherweise möchten Sie bind-address=0.0.0.0 verwenden, mit dem der MySQL-Dämon die Netzwerkschnittstellen von all abhören kann.

2 - Lassen Sie uns Ihren SSH-Tunnel einrichten

Der Grund für Ihren Fehler ERROR 2013 (HY000): Lost connection to MySQL server at 'reading initial communication packet', system error: 0 ist für mich nicht offensichtlich. I suspect Der SSH-Tunnel wird tatsächlich nur dann eingerichtet, wenn er eine Verbindungsanfrage erhält (in Ihrem Fall, wenn Sie den mysql-Client ausführen). Da Ihr Server nicht auf 127.0.0.1 (siehe vorherigen Absatz) wartet, kann der SSH-Tunnel nicht aufgebaut werden, die Verbindung schlägt fehl und Ihr Client interpretiert sie als Netzwerkfehler.

3 - Warum mysql -v -h localhost -P 9989 -u user userdb -p fehlschlägt

Bitte posten Sie die Ausgabe von 

[edit: hat gerade ...OR Host LIKE 'localhost' hinzugefügt, da dies für die Fehlerbehebung relevant sein kann]

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

(Ersetzen Sie 'user' nach der LIKE-Klausel durch den tatsächlichen Benutzernamen, falls erforderlich.)

Die MySQL-Zugriffskontrolle überprüft sowohl den Benutzernamen/das Kennwort (user) als auch den Ursprung der Verbindung (Host), um einen Benutzer zu identifizieren. Sie haben wahrscheinlich keinen Benutzer 'user'@'localhost' erstellt.

NB .: mysql.com kann derzeit nicht von meinem Standort aus erreichbar sein. Daher kann ich keine Verknüpfung zu den entsprechenden Handbuchseiten herstellen.

29
RandomSeed

Ich bin gerade diesem Problem begegnet.

In meinem Fall ist der MySQL-Server mit bind-address: 192.168.4.4..__ konfiguriert. Ich habe ursprünglich einen SSH-Tunnel mit einem häufig genannten -L 3306:localhost:3306 [email protected]-String eingerichtet und von meinem Computer aus mit mysql -h 127.0.0.1 verbunden.

Dies funktioniert nicht, weil MySQL nicht mehr auf 0.0.0.0 oder sogar auf "localhost" (aka 127.0.0.1) hört, nur 192.168.4.4.

Die korrekte Tunnelzeichenfolge sollte -L 3306:192.168.4.4:3306 [email protected]..__ sein. Dies weist das entfernte Tunnelende an, eine Verbindung zu MySQL unter Verwendung der IP-Adresse herzustellen, auf der MySQL tatsächlich abhört.

10
Mxx

Schritt für Schritt SSH-Tuning

--- SERVER SEITE ----

auf dem Zielcomputer (der per IP oder einer gehosteten Domäne adressiert werden kann) befindet sich die Konfigurationsdatei /etc/mysql/my.cnf mit einer Zeile 

bind-address    = 127.0.0.1

mit Konsole bestätigt

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

dies bedeutet, dass der Mysql-Server nur auf Anfragen vom Localhost antwortet 

--- CLIENT SEITE ----

sie haben ein Konto (eventuell ein SSH-Schlüssel), um sich mit cygwin, PuTTY oder einer linux_Shell zu protokollieren

ssh [email protected]_name

sSH-TUNNEL erstellen

ssh -f -N -L 1000:127.0.0.1:3306    [email protected]_name

was bedeutet, dass ssh eine permanente Verbindung von Port 1000 auf dem Computer, den ich (Client) eingebe, mit dem Remote-Host-Namen verbindet: 3306 .... 127.0.0.1 bedeutet hier Remote (Host-Name) und sollte nicht durch localhost Word ersetzt werden, da dies der Fall ist Verbindung über unix (named) Socket nicht über IP herstellen ... Sie erhalten 'ERROR 2002 (HY000): Es kann keine Verbindung zum lokalen MySQL-Server über Socket' /var/run/mysql.sock '(2 ) ' beim Versuch, MySQL zu verbinden

-f = in den Hintergrund gehen - N = keine Ausrede 

beide -f -N Art von nohoop - Sie können die Konsole schließen und Tunnel bestehen bleiben

--- SERVER SEITE ---

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

was bedeutet, dass eine ständige Verbindung über das Protokoll shh besteht 

--- CLIENT SEITE ---

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

nun ist Ihr (clientseitiger) MySQL-Client mit dem Remote-MySQL-Server verbunden. Hier ist 127.0.0.1 der Client-Computer 

gleiches für Workbench, HeidiSQL 


wie man SSH-Tunnel tötet

ps fax | grep ssh
kill process_id
4
bortunac

Ich hatte das gleiche Problem ("Lost connection...") unter Windows (während ich den ssh-Tunnel über PuTTY verwendete). Ich habe hier 2 Ausgaben:

  1. Falscher Port wurde verwendet. Überprüfen Sie, ob Sie den Port richtig eingestellt haben 
  2. Ich habe das Aktivieren in PuTTY: Connection > SSH > Tunnels > Local ports accept connections from other hosts vergessen
1
suz

In meinem Fall blockierte eine Konfiguration im SSH-Daemon den Tunnel. AllowTcpForwarding sollte aktiviert sein.

AllowTcpForwarding yes
1
Carlos Devia

Ein einfacher Schritt hat für mich funktioniert ... Ich teile das mit, vielleicht können einige von Ihnen Kopfschmerzen ersparen.

MEINE EINSTELLUNG

In meinem speziellen Fall habe ich einen Percona-Server, der auf Ubuntu läuft und über SSH mit MySQL Workbench (in einer Windows-VM) verbunden ist. Der Server lief mehrere Tage fehlerfrei, bevor er beim Verarbeiten einer Abfrage einen Fehler 10060 ausspuckte.

WAS FÜR MICH ARBEITET

Ich habe in einem Forum von Acquia.com festgestellt, dass die Workbench '127.0.0.1' in einigen Fällen nicht als Host akzeptiert, daher müssen Sie sie in 'localhost' ändern. Ich tat es und es funktionierte (seltsamerweise fragte die Workbench erneut nach den Passwörtern, auch wenn sie bereits gespeichert waren, aber trotzdem funktionierte).

0
VBAstard