Transférer les connexions SSH au conteneur Docker par nom d'hôte

10

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 80lié à 127.0.0.1:8000l'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.compointe vers le conteneur gogs. Je démarre donc ce conteneur gogs avec le port 8000lié à 127.0.0.1:8001l'hôte. Et un site nginx procurant des requêtes gogs.mydomain.comà http://127.0.0.1:8001et cela fonctionne bien ...

Cependant, les gogs étant un conteneur git, je voudrais également accéder aux dépôts comme via, [email protected]:org/repomais cela ne fonctionne pas avec la configuration actuelle. Une façon de faire ce travail serait de lier le port 22du conteneur au port 0.0.0.0:8022de 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 gitsur 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>:22soit mandaté comme je procède à la procuration des ports http à l'aide de nginx; c'est-à-dire toutes les connexions ssh à gogs.mydomain.comtransmettre 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.compasser 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ôte
  • gogs.mydomain.comou git.mydomain.compour ê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 rovolume? 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.comou git.mydomain.com? Cependant, le sshd sur l'hôte récupérera toutes les connexions de *.mydomain.comtoute 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?

Zia Ur Rehman
la source

Réponses:

2

Faire cela "par nom d'hôte" n'est tout simplement pas dans le champ d'application de ssh. Le protocole ssh lui-même ne prend pas en charge l'hébergement virtuel basé sur le nom (en fait, HTTP est l'exception de la règle ici).

Le SSHd du côté récepteur ne peut jamais savoir à quel nom d'hôte vous avez demandé à votre client de se connecter car ces informations ne sont pas transmises dans le protocole.

Si vous avez juste besoin de quelques clients pour travailler avec cela, vous pouvez configurer chaque client pour qu'il se connecte à votre serveur, puis passer au conteneur Docker comme suit:

Host yourcontainer
        Hostname internal.ip.of.your.container
        ProxyCommand ssh your.docker.host nc %h %p

De cette façon, ssh invoquera la commande proxy qui ouvrira une session ssh à votre hôte et appellera netcatpour établir une connexion avec votre conteneur. De cette façon, vous n'avez pas vraiment besoin d'exposer le port ssh de vos conteneurs au monde extérieur.

Andreas Rogge
la source
0

Les versions récentes d'OpenSSH ont la directive ProxyJump et l'indicateur -J:

ssh -J proxyuser@jumphost user@target
ptman
la source