Alexandre CANTIN - Blog personnel

01 avr. 2020

Fermer l'accès de vos containers Docker vers l'extérieur

L’utilisation d’un reverse proxy grâce à son système de cache, permet d’améliorer de manière importante les performances de notre site. Nginx est le plus connu et plus utilisé reverse proxy dans l’univers du Web.

Dans le cas où Nginx et notre serveur se trouve sur une même machine, l’architecture classique de faire écouter notre serveur sur un port particulier (par exemple 3000) et Nginx sur le port 80 et 443 (respectivement pour http et https).

Plus concrètement, au niveau de notre configuration de serveur Nginx, nous écrivons (note: seul le HTTP est géré dans cet exemple)

    upstream my_server {
      server localhost:3000;
    }

    server {
      listen 80;
      listen [::]80; # ipv6
      server_name my-domaine.org;

      location / {
        proxy_pass http://my_server;
      }
    }

Pour plus de facilité en terme de déploiement et de sécurité, notre serveur est à l’intérieur d’un container Docker dans lequel nous ouvrons vers l’extérieur uniquement les ports que nous voulons.

Pour cela, nous utilisons l’argument -p 3000:3000 de docker; ou encore, dans le cas de docker-compose :

    ports:
      - "3000:3000"

Toutefois, procédez ainsi pose un problème majeur. En effet, notre site devient bien disponible sur http(s)://my-domaine.org/ mais aussi sur http(s)://my-domaine.org:3000; ce qui n’est pas souhaitable.

Alors comment rendre notre serveur disponible en interne seulement et pas vers l’extérieur ? Supprimer l’argument aura pour effet de rendre le rendre accessible de nul part… Toutefois, il existe une option de l’argument -p pour limiter le port à certaines IP !

L’argument respecte le format suivant IP:HOST_PORT:CONTAINER_PORT et ainsi en transformant -p 3000:3000 en -p 127.0.0.1:3000:3000, nous limitons l’accès à notre serveur qu’à notre machine uniquement.