SSH Tunnel

learnLinux

New Member
Hallo,

und zwar möchte ich gerne alles was an den Port 3306 (mysql) geht UND an die IP-Adresse xxx.xxx.xxx.xxx gerichtet ist via SSH-Tunnel an einen zweiten Server weitergeleitet wird.

Wie würde man dies realisieren?

Gruß - learnLinux
 
Eine TCP-Port-Weiterleitung würdest du gar nicht mit SSH, sondern mit rinetd oder Netfilter/iptables umsetzen.

Falls es wirklich so gemeint war, wie du es geschrieben hast, lies die Manpage ssh(1) und richte dein Augenmerk auf die Option '-L' bzw. 'LocalForward' in der Manpage ssh_config(5).
 
Eine TCP-Port-Weiterleitung würdest du gar nicht mit SSH, sondern mit rinetd oder Netfilter/iptables umsetzen.
Bei Iptabels regele ich habe nur die Zugriffe/Weiterleitungen.
Ich möchte aber das die Verbindung "geschützt" übertragen wird, da es sich um vertrauenswürdige Daten handelt.

Falls es wirklich so gemeint war, wie du es geschrieben hast, lies die Manpage ssh(1) und richte dein Augenmerk auf die Option '-L' bzw. 'LocalForward' in der Manpage ssh_config(5).
Es muss nicht unbedingt mit SSH umgesetzt werden. Ich suche eine sinnvolle Lösung. Bei -L leite ich doch dann alles was an 3306 kommt weiter. Ich möchte aber nur Pakete weiterleiten die an als Ziel den Server mit der IP xxx.xxx.xxx.xxx weitergeleitet werden.

Also Zusammengefasst:

MySQL Abfrage an Host localhost Port 3306 --> Weiterleitung an localhost 3306
MySQL Abfrage an Host xxx.xxx.xxx.xxx Port 3306 --> Weiterleitung an xxx.xxx.xxx.xxx 3306 über eine gesicherte Verbindung
 
ah jetzt habe ich gesehen.
Also wenn ich es richtig verstanden habe muss das ganze so aufgebaut werden:

ssh -L 3306:irgendeinname:3306 xxx.xxx.xxx.xxx
So wenn ich jetzt ein mysql connect (Port 3306) an irgendeinname mache wird dieser per SSH an xxx.xxx.xxx.xxx 3306 weitergeleitet wobei der entfernte Port nicht öffentlich zugänglich sein muss sondern nur lokal.

Muss dann bei jeden Aufruf die SSH Verbindung erst aufgebaut werden bzw.
wie ist es mit der Performance, dass auch entfernte MySQL Abfragen schnell ausgeführt werden.
 
Also wenn ich es richtig verstanden habe muss das ganze so aufgebaut werden:
Nicht ganz. Das bekommst du aber nach erneuter Lektüre von ssh(1) und ssh_config(5) auch noch heraus.

Muss dann bei jeden Aufruf die SSH Verbindung erst aufgebaut werden bzw.
Ja bzw. eben einmal aufgebaut und nicht abgebaut. Wäre auch etwas viel Overhead...

wie ist es mit der Performance, dass auch entfernte MySQL Abfragen schnell ausgeführt werden.
Das kommt auf dein System und die Netzwerkverbindung an. Lokal ist der Verbindungs-Overhead selbstverständlich geringer.
 
ssh -L 3306:xxx.xxx.xxx.xxx:3306 entferntermysql
Dann so rum?
Also wenn ich dann einen connect zu entferntermysql 3306 wird dieser an die IP Adresse xxx.xxx.xxx.xxx durch einen gesicherten Tunnel weitergereicht?
Wenn ich das ganze einmal eintrage, dann merkt sich das ssh für zukünftige Abfragen?

So ganz funktioniert dies nicht.
 
Last edited by a moderator:
Nein, Du machst folgendes:
Code:
ssh -N -L 12345:localhost:3306 anderersqlserver
Darauf greifst Du dann mit
Code:
mysql -P 12345 -h 127.0.0.1. ....
zu. Der Port 12345 (oder ein anderer nicht belegter) ist notwendig, da Du ja sagst, dass auf dem Rechner von dem aus Du das startest, bereits ein mysqld läuft.
 
Der Port 12345 (oder ein anderer nicht belegter) ist notwendig, da Du ja sagst, dass auf dem Rechner von dem aus Du das startest, bereits ein mysqld läuft.

Danke aber ich wollte eigentlich ob es möglich ist:
MySQL Abfrage an Host localhost Port 3306 --> Weiterleitung an localhost 3306
MySQL Abfrage an Host xxx.xxx.xxx.xxx Port 3306 --> Weiterleitung an xxx.xxx.xxx.xxx 3306 über eine gesicherte Verbindung
 
Hast Du meinen Vorschlag überhaupt mal ausprobiert und/oder die Dokumentation gelesen?
Damit kannst Du gesichert auf den mysql-Port auf xxx.xxx.xxx.xxx zugreifen.
 
Hast Du meinen Vorschlag überhaupt mal ausprobiert...
ja habe ich aber wie ich schon geschrieben habe möchte ich gerne:

MySQL Abfrage an Host localhost Port 3306 --> Weiterleitung an localhost 3306
MySQL Abfrage an Host xxx.xxx.xxx.xxx Port 3306 --> Weiterleitung an xxx.xxx.xxx.xxx 3306 über eine gesicherte Verbindung
Es muss doch möglich sein, dass ich alle anfragen an xxx.xxx.xxx.xxx Port 3306 über die gesicherte Verbindung abwickle.

Damit kannst Du gesichert auf den mysql-Port auf xxx.xxx.xxx.xxx zugreifen.
Mein Wunsch ist es aber immer den Standartport 3306 zu verwenden.

Ich kann mir nicht vorstellen, dass dies bei Linux nicht möglich ist zu sagen Wenn etwas an Port 3306 und xxx.xxx.xxx.xxx geschickt wird, dann verwende die ssh Verbindung...
 
So, wie Du Dir das vorstellst, geht es aber nicht. Bei einem SSH-Tunnel stellst Du eine Verbindung von Rechner A (lokal) zu Rechner B (entfernt) her. Der Port wird dabei von B nach A weitergeleitet. Dementsprechend musst Du dann auf A auch auf localhost zugreifen, um den Tunnel zu benutzen.
 
Bleiben noch die Möglichkeiten VPN (IPSec, OpenVPN, OpenSSH ab 4.3, ...) oder direkt die in MySQL integrierte SSL-Funktionalität.

Ich wüsste auch nicht, wo das Problem liegen sollte, in den Skripten/Programmen dann eben 127.0.0.1 statt der öffentlichen IP-Adresse des Datenbankservers anzugeben...
 
Bei einem SSH-Tunnel stellst Du eine Verbindung von Rechner A (lokal) zu Rechner B (entfernt) her. Der Port wird dabei von B nach A weitergeleitet. Dementsprechend musst Du dann auf A auch auf localhost zugreifen, um den Tunnel zu benutzen.
OK danke, aber ist es noch möglich zusagen alles was an xxx.xxx.xxx.xxx 3306 gesendet wird auf 127.0.0.1:12345 weitergeleitet wird?
Dann wäre es eine schöne Sache.

Bei
ssh -N -L 12345:localhost:3306 anderersqlserver
wird ja in der Konsole nur solange der Port 12345 verwendet solange man in der Konsole bleibt. Wäre nohup das richtige?
Und legt man doch am besten einen neuen SSH Benutzer für die Verbindung ein, damit man sich nicht per root einloggen muss bzw. das Passwort muss bei nohup ja gleich hintendran, dass man auch beim starten des Rootservers gleich die Verbindung hergestellt wird.


Andere Frage: Ist dies eine sichere und sinnvolle Art um Server zu verbinden?
Welcher Vorteile bieten mir eine VPN Verbindung in diesem Beispiel (ist es sinnvoll alle Server in verschiedenen RZ's gleich mit einer VPN Verbindungen zu verbinden, da man dadurch auf alles zugreifen kann als würden die server nebeneinander an einen Switch stehen.
 
Idealerweise verwendet man zur Authentifizierung einen Schlüssel und hat für den Tunnel einen extra Benutzer angelegt (mit gesperrtem Passwort). In dessen ~/.ssh/authorized_keys steht dann Folgendes:
Code:
no-pty,no-X11-forwarding,no-agent-forwarding,permitopen="127.0.0.1:3306" ssh-dss AAAAB3N[I]....Restvomschlüssel.[/I]
Dann kann man das ganze auch in ein Script packen, das beim Booten automatisch gestartet wird. Das Einzige, was dieser Benutzer über die ssh-Verbindung kann, ist den Tunnel aufzubauen.

Ein VPN hat seine Vor- und Nachteile. Wenn ein Rechner kompromittiert wurde, will man normalerweise nicht, dass von ihm aus noch weitere Rechner übernommen werden können. Daher ist es am besten, wenn nicht noch irgendwelche Firewalls umgangen werden, wie das z.B. bei einem VPN der Fall wäre.
 
Danke LinuxAdmin funktioniert auch soweit ganz gut.

Kann man jetzt noch sagen:

MySQL Abfrage an Host localhost Port 3306 --> Weiterleitung an localhost 3306
MySQL Abfrage an Host xxx.xxx.xxx.xxx Port 3306 --> Weiterleitung an xxx.xxx.xxx.xxx 12345
Dies wäre die Krönung.
 
Back
Top