web-dev-qa-db-fra.com

accéder au tunnel ssh de l'hôte à partir du conteneur Docker

En utilisant ubuntu tusty, il existe un service fonctionnant sur une machine distante, auquel je peux accéder via la redirection de port via un tunnel ssh à partir de localhost:9999.

J'ai un conteneur docker en cours d'exécution. J'ai besoin d'accéder à ce service distant via le tunnel de l'hôte, depuis le conteneur.

J'ai essayé de créer un tunnel depuis le conteneur vers l'hôte avec -L 9000:Host-ip:9999, puis accéder au service via 127.0.0.1:9000 de l'intérieur du conteneur ne parvient pas à se connecter. Pour vérifier si le mappage de port était activé, j'ai essayé nc -luv -p 9999 # at Host nc -luv -p 9000 # at container

ceci, par. 2 mais il n'y avait pas de communication perçue, même en faisant nc -luv Host-ip -p 9000 au conteneur

J'ai également essayé de mapper les ports via docker run -p 9999:9000, mais cela signale que la liaison a échoué car le port hôte est déjà utilisé (du tunnel hôte à la machine distante, probablement).

Donc mes questions sont

1 - Comment vais-je réaliser la connexion? Dois-je configurer un tunnel ssh vers l'hôte, ou cela peut-il être réalisé avec le mappage du port docker seul?

2 - Comment tester rapidement la connexion? Via bash, de préférence.

Merci.

32
npit

Je pense que vous pouvez le faire en ajoutant --net=Host à votre docker. Mais voyez aussi cette question: Transférer le port d'hôte vers le conteneur Docker

15
Matthew

Utilisation de votre réseau d'hôtes comme réseau pour vos conteneurs via --net=Host ou dans docker-compose via network_mode: Host est une option mais cela a pour effet secondaire indésirable que (a) vous exposez maintenant les ports de conteneur dans votre système hôte et (b) que vous ne pouvez plus vous connecter à ces conteneurs qui ne sont pas mappés à votre réseau hôte.

Dans votre cas, une solution rapide et plus propre serait de rendre votre tunnel ssh "disponible" pour vos conteneurs docker (par exemple en liant ssh au docker0 bridge) au lieu d'exposer vos conteneurs Docker dans votre environnement Host (comme suggéré dans la réponse acceptée).

Configuration du tunnel:

Pour que cela fonctionne, récupérez l'ip de votre docker0 bridge utilise via:

ifconfig

vous verrez quelque chose comme ceci:

docker0   Link encap:Ethernet  HWaddr 03:41:4a:26:b7:31  
          inet addr:172.17.0.1  Bcast:172.17.255.255  Mask:255.255.0.0

Maintenant, vous devez dire à ssh de se lier à cette adresse IP pour écouter le trafic dirigé vers le port 9000 via

ssh -L 172.17.0.1:9000:Host-ip:9999

Sans définir le bind_address, :9000 serait niquement disponible pour l'interface de bouclage de votre hôte et non en soi pour vos conteneurs Docker.

Remarque: vous pouvez également lier votre tunnel à 0.0.0.0, ce qui fera ssh écouter toutes les interfaces.

Configuration de votre application:

Dans votre application conteneurisée, utilisez le même docker0 ip pour se connecter au serveur: 172.17.0.1:9000. Le trafic est désormais acheminé via votre docker0 le pont atteindra également votre tunnel ssh :)

Par exemple, si vous avez une application "DOT.NET Core" qui doit se connecter à une base de données distante située à :9000, votre "ConnectionString" contiendrait "server=172.17.0.1,9000;.

17
B12Toaster