Me he metido en una situación muy específica y, aunque hay otras formas de hacerlo, estoy un poco obsesionado con esto y me gustaría encontrar una manera de hacerlo exactamente así:
Antecedentes
Digamos que tengo un servidor que ejecuta varios servicios escondidos en contenedores acoplados aislados. Como la mayoría de esos servicios son http, estoy usando un proxy nginx para exponer subdominios específicos a cada servicio. Por ejemplo, un servidor de nodo se está ejecutando en un contenedor acoplable con su puerto 80
vinculado al 127.0.0.1:8000
host. Voy a crear un host virtual en nginx que los proxies todas las solicitudes de myapp.mydomain.com
a http://127.0.0.1:8000
. De esa manera, no se puede acceder al contenedor de Docker desde afuera, excepto a través de myapp.mydomain.com
.
Ahora quiero iniciar un contenedor de gogs docker de tal manera que gogs.mydomain.com
apunte al contenedor de gogs. Así que comienzo este contenedor de gogs con el puerto 8000
vinculado al 127.0.0.1:8001
host. Y un sitio nginx que envía solicitudes gogs.mydomain.com
a http://127.0.0.1:8001
y funciona bien ...
Sin embargo, como gogs es un contenedor de git, también me gustaría acceder a los repositorios, [email protected]:org/repo
pero eso no funciona con la configuración actual. Una forma de hacer que eso funcione sería vincular el puerto 22
del contenedor al puerto 0.0.0.0:8022
en el host, y luego la URL de git ssh puede ser algo así [email protected]:8022/repo
.
(Eso no parece funcionar; cuando llego a un origen con uri como esa, git exige la contraseña para el usuario git
en gogs.mydomain.com
lugar de) gogs.mydomain.com:8022
, pero eso es probablemente algo que estoy haciendo mal y fuera del alcance de esta pregunta, sin embargo, Agradecería cualquier diagnóstico para eso también)
Problema
Mi principal preocupación es que quiero que el puerto ssh <gogs container>:22
sea proxy al igual que proxys puertos http usando nginx; es decir, cualquier conexión ssh para gogs.mydomain.com
pasar al puerto del contenedor 22
. Ahora no puedo vincular el puerto ssh del contenedor al puerto ssh del host porque ya hay un sshd ejecutándose en el host. Además, eso significaría que cualquier conexión *.mydomain.com
se pasará al sshd del contenedor.
Quiero cualquier conexión ssh a:
mydomain.com
host.mydomain.com
o la dirección IP de mydomain para ser aceptada y reenviada al sshd en el hostgogs.mydomain.com
ogit.mydomain.com
ser aceptado y transmitido al sshd en el contenedor de gogs*.mydomain.com
(donde*
hay algo más que las posibilidades anteriores) para ser rechazado
Si fuera http, fácilmente podría hacer que eso funcione a través de nginx. ¿Hay alguna manera de hacer eso para ssh?
(También me gustaría ponerme nervioso y preguntar: ¿hay alguna manera de lograrlo con algún servicio de TCP en general?)
Cualquier idea sobre la forma en que estoy tratando de hacerlo aquí también es bienvenida. No me importa que me digan cuando lo que intento hacer es completamente estúpido.
Lo que ya tengo en mi mente:
¿Tal vez podría compartir el socket sshd en el host con el contenedor como un ro
volumen? Eso significaría que el sshd dentro del contenedor podría recoger todas las conexiones *.mydomain.com
. ¿Podría haber una manera de hacer que el sshd dentro del contenedor rechace todas las conexiones que no sean gogs.mydomain.com
o git.mydomain.com
? Sin embargo, el sshd en el host recogerá todas las conexiones de *.mydomain.com
todos modos, incluyendo gogs.mydomain.com
; entonces habría un conflicto. No sé, en realidad no lo he probado. ¿Debería intentarlo?
fuente