Passer au contenu principal

Règles IPTables pour Docker

Par défaut, toutes les adresses IP externes sont autorisées à se connecter à Docker. Pour limiter l'accès aux conteneurs à une seule IP ou à un réseau entier, vous devez créer et placer une règle avant celles utilisant la chaîne DOCKER-USER.

Docker gère automatiquement les règles IPTables pour garantir l'isolation du réseau et le bon fonctionnement des conteneurs. Lorsque Docker ajoute des règles IPTables, il utilise la chaîne DOCKER. Si vous devez ajouter des règles qui s'exécutent avant celles de Docker, utilisez la chaîne DOCKER-USER et évitez de modifier directement les règles que Docker met en place dans la chaîne DOCKER.

Pour appliquer une règle IPTables sécurisant les connexions Docker au démarrage, suivez ces étapes :

  1. Créer un script de démarrage :

    Créez un fichier script, par exemple /usr/local/bin/iptables-rules.sh.

    sudo nano /usr/local/bin/iptables-rules.sh
    
  2. Ajouter la commande au script :

    Insérez et modifiez à votre convenance les exemples :

#!/bin/bash
# Remplacer 'ext_if' par le nom de votre interface réseau externe, comme 'eth0'.
ext_if="eth0"  # Remplacez par votre interface réseau externe

# Pour trouver l'interface réseau, vous pouvez utiliser la commande suivantes :
# `ip link show` : Affiche toutes les interfaces

# Exemple : Bloque toutes les connexions sauf celles de 192.168.1.1
iptables -I DOCKER-USER -i $ext_if ! -s 192.168.1.1 -p tcp -m multiport --dports 80,443 -j DROP

Ci-dessous une version qui lit un fichier de whitelist peut être parfaite pour du proxy Cloudflare :

#!/bin/bash

# Remplacer 'ext_if' par le nom de votre interface réseau externe, comme 'eth0'.
ext_if="eth0"  # Remplacez par votre interface réseau externe
whitelist_file="/usr/local/bin/whitelist.txt"  # Chemin vers le fichier de liste blanche

# Lire le fichier de liste blanche et ajouter des règles pour chaque adresse IP ou plage CIDR
while IFS= read -r line; do
 # Ignorer les lignes de commentaire et les lignes vides
 if [[ ! $line =~ ^# ]] && [[ -n $line ]]; then
     # Détecter si l'adresse est IPv4 ou IPv6
     if [[ $line =~ : ]]; then
         # Adresse IPv6
         ip6tables -I DOCKER-USER -i $ext_if ! -s $line -p tcp -m multiport --dports 80,443 -j DROP
     else
         # Adresse IPv4
         iptables -I DOCKER-USER -i $ext_if ! -s $line -p tcp -m multiport --dports 80,443 -j DROP
     fi
 fi
done < "$whitelist_file"
  1. Crée la whitlist (optionnel) :

    sudo nano /usr/local/bin/whitelist.txt
    
     # Cloudflare https://www.cloudflare.com/fr-fr/ips/
     173.245.48.0/20
     103.21.244.0/22
     103.22.200.0/22
     103.31.4.0/22
     141.101.64.0/18
     108.162.192.0/18
     190.93.240.0/20
     188.114.96.0/20
     197.234.240.0/22
     198.41.128.0/17
     162.158.0.0/15
     104.16.0.0/13
     104.24.0.0/14
     172.64.0.0/13
     131.0.72.0/22
     2400:cb00::/32
     2606:4700::/32
     2803:f800::/32
     2405:b500::/32
     2405:8100::/32
     2a06:98c0::/29
     2c0f:f248::/32
    
  2. Rendre le script exécutable :

    sudo chmod +x /usr/local/bin/iptables-rules.sh
    
  3. Créer un service systemd :

    Créez un fichier de service systemd pour exécuter le script au démarrage :

    sudo nano /etc/systemd/system/iptables-rules.service
    

    Ajoutez le contenu suivant :

     [Unit]
     Description=Apply custom IPTables rules
     After=network.target docker.service
     Requires=docker.service
    
     [Service]
     Type=oneshot
     ExecStart=/usr/local/bin/iptables-rules.sh
     RemainAfterExit=yes
    
     [Install]
     WantedBy=multi-user.target
    
  4. Activer le service :

    Activez le service pour qu'il s'exécute au démarrage :

    sudo systemctl enable iptables-rules.service
    sudo systemctl start iptables-rules.service
    

Désactiver la gestion automatique des règles IPTables par Docker

Si vous préférez que Docker ne gère pas automatiquement les règles de votre firewall, vous pouvez le désactiver :

  • Modifiez le fichier /etc/docker/daemon.json pour définir iptables à false :

    sudo nano /etc/docker/daemon.json
    

    Ajoutez ou modifiez la ligne suivante :

    {
        "iptables": false
    }
    
  • Pour le bridge docker0, ajoutez ces règles :

    sudo iptables -A FORWARD -i docker0 -o eth0 -j ACCEPT
    sudo iptables -A FORWARD -i eth0 -o docker0 -j ACCEPT
    

    Vous pourrez ensuite créer vos règles IPTables comme d'habitude.

Documentation