Pregunta rápida: ejecuto dos cajas de Linux, una en mi propio escritorio y otra en mi VPS. Por razones de seguridad en el extremo de VPS, opté por conexiones de socket a MySQL ( /var/run/mysqld/mysql.sock). Sé que puedo hacer un túnel de esta manera: ssh -L 3307:127.0.0.1:3306 [email protected]si configuro el servidor SQL remoto para escuchar en algún puerto, pero lo que quiero saber es ¿puedo hacer algo como: ssh -L /path/to/myremotesqlserver.sock:/var/run/mysqld/mysql.socktunelizar dos sockets, en lugar de dos puertos?
Una solución perfectamente aceptable también sería reenviar un puerto local al archivo de socket remoto, pero donde sea posible, estoy tratando de no tener servidores tcp ejecutándose en la caja remota.
(y sí, sé que tcp sería más fácil).

Respuestas:
Reenviar un socket local a pedido
socaten ambos extremosluego
robado de reenviar sockets de dominio unix con ssh y socat
fuente
Aunque en el momento, cuando se hizo la pregunta, era realmente imposible, pero es posible hoy en día.
Puede tanto para: UNIX => TCP y UNIX => reenvío de UNIX.
Por ejemplo:
Es posible desde OpenSSH 6.7.
fuente
ssh -L /home/user/docker.sock:/var/run/docker.sock dockerhost -NNo he hecho esto, pero lo intentaría con Socat . tal vez algo como:
De nuevo, nunca he hecho algo así.
fuente
No se necesita más socat desde ssh 6.7. Puede reenviar sockets de dominio Unix directamente como:
Más información: https://medium.com/@dperny/forwarding-the-docker-socket-over-ssh-e6567cfab160
fuente
Otra modificación de la respuesta de @mpontes '/ @ javier que
Limpiador
PROS
Característica
-fno se usa la opción, puede usar una clave pública y ejecutarla en segundo plano a través de&o puede iniciar sesión de forma interactiva y usar Ctrl + Z y usar la misma$!para almacenar el pid.CONTRAS
-fopción ssh, ya que perderá el pid de ssh de esa manera. Este método se basa en ejecutarse en primer plano y Ctrl + C para matar.Explicación
socat ...&- ejecutar socat en segundo plano en el servidor remotopid=$!- almacenar el pidtrap kill\ $pid 0- ejecutarkill $piden terminación bashwhile :; sleep...- sentarse en un bucle infinitoecho -ne \ \b- Espacio de eco seguido de retroceso. Esto falla tan pronto como se desconecta el ssh. Con unsleep 5, esto significa quesocatpuede ejecutarse hasta 5 segundos después de sshNota: En realidad probado usando cargador de muelle, puerto
2375,/var/run/docker.socky la variable de entornoDOCKER_HOST='tcp://localhost:2375', pero debería funcionar para todos el mismo MySQLActualizar
Usando los controles SSH , puede usar la
-fbandera a mi manera, solo agregue las siguientes banderasY obtendrás
Ahora puede terminar todas las sesiones controladas usando
Las
-oopciones se pueden guardar en su.ssh/configarchivo, o puede usar -S en su lugar (pero aún lo necesitará-o ControlMaster)fuente
docker run ... connect.shpara configurar el túnel seguido dedocker run ... deploy.sh. Lo intenténohup,&ydisownparece que se rompensocatal cerrarstdouty activar elkill. ¿Alguna idea de ajustes para respaldar este caso (es decir, todavía está cerca cuando SSH lo hace pero sobrevive a un rechazo)?-fy& disown) en una terminal. Aparentemente, el problema es creado por el script "wrapper". Agradecería la entrada, pero ahora estoy mirando preguntas y respuestas más apropiadas.docker run ... connect.sh, ydocker exec {container name/id} deploy.sh, para que jueguen juntos.execunruncontenedor que ya estaba y la tubería SSH no persistía después deexecfinalizar. Aclaré que se debía a una peculiaridad con la forma en que se ejecutan los scripts. Si moví la llamada a su propio script y llaménohup <script.sh> & disown, sobrevivirá a la finalización deexec.Desarrollando la respuesta de Javier, esto funciona para mí:
ssh -f [email protected] -L 9999:localhost:9999 "socat TCP-LISTEN:9999,fork,bind=localhost UNIX-CONNECT:/var/run/mysqld/mysql.sock"Necesita
forkpoder conectarse varias veces sin morir socat una vez que cierra la primera conexión. Además, la forma en que socat le permite especificar una dirección a la que vincularse es a través de labindopción, no como una dirección antes del puerto.Después de esto, simplemente conéctese
localhost:9999normalmente como lo haría. Luego para derribar el túnel:ssh -f [email protected] "killall socat"(o algo similar, puede hacer cosas más elaboradas que implican mantener el PID de socat)
fuente
Sí, puedes usar socat.
Primero haga el túnel TCP con SSH. Luego usa socat así:
socat unix-listen: /var/run/mysqld/mysqld.sock,fork,unlink-early tcp: 127.0.0.1: 3306
Luego otorgue permisos al nuevo socket creado (chmod 777 puede ser)
fuente
chmod 777: ¡no no no no no! Nunca corraschmod 777. ¡Prácticamente nunca se requiere! Ni siquiera para "fines de prueba". Si el archivo es legible, entonces es legible. Si es escribible poruserogroupque necesita escribir, entonces es escribible. No hay absolutamente ninguna necesidad de dar a todos permisos de escritura, y olvidarlo dechmodnuevo a algo cuerdo es exactamente cómo las multinacionales son pirateadas. Solo no lo hagas. Siempre. Escribí una introducción a los permisos de Unix . ¡Por favor leelo!