Kurze Frage - Ich verwende zwei Linux-Boxen, eine auf meinem eigenen Desktop und die andere auf meinem VPS. Aus Sicherheitsgründen habe ich mich auf der VPS-Seite für Socket-Verbindungen zu MySQL ( /var/run/mysqld/mysql.sock
) entschieden. Ich weiß, dass ich so tunneln kann: ssh -L 3307:127.0.0.1:3306 [email protected]
Wenn ich den Remote-SQL-Server so einrichte, dass er auf einen Port lauscht, möchte ich aber wissen, ob ich ssh -L /path/to/myremotesqlserver.sock:/var/run/mysqld/mysql.sock
damit zwei Sockets tunneln kann und nicht zwei Ports?
Eine durchaus akzeptable Lösung wäre auch, einen lokalen Port an die Remote-Socket-Datei weiterzuleiten, aber wo möglich versuche ich, keine TCP-Server auf der Remote-Box laufen zu lassen.
(und ja, ich weiß, tcp wäre einfacher).
Antworten:
Leiten Sie eine lokale Steckdose auf Anfrage weiter
socat
An beiden Enden installierendann
gestohlen von der Weiterleitung von Unix-Domain-Sockets mit ssh und socat
quelle
Zu der Zeit, als die Frage gestellt wurde, war es wirklich unmöglich, aber heutzutage ist es möglich.
Sie können sowohl UNIX => TCP als auch UNIX => UNIX weiterleiten.
Beispielsweise:
Es ist seit OpenSSH 6.7 möglich.
quelle
ssh -L /home/user/docker.sock:/var/run/docker.sock dockerhost -N
Ich habe das nicht getan, aber ich würde es mit socat versuchen . vielleicht so etwas wie:
wieder habe ich so etwas noch nie gemacht.
quelle
Seit ssh 6.7 wird kein socat mehr benötigt. Sie können Unix-Domain-Sockets wie folgt direkt weiterleiten:
Weitere Informationen: https://medium.com/@dperny/forwarding-the-docker-socket-over-ssh-e6567cfab160
quelle
Eine weitere Modifikation von @mpontes / @ Javiers Antwort darauf
Reiniger
PROS
Feature
-f
Option nicht verwendet wird, können Sie entweder einen öffentlichen Schlüssel verwenden und über im Hintergrund ausführen&
oder sich interaktiv anmelden und Strg + Z verwenden und$!
die PID auf dieselbe Weise speichern.CONS
-f
Option ssh kann nicht einfach verwendet werden , da die pid von ssh auf diese Weise verloren geht. Diese Methode basiert auf der Ausführung im Vordergrund und Strg + C zum Beenden.Erläuterung
socat ...&
- Führen Sie socat im Hintergrund auf einem Remote-Server auspid=$!
- Speichern Sie die PIDtrap kill\ $pid 0
- Beikill $pid
Bash-Terminierung ausführenwhile :; sleep...
- in einer Endlosschleife sitzenecho -ne \ \b
- Echo Space gefolgt von Backspace. Dies schlägt fehl, sobald die Verbindung zum ssh getrennt wird. Mit asleep 5
bedeutet dies, dasssocat
bis zu 5 Sekunden nach ssh ausgeführt werden könnenHinweis: Eigentlich getestet mit Docker, Port
2375
,/var/run/docker.sock
und die UmgebungsvariableDOCKER_HOST='tcp://localhost:2375'
, sollte aber für mysql alle die gleiche ArbeitAktualisieren
Wenn Sie SSH-Steuerelemente verwenden , können Sie das
-f
Flag auf meine Weise verwenden. Fügen Sie einfach die folgenden Flags hinzuUnd du wirst bekommen
Jetzt können Sie alle gesteuerten Sitzungen mit beenden
Die
-o
Optionen können in Ihrer.ssh/config
Datei gespeichert werden, oder Sie können stattdessen -S verwenden (Sie benötigen jedoch weiterhin-o ControlMaster
).quelle
docker run ... connect.sh
anrufe, um den Tunnel einzurichten, gefolgt vondocker run ... deploy.sh
. Ich habe versuchtnohup
,&
unddisown
sie scheinen zu brechen,socat
indem sie schließenstdout
und auslösenkill
. Irgendwelche Ideen für Optimierungen, um diesen Fall zu unterstützen (dh immer noch nah dran, wenn SSH eine Verleugnung überlebt)?-f
und& disown
) in einem Terminal. Anscheinend wird das Problem durch das Skript "Wrapper" erstellt. Ich würde mich über eine Eingabe freuen, aber ich suche jetzt nach angemesseneren Fragen und Antworten.docker run ... connect.sh
unddocker exec {container name/id} deploy.sh
, also spielen sie zusammen.exec
einen bereits vorhandenenrun
Container und die SSH-Pipe blieb nach dem Beenden nicht bestehenexec
. Ich habe klargestellt, dass dies auf eine Eigenart bei der Ausführung von Skripten zurückzuführen ist. Wenn ich den Aufruf in ein eigenes Skript verschoben und aufgerufen habenohup <script.sh> & disown
, überlebt er die Fertigstellung vonexec
.Um auf Javiers Antwort einzugehen, funktioniert das für mich:
ssh -f [email protected] -L 9999:localhost:9999 "socat TCP-LISTEN:9999,fork,bind=localhost UNIX-CONNECT:/var/run/mysqld/mysql.sock"
Sie müssen
fork
in der Lage sein, mehrere Male eine Verbindung herzustellen, ohne zu sterben, sobald Sie die erste Verbindung schließen. Außerdem können Sie mit socat über diebind
Option eine Adresse angeben, an die gebunden werden soll , und nicht als Adresse vor dem Port.Verbinden Sie sich danach
localhost:9999
wie gewohnt mit. Dann, um den Tunnel abzureißen:ssh -f [email protected] "killall socat"
(oder etwas Ähnliches, Sie können ausführlichere Dinge tun, bei denen die PID von socat beibehalten wird)
quelle
Ja, Sie können socat verwenden.
Führen Sie zuerst den TCP-Tunnel mit SSH durch. Dann benutze socat wie folgt:
socat unix-listen: /var/run/mysqld/mysqld.sock,fork,unlink-early tcp: 127.0.0.1: 3306
Geben Sie dann die Berechtigungen für den neu erstellten Socket (möglicherweise chmod 777).
quelle
chmod 777
: Nein nein Nein Nein Nein! Niemals rennenchmod 777
. Es ist praktisch nie erforderlich! Nicht einmal zu "Testzwecken". Wenn die Datei lesbar ist, ist sie lesbar. Wenn es von demuser
oder demgroup
, der darauf schreiben muss, beschreibbar ist, dann ist es beschreibbar. Es gibt absolut keine Notwendigkeit, jedem Schreibzugriff zu erteilen, undchmod
es ist genau so, wie multinationale Unternehmen gehackt werden, wenn man es auf etwas Vernünftiges zurücklässt. Tu es einfach nicht. Je. Ich habe eine Einführung in Unix-Berechtigungen geschrieben . Bitte lies es!