Frage Leiten Sie den lokalen Port oder die Socket-Datei an die Remote-Socket-Datei weiter


Schnelle Frage - Ich betreibe zwei Linux-Boxen, einen meinen eigenen Desktop und den anderen meinen VPS. Aus Sicherheitsgründen am Ende des VPS entschied ich mich für Socket-Verbindungen zu MySQL (/var/run/mysqld/mysql.sock). Ich weiß, ich kann so tunneln: ssh -L 3307:127.0.0.1:3306 user@site.com Wenn ich den Remote-SQL-Server so eingerichtet habe, dass er auf einen Port hört, aber was ich wissen möchte, kann ich Folgendes tun: ssh -L /path/to/myremotesqlserver.sock:/var/run/mysqld/mysql.sock dabei zwei Sockets tunneln, im Gegensatz zu zwei Ports?

Eine vollkommen akzeptable Lösung wäre auch, einen lokalen Port an die Remote-Socket-Datei weiterzuleiten, aber wenn möglich, versuche ich nicht, TCP-Server auf der Remote-Box laufen zu lassen.

(Und ja, ich weiß, TCP wäre einfacher).


23
2018-03-30 17:51


Ursprung


Wenn der Grund, warum Sie TCP nicht in der mySQL-Box verwenden möchten, aus Sicherheitsbedenken (zB Remote-Angriffe, etc.) besteht, können Sie diese Firewall natürlich auch schützen, und wenn das nicht gut genug ist, lassen Sie mySQL nur 127.0.0.1 hören für seine TCP-Verbindungen, dann können Sie leicht durch SSH tunneln. Wenn nicht, unterstütze ich die Socat-Lösung unten. - Mattias Ahnberg
lwn.net/Articles/609321 OpenSSH 6.7 wird Socket-Forwarding bringen - Hubbitus
@Hubbitus ist diese Funktion jetzt verfügbar, wenn ja, können Sie eine Beispielantwort liefern? - CMCDragonkai
Dieser Kommentar war in Antwortform, wurde aber von jemandem in Kommentar umgewandelt. Und ich sehe jetzt, dass Sie bereits Antwort unten vorschlagen. - Hubbitus


Antworten:


Bei Bedarf einen lokalen Socket weiterleiten

  • Konfigurieren Sie die Authentifizierung mit dem SSH-Public-Key
  • Installieren socat An beiden Enden
  • Erstellen Sie lokal ein Verzeichnis für Ihre Sockets, auf das andere Benutzer nicht zugreifen können.
export SOCKET_DIR=~/.remote-sockets
mkdir -p $SOCKET_DIR
socat "UNIX-LISTEN:$SOCKET_DIR/mysqld.sock,reuseaddr,fork" \
EXEC:'ssh user@server socat STDIO UNIX-CONNECT\:/var/run/mysqld/mysqld.sock'

dann

mysql -S $SOCKET_DIR/mysqld.sock -u mysqluser -p

gestohlen von Weiterleitung von Unix-Domain Sockets mit SSH und Socat


33
2018-02-22 23:07



Das ist großartig und sollte die akzeptierte Antwort sein. - John Smith Optional


Zu der Zeit, als die Frage gestellt wurde, war es wirklich unmöglich, aber es ist heutzutage möglich.

Sie können beides: UNIX => TCP und UNIX => UNIX-Weiterleitung.

Zum Beispiel:

ssh \
  -R/var/run/mysql.sock:/var/run/mysql.sock \
  -R127.0.0.1:3306:/var/run/mysql.sock \
  somehost

Dies ist seit OpenSSH 6.7 möglich.


22
2018-02-03 14:08



Ich habe es geschafft, meinen lokalen Socket auf den Remote-Server-Socket weiterzuleiten und den Docker-Client remote auszuführen (es könnte direkt von ssh ausgeführt werden, aber wo ist der Spaß daran :) ssh -L /home/user/docker.sock:/var/run/docker.sock dockerhost -N - sdkks


Ich habe das nicht getan, aber ich würde es versuchen Socat. vielleicht etwas wie:

ssh xxx@yyy.zzz -L 9999:localhost:9999 "socat TCP-LISTEN:localhost:9999 UNIX-CONNECT:/var/run/mysqld/mysql.sock"
socat UNIX-LISTEN:/path/to/local/socket TCP:localhost:9999

Ich habe noch nie so etwas getan.


10
2018-03-30 20:11



Ich werde es versuchen und Sie wissen lassen, wie es geht. Ich habe die tcp-basierte Implementierung verwendet.
Ich kann es im Moment nicht zur Arbeit bringen, aber +1 für die Idee, ich mag es. Ich werde dich wissen lassen, wenn ich es behebe.
+1 sieht wie ein nützliches Dienstprogramm aus. - Warner


Seit ssh 6.7 ist kein Socat mehr nötig. Sie können Unix-Domain-Sockets direkt weiterleiten:

ssh -nNT -L $(pwd)/docker.sock:/var/run/docker.sock user@someremote

Mehr Info: https://medium.com/@dperny/forwarding-the-docker-socket-over-ssh-e6567cfab160


4
2017-07-17 06:08



Ich fand auch das nützlich für die Verbindung zu einem lokalen Socket als ein anderer Benutzer. Dadurch kann ich Client-Programme gegen einen Serverprozess ausführen, der bestimmte Benutzer-IDs (Verbindungen, die von seinen eigenen Job-Läufern kommen) trennt. - Warbo
Weiterleiten eines Sockets an denselben Computer, aber anderes Verzeichnis, das von einem anderen Benutzer gesteuert wird, mit sshd, um den Zugriff zu authentifizieren? Was ist dein Anwendungsfall? - CMCDragonkai
Verzeichnisberechtigungen / Zugriff sind kein Problem. Lieber, ein bestimmter Daemon löscht alle Verbindungsversuche, die von Benutzern in einer bestimmten Gruppe unternommen wurden (um zu verhindern, dass Neulinge verwirrt werden). Wenn Sie ssh verwenden, können diese Benutzer (über den getunnelten Socket) eine Verbindung herstellen, als ob sie ein Benutzer wären, der nicht zu dieser Gruppe gehört, und daher nicht getrennt werden. - Warbo
Interessant, witzig wie du den Nix-Daemon meinst, ich beschäftige mich auch damit. Ich frage mich, warum Nix-Daemon Verbindungen zu Benutzern in einer bestimmten Gruppe löscht? Ist das eine Sicherheitskonfiguration Sache? Oder bezogen auf: nixos.org/nix/manual/#idm140737318362784? - CMCDragonkai
Gemäß die Commit-Nachricht es soll "versehentliche" Benutzung verhindern. Ich habe es angesprochen Hier - Warbo


Ich arbeite an Javiers Antwort und das funktioniert für mich:

ssh -f xxx@yyy.zzz -L 9999:localhost:9999 "socat TCP-LISTEN:9999,fork,bind=localhost UNIX-CONNECT:/var/run/mysqld/mysql.sock"

Du brauchst fork um mehrere Male verbinden zu können, ohne dass Socat abstürzt, sobald Sie die erste Verbindung geschlossen haben. Die Art und Weise, in der soat eine Adresse angibt, an die gebunden werden soll, erfolgt über bind Option, nicht als Adresse vor dem Port.

Danach verbinden Sie sich einfach mit localhost:9999 normalerweise wie du würdest. Dann den Tunnel abreißen:

ssh -f xxx@yyy.zzz "killall socat"

(oder etwas Ähnliches, Sie können kompliziertere Dinge tun, die das Halten von Socat's PID beinhalten)


1
2018-06-03 19:16





Ja, du kannst socat verwenden.

Zuerst mache den TCP-Tunnel mit SSH. Dann benutze socat wie folgt:

socat unix-listen: /var/run/mysqld/mysqld.sock,fork,unlink-early tcp: 127.0.0.1: 3306

Erteilen Sie dann Berechtigungen für neu erstellte Sockets (chmod 777 kann sein)


1
2017-09-16 13:52



Dies ist seit OpenSSH 6.6 möglich. - ysdx
chmod 777: Nein nein Nein Nein Nein! Lauf niemals chmod 777. Es ist praktisch nie erforderlich! Nicht einmal für "Testzwecke". Wenn die Datei lesbar ist, ist sie lesbar. Wenn es schreibbar ist user oder group das muss geschrieben werden, dann ist es beschreibbar. Es gibt absolut keine Notwendigkeit, jedem Schreibrechte zu geben und zu vergessen chmod es ist wieder etwas Gesundes, genau wie multinationale Konzerne gehackt werden. Tu es einfach nicht. Je. Ich hab geschrieben eine Einführung von Unix-Berechtigungen. Bitte lies es! - Martin Tournoij


Eine weitere Modifikation von @ mpontes / @ Javier's Antwort darauf

ssh user@remoteserver -L 9999:localhost:9999 'socat TCP-LISTEN:9999,fork,bind=localhost UNIX-CONNECT:/var/run/mysqld/mysql.sock& pid=$!; trap "kill $pid" 0; while echo -ne " \b"; do sleep 5; done'

Reiniger

ssh user@remoteserver -L 9999:localhost:9999 '
  socat TCP-LISTEN:9999,fork,bind=localhost UNIX-CONNECT:/var/run/mysqld/mysql.sock&
  pid=$!
  trap "kill $pid" 0
  while echo -ne " \b"; do
    sleep 5
  done
'

PROS

  1. Funktioniert mit openssh früher als 6.7 (wie CentOS 7)
  2. Tötet Socat auf SSH-Terminierung, anstatt erneut auf den Remote-Server zugreifen zu müssen
  3. Erlaubt nicht-öffentlichen SSH-Login (im Gegensatz zu ijk-Lösung)

Merkmal

  1. Seit der -f Option wird nicht verwendet, Sie können entweder einen öffentlichen Schlüssel verwenden und im Hintergrund über ausführen & oder Sie könnten sich interaktiv anmelden und Strg + Z verwenden und dasselbe verwenden $! um die PID zu speichern.

CONS

  1. Kann nicht leicht das verwenden -f SSH-Option, da Sie die PID von SSH auf diese Weise verlieren. Diese Methode beruht auf dem Ausführen im Vordergrund und Strg + C, um zu beenden.
  2. Viel komplizierter

Erläuterung

  • socat ...& - Führen Sie Socat im Hintergrund auf dem Remote-Server
  • pid=$! - Speichern Sie die PID
  • trap kill\ $pid 0 - Lauf kill $pid auf Bash Kündigung
  • while :; sleep... - in einer Endlosschleife sitzen
  • echo -ne \ \b - Echo Leerzeichen gefolgt von der Rücktaste. Dies schlägt fehl, sobald der ssh getrennt ist. Mit einer sleep 5, das bedeutet, dass socat kann bis zu 5 Sekunden nach ssh laufen

Hinweis: Wirklich getestet mit Docker, Port 2375, /var/run/docker.sockund Umgebungsvariable DOCKER_HOST='tcp://localhost:2375', sollte aber für mysql funktionieren

Aktualisieren

Verwenden SSH-Kontrollen, du kannst den ... benutzen -f flag benutze meinen Weg, füge einfach die folgenden Flaggen hinzu

-f -o ControlPath=~/.ssh/%C -o ControlMaster=auto

Und du wirst es bekommen

ssh -f -o ControlPath=~/.ssh/%C -o ControlMaster=auto user@remoteserver -L 9999:localhost:9999 'set -m; socat TCP-LISTEN:9999,fork,bind=localhost UNIX-CONNECT:/var/run/mysqld/mysql.sock& pid=$!; trap "kill $pid" 0; while echo -ne " \b"; do sleep 5; done'

Jetzt können Sie alle kontrollierten Sitzungen mit beenden

ssh -o ControlPath=~/.ssh/%C -O exit remoteserver

Das -o Optionen können in Ihrem gespeichert werden .ssh/config Datei, oder Sie können stattdessen -S verwenden (aber Sie werden immer noch brauchen -o ControlMaster)


1
2017-08-28 20:18