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.sock
tunelizar 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
socat
en 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 -N
No 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
-f
no 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
-f
opció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 $pid
en 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 quesocat
puede ejecutarse hasta 5 segundos después de sshNota: En realidad probado usando cargador de muelle, puerto
2375
,/var/run/docker.sock
y la variable de entornoDOCKER_HOST='tcp://localhost:2375'
, pero debería funcionar para todos el mismo MySQLActualizar
Usando los controles SSH , puede usar la
-f
bandera a mi manera, solo agregue las siguientes banderasY obtendrás
Ahora puede terminar todas las sesiones controladas usando
Las
-o
opciones se pueden guardar en su.ssh/config
archivo, o puede usar -S en su lugar (pero aún lo necesitará-o ControlMaster
)fuente
docker run ... connect.sh
para configurar el túnel seguido dedocker run ... deploy.sh
. Lo intenténohup
,&
ydisown
parece que se rompensocat
al cerrarstdout
y 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)?-f
y& 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.exec
unrun
contenedor que ya estaba y la tubería SSH no persistía después deexec
finalizar. 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
fork
poder 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 labind
opción, no como una dirección antes del puerto.Después de esto, simplemente conéctese
localhost:9999
normalmente 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 poruser
ogroup
que necesita escribir, entonces es escribible. No hay absolutamente ninguna necesidad de dar a todos permisos de escritura, y olvidarlo dechmod
nuevo 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!