Configurer le pare-feu de l'hôte

Par défaut, le pare-feu de l'hôte de Container-Optimized OS n'autorise que les connexions sortantes et n'accepte les connexions entrantes qu'à travers le service SSH. Vous pouvez voir la configuration exacte du pare-feu de l'hôte en exécutant sudo iptables -L sur une instance de VM exécutant Container-Optimized OS.

Gardez à l'esprit que le pare-feu de l'hôte est différent des règles de pare-feu du cloud privé virtuel, qui doivent également être configurées pour que vos applications fonctionnent correctement. Consultez la page Présentation des règles de pare-feu pour plus d'informations sur les règles de pare-feu du cloud privé virtuel.

Exécuter des conteneurs dans l'espace de noms réseau par défaut de Docker

Si vous déployez un conteneur dans Container-Optimized OS qui doit être accessible sur le réseau et que vous n'utilisez pas l'option --net=host de Docker, exécutez votre conteneur avec l'option -p de Docker. Avec cette option, Docker configure automatiquement le pare-feu de l'hôte pour exposer votre application sur le réseau. Consultez la documentation de référence sur l'exécution de Docker pour en savoir plus sur les options d'exécution de Docker.

Dans l'exemple suivant, le conteneur nginx sera accessible sur le réseau sur le port 80 :

docker run --rm -d -p 80:80 --name=nginx nginx

Exécuter des conteneurs dans l'espace de noms réseau de l'hôte

Si vous déployez un conteneur dans Container-Optimized OS qui doit être accessible sur le réseau et que vous utilisez l'option --net=host de Docker, vous devez configurer explicitement le pare-feu de l'hôte vous-même.

Vous pouvez configurer le pare-feu de l'hôte avec les commandes iptables standards. Comme avec la plupart des distributions GNU/Linux, les règles de pare-feu configurées avec les commandes iptables ne persistent pas lors des redémarrages. Pour vous assurer que le pare-feu de l'hôte est correctement configuré à chaque démarrage, configurez le pare-feu de l'hôte dans votre configuration cloud-init. Prenons l'exemple cloud-init suivant :

#cloud-config

write_files:
- path: /etc/systemd/system/config-firewall.service
  permissions: 0644
  owner: root
  content: |
    [Unit]
    Description=Configures the host firewall

    [Service]
    Type=oneshot
    RemainAfterExit=true
    ExecStart=/sbin/iptables -A INPUT -p tcp --dport 80 -j ACCEPT
- path: /etc/systemd/system/myhttp.service
  permissions: 0644
  owner: root
  content: |
    [Unit]
    Description=My HTTP service
    After=docker.service config-firewall.service
    Wants=docker.service config-firewall.service

    [Service]
    Restart=always
    ExecStart=/usr/bin/docker run --rm --name=%n --net=host nginx
    ExecStop=-/usr/bin/docker exec %n -s quit

runcmd:
- systemctl daemon-reload
- systemctl start myhttp.service

Si vous utilisez cette configuration cloud-init avec une VM exécutant Container-Optimized OS, les comportements suivants seront appliqués à chaque démarrage :

  • Le pare-feu de l'hôte est configuré pour autoriser les connexions TCP entrantes sur le port 80.
  • Un conteneur nginx écoute le port 80 et répond aux requêtes HTTP entrantes.

Pour en savoir plus sur l'utilisation de cloud-init dans Container-Optimized OS, consultez la page Créer et configurer des instances.