Wie erlaube ich Remote-MySQL-Zugriff auf eine einzelne statische IP?

7

Ich versuche, den Remotezugriff auf MySQL über Port 3306 zu aktivieren, habe aber kein Glück. Ich habe Root-Zugriff auf eine Produktionsmaschine erhalten, damit ich Dateien und Datenbanken abrufen, lokal bearbeiten und geänderte Versionen zurücksetzen kann.

Durch meinen Zugriff kann ich SSH in die Box und FTP über SSH. Ich versuche jetzt, MySQL-Zugriff über SSH zu erhalten. MySQL wird ausgeführt (lokal abgehört) und ist über die Befehlszeile zugänglich und kann problemlos darauf zugreifen.

Mir ist klar, dass ich einfach die Datenbank sichern, die Datei lokal wiederherstellen und meine Änderung vornehmen kann. In Zukunft muss ich jedoch wahrscheinlich einige Dinge ändern, und ich würde es vorziehen, dies nicht über die Befehlszeile tun zu müssen, da dies über eine GUI schneller geht. Oder wäre, wenn ich mich verbinden könnte, wie ich will.

Codecraft
quelle

Antworten:

3

BEARBEITEN: Wenn Sie Windows verwenden, müssen Sie bei den folgenden Anweisungen zwei Dinge beachten:

1) Wechseln Sie localhostzu, 127.0.0.1da Windows dies nicht automatisch eingerichtet hat %SystemRoot%\system32\drivers\etc\hosts.

2) Sie können das wenig bekannte Befehlszeilentool plink.exe aus der PuTTY -Tool- Suite verwenden. Es verwendet dieselbe Syntax für Optionen wie der sshBefehl. Wenn Sie also sshin den folgenden Beispielen durch ersetzen plink.exe, sollte alles funktionieren.


Sie möchten einen SSH-Tunnel verwenden, um einen lokalen Port auf Ihrem Client an den MySQL-Port auf dem Server weiterzuleiten. Sie können das tun mit:

% ssh -f -N -L3306:localhost:3306 username@remoteserver
% mysql -h remoteserver -u mysqluser -p

Die Optionen für ssh bedeuten:

-f Requests ssh to go to background just before command execution.
-N Do not execute a remote command.
-L [bind_address:]port:host:hostport
   Specifies that the given port on the local (client) host is to be 
   forwarded to the given host and port on the remote side.

Die Verwendung -f -Nbedeutet auch, dass Sie einen SSH-Prozess in den Hintergrund verschoben haben, anstatt wie gewohnt mit dem Remote-Host verbunden zu bleiben, wenn Sie in einer Remote-Shell angemeldet sind. Wenn Sie den Tunnel abreißen möchten, können Sie den SSH-Prozess auf Ihrem Client wie folgt beenden:

% pgrep -fl ssh
11145 ssh -f -N -L3306:localhost:3306 username@remoteserver
% kill -9 11145

In diesem Fall 11145ist natürlich die PID des SSH-Prozesses unterschiedlich, die jedes Mal anders ist, wenn Sie einen neuen SSH-Prozess starten, um einen Tunnel zu öffnen.

Auch nehme an, dies , dass Sie nicht haben den MySQL - Server auf dem Client auch ausgeführt wird . In diesem Fall müssen Sie den lokalen Port, an den Sie binden, folgendermaßen ändern:

% ssh -f -N -L3333:localhost:3306 username@remoteserver
% mysql -P 3333 -h remoteserver -u mysqluser -p

Der Hafen 3333ist beliebig; Sie können jede freie Portnummer auswählen, die Ihr Client hat.

aculich
quelle
Genau das wollte ich tun, aber ich benutze Windows zu diesem Zweck. Ich hatte gestern Abend einen Freund und wir (er) haben es für mich herausgefunden.
Codecraft
Wenn Sie mit Windows nicht weiterkommen, können Sie das wenig bekannte Plink- Befehlszeilentool aus der PuTTY -Tool- Suite verwenden. Es verwendet dieselbe Syntax für Optionen. Wenn Sie also sshin den obigen Beispielen plinkdiese ersetzen , sollte alles funktionieren.
Aculich
4

Verwenden -s 192.168.100.0/24bedeutet, dass Sie den Remotezugriff auf Port 3306 nur für IP-Bereiche zulassen, die mit 192.168.100.0/24 übereinstimmen. Dies ist ein privates internes Netzwerk. Ist das wirklich das, was Sie vorhaben? Andernfalls ist dies das Problem, warum Remoteverbindungen von anderen IPs nicht funktionieren.

Normalerweise benötigen Sie die ausgehende Regel auch nicht.

Wenn dies nicht hilft, geben Sie bitte ein wenig mehr Informationen darüber, von wo aus Sie testen, IPs / Schnittstellen des Computers, was passiert und möglicherweise eine vollständige Ausgabe iptables -vnLfür uns?

Bearbeiten 1 :
Basierend auf weiteren Informationen wird angezeigt, dass das als Vorlage verwendete Beispiel missverstanden wurde. Sie müssen den Quell-IP-Bereich entfernen (da Sie alle remote zulassen möchten). Geben Sie einfach dies und nur dies ein und es sollte funktionieren:

iptables -A INPUT -i eth0 -p tcp --dport 3306 -m state --state NEW,ESTABLISHED -j ACCEPT

Wenn Sie Ihre externe IP-Adresse einschließen möchten, muss dies die Ziel-IP sein, z.

    iptables -A INPUT -i eth0 -p tcp -d xx.xx.xx.xx --dport 3306 -m state --state NEW,ESTABLISHED -j ACCEPT

-swird wie in der Quelle nur verwendet, wenn Sie den Zugriff von bestimmten IP-Bereichen aus beschränken möchten.

Edit 2 :
Scheint überhaupt keine iptables-Frage zu sein, sondern eher eine mySQL-Frage. Damit mySQL überhaupt Remoteverbindungen abhören kann, müssen Sie es so konfigurieren, dass es Ihre externe Adresse abhört. Bearbeiten /etc/mysql/my.cnfund überprüfen Sie die bind-addressAnweisung und ändern Sie sie in:

bind-address = xx.xxx.xx.xx

Entweder haben Sie xx.xx.xx.xx durch Ihre externe IP-Adresse ersetzt, oder Sie können festlegen 0.0.0.0, dass alle Schnittstellen abgehört werden.

Danach stellt sich für Sie die Frage, wie Sie zunächst die gesamte Firewall für Ihren Server einrichten. Entweder blockieren Sie manuell alle spezifischen Ports, auf die niemand sonst zugreifen kann, oder Sie müssen eine Standardrichtlinie festlegen, um den Datenverkehr abzulehnen, und dann Port für Port (wie in Ihrer ersten Frage angegeben) für Dienste, die Sie zulassen möchten, manuell öffnen. Seien Sie jedoch SEHR vorsichtig, wenn es sich um eine Remote-Maschine handelt, ist es sehr einfach, sich selbst auszusperren, wenn Sie die Dinge in die falsche Reihenfolge oder in die falsche Richtung bringen.

Mattias Ahnberg
quelle
Das ist das Beispiel von der Seite, die ich mir angesehen habe. Stattdessen habe ich dort meine eigene externe IP-Adresse ersetzt.
Codecraft
Wenn Sie die externe IP hinzufügen, bedeutet dies, dass Sie Datenverkehr von (-s, wie in der Quelle) Ihrer externen IP zum eingehenden Port 3306 zulassen. Um jede Art von Verkehr einfach -s 192.168.100.0/24vollständig zu entfernen , verlassen Sie einfach:iptables -A INPUT -i eth0 -p tcp --dport 3306 -m state --state NEW,ESTABLISHED -j ACCEPT
Mattias Ahnberg
Ich möchte nur über mein Netzwerk darauf zugreifen können, daher die IP-Adresse. Ich möchte nicht, dass ein offener MySQL-Port Leute dazu einlädt, ...
Codecraft
Aha. Ganz andere Situation also. Sie sagten, Sie wollten remote darauf zugreifen. : PI sieht auch, dass die Standardrichtlinie ACCEPT ist und Sie den Datenverkehr nirgendwo anders ablegen, sodass die Firewall in Ihrem Fall schließlich nicht das Problem ist. Was Sie wahrscheinlich tun müssen, ist wahrscheinlich, mySQL so zu konfigurieren, dass es Remoteverbindungen abhört.
Mattias Ahnberg
2
Ja, es bedeutet, dass es nur auf localhost hört. Sie können jedoch problemlos durch SSH tunneln, ich mache es die ganze Zeit. Von Ihrem Client aus: ssh [email protected] -L 3305:localhost:3306und dann in einem anderen Terminal auf dem Client: mysql -h 127.0.0.1 -P 3305 -u username -pund Sie stellen über den SSH-Tunnel eine Verbindung zum Remote-mySQL her. Dies setzt voraus, dass der Remote-Server die Portweiterleitung usw. nicht blockiert hat, aber normalerweise hervorragend funktioniert!
Mattias Ahnberg
1

Durch den -AWechsel zu iptables werden die neuen Regeln zum Ende der Kette hinzugefügt. Es ist wahrscheinlich, dass Sie eine frühere Regel haben, die den Zugriff verweigert, und mit iptables gewinnt das erste Match. Verwenden Sie den -ISchalter, um die Regel am Anfang der Kette einzufügen.

Wenn das nicht funktioniert, zeigen Sie uns bitte die Ausgabe iptables -L -v -nals Bearbeitung Ihrer Frage.

user9517
quelle
Es scheint keine anderen Regeln zu geben, ich habe die Frage bearbeitet, xx.xx.xx.xx ist jedoch tatsächlich meine externe IP-Adresse.
Codecraft
@Codecrat: Haben Sie Ihren Remote-Host autorisiert, eine Verbindung zum MySQL-Server herzustellen? Versuchen Sie zu telnet yourserver.tld 3306sehen, was es sagt.
user9517
Wenn ich telnet (mit PuTTy) auf 3306, geht es einfach "boing" und beendet. Ich kann es ganz gut SSH (so bin ich auf dem Server, um iptables zu ändern). Ich habe meinen MySQL-Client (SQLYog) verwendet, um über SSH auf MySQL zuzugreifen, aber es heißt, dass er sich nicht authentifizieren kann (mit denselben SSH-Anmeldeinformationen wie für den Zugriff auf das Terminal). FTP über SSH funktioniert einwandfrei. Etwas Seltsames ist los!
Codecraft
Verwenden Sie Telnet von dem Remotecomputer, auf den Sie Zugriff gewähren möchten.
user9517
Verbindung abgelehnt.
Codecraft
1

Ihre Standardrichtlinie für INPUT und OUTPUT lautet ACCEPT. Sie haben keine Regeln zum Verwerfen oder Ablehnen von Paketen definiert. Dies bedeutet, dass Ihre Firewall keine Verbindungen blockiert.

Das Problem ist woanders.

Verwenden netstat -tan | grep LISTENSie diese Option , um sicherzustellen, dass Sie MySQL ausführen und es abhört.

Wenn das funktioniert, gibt es wahrscheinlich irgendwo eine andere Firewall, die die Verbindung blockiert.

Ladadadada
quelle
Es läuft, die Website ist in Betrieb und ich kann über die Befehlszeile problemlos auf MySQL zugreifen, aber dies ist für die Entwicklung nicht nützlich. Um ehrlich zu sein, war ich auch ein bisschen misstrauisch gegenüber der Leere der iptables, aber ich habe nicht viel zu tun - ich habe keinen Zugriff auf den vorherigen Entwickler, der weitergezogen ist, und der Projektbesitzer ist nicht technisch. Ich habe IPTables ausprobiert, weil ich mich beim Webhost-Panel angemeldet hatte und in einem früheren Ticket nach dem Remotezugriff gefragt wurde. Daraufhin wurde darauf hingewiesen, dass es in IPTables auf dem Server selbst konfiguriert werden muss.
Codecraft
Apache, PHP und der Befehlszeilenclient können alle über den Socket mit dem MySQL-Server kommunizieren, ohne das Netzwerk zu verwenden. Der netstatBefehl überprüft, ob er ebenfalls zuhört.
Ladadadada
Ich habe den Befehl ausgeführt und angenommen, dass er
anzeigt
1

Ich habe eine Antwort auf meine eigene Frage gefunden (ich hätte klarstellen müssen, dass ich Windows 7 lokal und Linux remote verwende).

Wie auch immer, die Antwort war, einen Port mit PuTTy weiterzuleiten, wie beim anderen Antwortenden - aber dies ist für Windows-Benutzer.

Richten Sie im PuTTy wie gewohnt eine SSH-Verbindung ein, gehen Sie dann zu den Einstellungen für Tunnel. Wählen Sie unter SSH einen beliebigen Port (ich habe 5555 verwendet) lokal aus, um ihn an 127.0.0.1:3306 weiterzuleiten

PuTTy Tunneling-Optionen

Öffnen Sie die SSH-Sitzung und melden Sie sich wie gewohnt an.

Setzen Sie dann in Ihrem MySQL-Client die Hostadresse auf 127.0.0.1 und den Port auf die ausgewählte (5555).

Daher stellt der MySQL-Client eine Verbindung zu Ihrem lokalen Computer her, der wiederum über SSH an 3306 auf dem Remotecomputer weitergeleitet wird und die Verbindung zulässt.

GROSSER HINWEIS: Wir hatten dieses Setup tatsächlich mit dem Begriff localhost (wie Sie) anstelle von 127.0.0.1 eingerichtet, irgendwo zwischen PuTTy und dem MySQL-Client. Dies wurde nicht behoben. Sie müssen also anscheinend die Loopback-Adresse verwenden!

Codecraft
quelle
Ah, ja ... noch ein Windows-Ärger, dass es keine 127.0.0.1-Auflösung für localhost gibt. Es ist möglich, dies zu tun, wenn Sie es %SystemRoot%\system32\drivers\etc\hostsauf Ihrem System hinzufügen , aber ja, ich bin froh zu sehen, dass Sie es herausgefunden haben, indem Sie zur numerischen Darstellung gewechselt sind. Ich werde meine Antwort mit diesen zusätzlichen Informationen aktualisieren. Sie können auch das Befehlszeilentool plink aus der PuTTY- Suite verwenden, wenn Sie das PuTTY-GUI-Tool nicht öffnen müssen.
Aculich
Wenn Sie einen Windows-Clientcomputer verwenden, sollten Sie sich HeidiSQL (www.heidisql.com) ansehen, mit dem Sie Ihr MySQL-System über eine SSH-Verbindung verwalten können, ohne zusätzliche Software verwenden zu müssen.
John Gardeniers
@aculich Ich habe deine Antwort angenommen. es scheint kaum fair, meine eigenen zu akzeptieren :)
Codecraft
1
@JohnGardeniers Der von mir verwendete SQL-Client (SQLYog) bietet Optionen für die Verbindung über einen SSH-Tunnel, wird jedoch aus unbekannten Gründen nicht authentifiziert, obwohl ich nicht die neueste Version ausführe - daher die Problemumgehung.
Codecraft
@Codecraft, HeidiSQL hatte früher das gleiche Problem und es war meistens ein Fall von zu kurzer Zeitüberschreitung. Wenn dies also auf SQLYog einstellbar ist, kann es sich lohnen, damit zu experimentieren.
John Gardeniers
0

Ich danke dir sehr! Ich habe alles Mögliche versucht, um MySQL Workbench remote verwenden zu können, um an den Tabellen in meiner CentOS MySQL-Implementierung zu arbeiten. Grundsätzlich bestand die einzige Lösung darin, Port 3306 für alle zu öffnen (schlecht für die Sicherheit).

Wir verwenden Putty bereits für den sicheren Befehlszeilenzugriff auf unseren Server und hatten keine Ahnung, dass wir einen solchen Tunnel einrichten könnten. Grundsätzlich können wir unsere vorhandene sichere SSH-Verbindung verwenden, um MySQL Workbench mit unserem Server zu verbinden. Vielen Dank ! ! !

EO3
quelle
1
Willkommen bei Server Fault! Diese Seite ist eine Q & A-Seite, kein Forum. Ihr Beitrag beantwortet die ursprüngliche Frage des OP nicht wirklich. Weitere Informationen finden Sie in den FAQ .
Slm