BEARBEITEN: Wenn Sie Windows verwenden, müssen Sie bei den folgenden Anweisungen zwei Dinge beachten:
1) Wechseln Sie localhost
zu, 127.0.0.1
da 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 ssh
Befehl. Wenn Sie also ssh
in 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 -N
bedeutet 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 11145
ist 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 3333
ist beliebig; Sie können jede freie Portnummer auswählen, die Ihr Client hat.
ssh
in den obigen Beispielenplink
diese ersetzen , sollte alles funktionieren.Verwenden
-s 192.168.100.0/24
bedeutet, 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 -vnL
fü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:
Wenn Sie Ihre externe IP-Adresse einschließen möchten, muss dies die Ziel-IP sein, z.
-s
wird 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.cnf
und überprüfen Sie diebind-address
Anweisung und ändern Sie sie in: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.
quelle
-s 192.168.100.0/24
vollständig zu entfernen , verlassen Sie einfach:iptables -A INPUT -i eth0 -p tcp --dport 3306 -m state --state NEW,ESTABLISHED -j ACCEPT
ssh [email protected] -L 3305:localhost:3306
und dann in einem anderen Terminal auf dem Client:mysql -h 127.0.0.1 -P 3305 -u username -p
und 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!Durch den
-A
Wechsel 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-I
Schalter, um die Regel am Anfang der Kette einzufügen.Wenn das nicht funktioniert, zeigen Sie uns bitte die Ausgabe
iptables -L -v -n
als Bearbeitung Ihrer Frage.quelle
telnet yourserver.tld 3306
sehen, was es sagt.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 LISTEN
Sie 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.
quelle
netstat
Befehl überprüft, ob er ebenfalls zuhört.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
Ö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!
quelle
%SystemRoot%\system32\drivers\etc\hosts
auf 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.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 ! ! !
quelle