10 votes

Quelles sont les règles iptables appropriées pour l'hôte Docker ?

J'ai un serveur Ubuntu avec Docker pour servir MySQL et SSH/SFTP et j'ai besoin de tous les ports sauf 3306 et 22 doit être protégé par un pare-feu, une exigence plutôt standard et triviale, non ?

Maintenant, j'ai réussi à trouver un une sorte de solution mais il ne fonctionne pas complètement pour moi comme après l'avoir appliqué, non plus :

  1. Je ne peux accéder à aucun des services mentionnés (par défaut)
  2. Je ne peux pas accéder à l'internet à partir des conteneurs (si je mets iptables: false dans l'interface de Docker daemon.json fichier de configuration)

J'ai essayé un certain nombre d'autres résultats de recherche, mais ils sont pour la plupart si complexes que je ne comprends pas ce qu'ils font ou qu'ils sont lourdement scriptés, ce qui fait de moi, un profane d'iptables, une tâche impossible pour en tirer quelque chose.

La solution proposée semble plutôt simple et facile à comprendre, mais la complexité de la mise en réseau des Dockers la rend beaucoup plus difficile à déboguer.

Quelqu'un peut-il partager ses règles iptables fonctionnelles pour les hôtes Docker ou au moins me guider dans la bonne direction ?

J'utilise docker-compose pour lancer les services et voici mon yaml :

version: '3.7'

services:
  mysql:
    container_name: 'mysql'
    image: mysql:8.0.13
    command: --default-authentication-plugin=mysql_native_password
    user: 1000:1000
    ports:
      - "3306:3306"
    volumes:
      - ./data:/var/lib/mysql
      - ./config/custom.cnf:/etc/mysql/conf.d/custom.cnf
    networks:
      - database
    restart: always

networks:
  database:
    driver: bridge

Edit : Ce que j'ai trouvé, c'est que permettre à Docker de gérer les règles d'iptables est recommandé et moins exigeant, du moins à long terme, et qu'il n'y a pas de problème à laisser Docker ouvrir les ports nécessaires, même si je ne l'ai pas fait de la manière que je préfère, mais cela reste valable. Ce que je veux à ce stade, c'est savoir s'il est possible d'utiliser iptables pour bloquer les ports ouverts par Docker et comment (via mangle prerouting peut-être ?). Avez-vous des suggestions ? Merci beaucoup !

0 votes

Redémarrez-vous le moteur docker après avoir modifié iptables ?

0 votes

@BMitch Absolument. Le truc, c'est que les règles de l'article ci-dessus sont faites pour que les charges de travail Docker n'aient pas besoin d'être redémarrées après avoir apporté des modifications au pare-feu. Vous avez des règles à partager ?

0 votes

Je configure généralement un hôte avec quelques règles restrictives par défaut, puis je lance Docker. La chose la plus importante pour moi est d'ajouter des ports pour le mode essaim. Pour moi, tout fonctionne à partir de là.

9voto

BMitch Points 4794

Je ne peux pas accéder à l'internet depuis l'intérieur des conteneurs (si je mets iptables : false dans le fichier de configuration daemon.json de Docker)

Docker s'appuie sur iptables pour configurer son réseau. Cela inclut des règles NAT pour gérer l'accès vers et depuis le réseau externe, et beaucoup d'autres règles pour configurer l'accès des conteneurs les uns aux autres sur les réseaux de Docker. Par défaut, cet accès est ouvert, mais il existe des options lors de la création de réseaux pour restreindre l'accès extérieur et la communication entre conteneurs. Par conséquent, je ne recommande pas de définir l'option iptables à false dans docker car cela briserait toute cette fonctionnalité comme vous l'avez vu.

Publier un port sur l'hôte autorise implicitement l'accès depuis l'extérieur. Ainsi, l'option la plus simple pour éviter l'accès de l'extérieur est de ne pas publier le port. Vous pouvez publier le port sur une interface spécifique, par ex. 127.0.0.1:8080:80 qui publierait le port 8080 sur l'interface de bouclage de l'hôte ( 127.0.0.1 ) pour se connecter au port 80 d'un conteneur, et cette interface de bouclage n'est pas accessible de l'extérieur. Toutefois, si laisser le port non publié n'est pas une option, il est possible de le faire avec iptables.

Ce que je veux à ce stade, c'est savoir s'il est possible d'utiliser iptables pour bloquer les ports ouverts par Docker et comment

Cela peut être fait en modifiant le DOCKER-USER chaîne de filtration. Vous pouvez trouver des exemples de cela, comme :

$ iptables -I DOCKER-USER -i ext_if ! -s 192.168.1.0/24 -j DROP

à partir des documents suivants : https://docs.docker.com/network/iptables/

Notez que le port est modifié par certaines règles de manipulation qui s'exécutent avant les règles de filtrage, donc si vous voulez filtrer par port, vous devrez utiliser conntrack pour obtenir le port de destination original :

$ iptables -I DOCKER-USER -i eth0 -p tcp \
    -m conntrack --ctorigdstport 8080 -j DROP
$ iptables -I DOCKER-USER -i eth0 -s 10.0.0.0/24 -p tcp \
    -m conntrack --ctorigdstport 8080 -j ACCEPT

Notez qu'il y a une règle par défaut dans DOCKER-USER pour accepter tout, donc vous voudrez insérer des règles au sommet de la chaîne ( -I ) plutôt que de l'ajouter à la fin ( -A ).

Voir : Etapes pour limiter les connexions extérieures au conteneur docker avec iptables ?

0 votes

Comment puis-je ajouter ceci à /etc/iptables.rules ? J'obtiens une erreur de syntaxe lorsque j'ajoute -I

0 votes

@chovy Je ne peux pas voir votre écran d'ici.

0 votes

Comment ajouter sans iptables dans le fichier ?

3voto

paaacman Points 133

Ce que je veux à ce stade, c'est savoir s'il est possible d'utiliser iptables pour bloquer les ports ouverts par Docker et comment (via mangle prerouting peut-être ?).

Après de nombreuses recherches et tests, j'ai découvert que la meilleure (et la plus simple) façon d'exposer uniquement les ports que vous souhaitez et de ne pas exposer les ports de docker est de définir l'IP dans le champ docker-compose.yml vers 127.0.0.1 (à exposer uniquement à l'hôte)

ports:
  - "127.0.0.1:3306:3306"

Vous pouvez ensuite utiliser nginx ou tout autre proxy inverse pour vous exposer à l'extérieur.

Par ici :

  • Vous n'avez pas besoin de ajouter les règles iptables DOCKER-USER à chaque fois que vous redémarrez docker
  • Le port 3306 est exposé uniquement à l'intérieur de l'hôte
  • Docker peut gérer les règles iptables comme il le souhaite.

0 votes

Bonjour, merci pour les conseils ! Au fait, pourquoi avons-nous encore besoin d'un reverse proxy ?

1 votes

Nous avons toujours besoin d'un reverse proxy parce que nous voulons exposer le service à travers le reverse proxy, à un domaine spécifique seulement ou avec des règles d'autorisation / refus d'IP, par exemple.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X