Je suis entré dans une situation très spécifique et bien qu'il existe d'autres façons de le faire, je suis un peu obsédé par cela et j'aimerais trouver un moyen de le faire exactement comme ceci:
Contexte
Disons que j'ai un serveur exécutant plusieurs services dans des conteneurs dockers isolés. Étant donné que la plupart de ces services sont http, j'utilise un proxy nginx pour exposer des sous-domaines spécifiques à chaque service. Par exemple, un serveur de noeud s'exécute sur un conteneur Docker avec son port 80
lié à 127.0.0.1:8000
l'hôte. Je vais créer un vhost dans nginx qui procurera toutes les requêtes myapp.mydomain.com
à http://127.0.0.1:8000
. De cette façon, le conteneur Docker n'est pas accessible de l'extérieur, sauf via myapp.mydomain.com
.
Maintenant, je veux démarrer un conteneur docker gogs de telle manière qu'il gogs.mydomain.com
pointe vers le conteneur gogs. Je démarre donc ce conteneur gogs avec le port 8000
lié à 127.0.0.1:8001
l'hôte. Et un site nginx procurant des requêtes gogs.mydomain.com
à http://127.0.0.1:8001
et cela fonctionne bien ...
Cependant, les gogs étant un conteneur git, je voudrais également accéder aux dépôts comme via, [email protected]:org/repo
mais cela ne fonctionne pas avec la configuration actuelle. Une façon de faire ce travail serait de lier le port 22
du conteneur au port 0.0.0.0:8022
de l'hôte, puis l'url git ssh peut ressembler à quelque chose [email protected]:8022/repo
.
(Cela ne semble pas fonctionner; lorsque je pousse vers une origine avec uri comme ça, git demande le mot de passe pour l'utilisateur git
sur gogs.mydomain.com
- au lieu de gogs.mydomain.com:8022
- mais c'est probablement quelque chose que je fais mal et hors de portée pour cette question, cependant, J'apprécierais tout diagnostic pour cela aussi)
Problème
Ma principale préoccupation est que je souhaite que le port ssh <gogs container>:22
soit mandaté comme je procède à la procuration des ports http à l'aide de nginx; c'est-à-dire toutes les connexions ssh à gogs.mydomain.com
transmettre au port du conteneur 22
. Maintenant, je ne peux pas lier le port ssh du conteneur au port ssh de l'hôte car il y a déjà un sshd en cours d'exécution sur l'hôte. Cela signifierait également que toutes les connexions à *.mydomain.com
passer au sshd du conteneur.
Je veux que toutes les connexions ssh:
mydomain.com
host.mydomain.com
ou l'adresse IP de mon domaine à accepter et à transmettre au sshd sur l'hôtegogs.mydomain.com
ougit.mydomain.com
pour être accepté et transmis au sshd sur le conteneur gogs*.mydomain.com
(où*
est autre chose que les possibilités ci-dessus) à rejeter
Si c'était http, je pourrais facilement faire fonctionner cela via nginx. Existe-t-il un moyen de le faire pour ssh?
(J'aimerais également sortir sur une branche et demander: existe-t-il un moyen d'accomplir cela avec n'importe quel service TCP en général?)
Toutes les informations sur la façon dont j'essaie de le faire ici sont également les bienvenues. Cela ne me dérange pas qu'on me dise quand ce que j'essaie de faire est tout à fait stupide.
Ce que j'ai déjà en tête:
Peut-être que je pourrais partager le socket sshd sur l'hôte avec le conteneur en tant que ro
volume? Cela signifierait que le sshd à l'intérieur du conteneur pourrait prendre toutes les connexions vers *.mydomain.com
. Pourrait-il y avoir un moyen pour que le sshd à l'intérieur du conteneur rejette toutes les connexions autres que gogs.mydomain.com
ou git.mydomain.com
? Cependant, le sshd sur l'hôte récupérera toutes les connexions de *.mydomain.com
toute façon, y compris gogs.mydomain.com
; il y aurait donc un conflit. Je sais pas, je ne l'ai pas essayé. Dois- je l'essayer?
la source