Question rapide - je lance deux boîtiers Linux, l'un mon propre bureau et l'autre mon VPS. Pour des raisons de sécurité du côté VPS, j'ai opté pour des connexions socket à MySQL ( /var/run/mysqld/mysql.sock
). Je sais que je peux tunneler comme ceci: ssh -L 3307:127.0.0.1:3306 [email protected]
si je configure le serveur SQL distant pour écouter sur un port, mais ce que je veux savoir, est-ce que je peux faire quelque chose comme: ssh -L /path/to/myremotesqlserver.sock:/var/run/mysqld/mysql.sock
tunneler ainsi deux sockets, par opposition à deux ports?
Une solution parfaitement acceptable serait également de transférer un port local vers le fichier de socket distant, mais dans la mesure du possible, j'essaie de ne pas avoir de serveurs TCP fonctionnant sur le boîtier distant.
(et oui, je sais que tcp serait plus facile).
Réponses:
Transférer une prise locale à la demande
socat
aux deux extrémitéspuis
volé lors du transfert de sockets de domaine Unix avec ssh et socat
la source
A l'époque, quand la question a été posée, c'était vraiment impossible, mais c'est possible de nos jours.
Vous pouvez à la fois: UNIX => TCP et UNIX => transfert UNIX.
Par exemple:
C'est possible depuis OpenSSH 6.7.
la source
ssh -L /home/user/docker.sock:/var/run/docker.sock dockerhost -N
je n'ai pas fait ça, mais j'essaierais avec socat . peut-être quelque chose comme:
encore une fois, je n'ai jamais rien fait de tel.
la source
Plus besoin de socat depuis ssh 6.7. Vous pouvez transférer des sockets de domaine Unix directement comme:
Plus d'informations: https://medium.com/@dperny/forwarding-the-docker-socket-over-ssh-e6567cfab160
la source
Une autre modification de la réponse de @mpontes / @ javier qui
Nettoyeur
AVANTAGES
Fonctionnalité
-f
option n'est pas utilisée, vous pouvez soit utiliser une clé publique et exécuter en arrière-plan via,&
soit vous connecter de manière interactive et utiliser Ctrl + Z et l'utiliser$!
pour stocker le pid.LES INCONVÉNIENTS
-f
option ssh, car vous perdrez le pid de ssh de cette façon. Cette méthode repose sur l'exécution au premier plan et sur Ctrl + C pour tuer.Explication
socat ...&
- exécuter socat en arrière-plan sur le serveur distantpid=$!
- stocker le pidtrap kill\ $pid 0
- exécuterkill $pid
sur la terminaison bashwhile :; sleep...
- asseyez-vous dans une boucle infinieecho -ne \ \b
- Espace d'écho suivi d'un retour arrière. Cela échoue dès que le ssh est déconnecté. Avec unsleep 5
, cela signifie quesocat
peut s'exécuter jusqu'à 5 secondes après sshRemarque: En fait , testé à l' aide docker, le port
2375
,/var/run/docker.sock
et variable d'environnementDOCKER_HOST='tcp://localhost:2375'
, mais devrait fonctionner pour mysql tous les mêmesMise à jour
En utilisant les contrôles SSH , vous pouvez utiliser le
-f
drapeau à ma façon, ajoutez simplement les drapeaux suivantsEt vous obtiendrez
Vous pouvez maintenant terminer toutes les sessions contrôlées à l'aide de
Les
-o
options peuvent être enregistrées dans votre.ssh/config
fichier, ou vous pouvez utiliser -S à la place (mais vous en aurez toujours besoin-o ControlMaster
)la source
docker run ... connect.sh
pour configurer le tunnel suivi dedocker run ... deploy.sh
. J'ai essayénohup
,&
et ,disown
mais ils semblent brisersocat
en fermantstdout
et le déclenchement de lakill
. Avez-vous des idées de modifications pour soutenir cette affaire (c'est-à-dire toujours fermée lorsque SSH ne fait que survivre à un reniement)?-f
and& disown
) dans un terminal. Apparemment, le problème est créé par le script "wrapper". J'accueillerais volontiers vos commentaires, mais je recherche des questions et réponses plus appropriées maintenant.docker run ... connect.sh
, etdocker exec {container name/id} deploy.sh
, donc ils jouent ensemble.exec
sur unrun
conteneur déjà et le tuyau SSH ne persistait pas après laexec
fin. J'ai précisé que c'était dû à une bizarrerie avec la façon dont les scripts sont exécutés. Si j'ai déplacé l'appel vers son propre script et que j'ai appelénohup <script.sh> & disown
, il survit à la fin de laexec
.En élaborant la réponse de Javier, cela fonctionne pour moi:
ssh -f [email protected] -L 9999:localhost:9999 "socat TCP-LISTEN:9999,fork,bind=localhost UNIX-CONNECT:/var/run/mysqld/mysql.sock"
Vous avez besoin
fork
pour pouvoir vous connecter plusieurs fois sans mourir après avoir fermé la première connexion. De plus, la façon dont socat vous permet de spécifier une adresse à laquelle se lier se fait via l'bind
option, pas comme une adresse avant le port.Après cela, connectez-vous
localhost:9999
normalement comme vous le feriez. Puis pour démonter le tunnel:ssh -f [email protected] "killall socat"
(ou quelque chose de similaire, vous pouvez faire des choses plus élaborées qui impliquent de conserver le PID de socat)
la source
Oui, vous pouvez utiliser socat.
Faites d'abord le tunnel TCP avec SSH. Utilisez ensuite socat comme ceci:
socat unix-listen: /var/run/mysqld/mysqld.sock,fork,unlink-early tcp: 127.0.0.1: 3306
Donnez ensuite des autorisations à la nouvelle socket créée (chmod 777 peut-être)
la source
chmod 777
: non non Non Non Non! Ne jamais courirchmod 777
. Ce n'est pratiquement jamais nécessaire! Pas même à des "fins de test". Si le fichier est lisible, il est lisible. S'il est accessible en écriture paruser
ougroup
qui doit y écrire, il est accessible en écriture. Il n'y a absolument aucun besoin de donner à tout le monde des autorisations d'écriture, et oublier dechmod
revenir à quelque chose de sain est exactement la façon dont les multinationales sont piratées. Ne le fais pas. Déjà. J'ai écrit une introduction aux autorisations Unix . Lisez-le s'il vous plaît!