Passer au contenu principal

Règles IPTables pour Docker

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
  1. Ajouter la commande au script :

InsérezVoici etquelques modifiezexemples de règles à votreajouter convenancedans lesce exemplesscript :

#!/bin/bash
# Remplacer 'ext_if' parAutoriser le nomforwarding deentre docker0 et votre interface réseauprincipale 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(ex : # `ip link show`eth0) : Affiche toutes
sudo lesiptables interfaces-A #FORWARD Exemple-i docker0 -o eth0 -j ACCEPT
sudo iptables -A FORWARD -i eth0 -o docker0 -j ACCEPT
    Restreindre l'accès à un conteneur exposant le port 8080 à une seule IP : Bloque toutes
    sudo les connexions sauf celles de 192.168.1.1
    
    # Adresse IPv6
    ip6tablesiptables -IA DOCKER-USER -i $ext_ifeth0 -p tcp --dport 8080 ! -s 192.168.1.1 -p udp -m multiport --dports 80,443 -j DROP
    
    # Adresse IPv4
    iptables -I DOCKER-USER -i $ext_if ! -s 192.168.1.1 -p udp -m multiport --dports 80,443203.0.113.123 -j DROP
    

    Ci-dessous

    uneAutoriser version qui lituniquement un fichierréseau despécifique whitelistà peutaccéder êtreà parfaitetous pourles duports proxy CloudflareDocker :
    #!/bin/bashsudo # 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
    
    # Vérifier que le fichier de liste blanche existe et est accessible en lecture
    if [ !iptables -r "$whitelist_file" ]; then
        echo "Erreur : Le fichier de liste blanche '$whitelist_file' n'existe pas ou n'est pas accessible en lecture." >&2
        exit 1
    fi
    
    # Lire le fichier de liste blanche et ajouter des règles pour chaque adresse IP ou plage CIDR
    while 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 grep -qE ':' <<< "$line"; then
                # Adresse IPv6
                ip6tables -IA DOCKER-USER -i "$ext_if" !eth0 -s "$line" -p tcp -m multiport --dports 80,44310.1.2.0/24 -j DROPACCEPT
    ip6tablessudo iptables -IA DOCKER-USER -i "$ext_if" ! -s "$line" -p udp -m multiport --dports 80,443eth0 -j DROP
            else
                # Adresse IPv4
                iptables -I DOCKER-USER -i "$ext_if" ! -s "$line" -p tcp -m multiport --dports 80,443 -j DROP
                iptables -I DOCKER-USER -i "$ext_if" ! -s "$line" -p udp -m multiport --dports 80,443 -j DROP
            fi
        fi
    done < "$whitelist_file"
    
    1. CréeDésactivez la whitlistgestion (optionnel)automatique des règles IPTables par Docker :

    Modifiez ou créez le fichier /etc/docker/daemon.json :

    sudo nano /usr/local/bin/whitelist.txtetc/docker/daemon.json
    

    Mettez-y :

    #{
      Cloudflare"iptables": https://www.cloudflare.com/fr-fr/ips/false
    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}
    
    1. Rendre le script exécutable :
    sudo chmod +x /usr/local/bin/iptables-rules.sh
    
    1. 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
    
    1. 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
    

    Voici le texte corrigé :

    Si le script et le service sont déjà lancés, et que vous voulez fermer un nouveau port

    1. Mettez à jour le script
    sudo nano /usr/local/bin/iptables-rules.sh
    
      Si vous voulez par exemple fermer le port 3001, changez ens18 par le nom de

      Ajoutez votre interfacenouvelle réseaurègle, externepuis :

      # Bloquez toutes les connexions sauf celles de 192.168.1.1
      iptables -I DOCKER-USER -i ens18 ! -s 192.168.1.1 -p tcp -m multiport --dports 3001 -j DROP
      iptables -I DOCKER-USER -i ens18 ! -s 192.168.1.1 -p tcp -m multiport --dports 3001 -j DROP
      
      # Bloquez toutes les connexions
      iptables -I DOCKER-USER -i ens18 -p tcp -m multiport --dports 3001 -j DROP
      iptables -I DOCKER-USER -i ens18 -p udp -m multiport --dports 3001 -j DROP
      

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

      Voici l'ensemble des étapes pour désactiver la gestion automatique des règles IPTables par Docker et mettre en place vos propres règles de façon permanente :

        Modifiez le fichier /etc/docker/daemon.json afin de désactiver la gestion automatique des règles IPTables par Docker :
        sudo nano /etc/docker/daemon.json
        

        Ajoutez ou modifiez la ligne suivante :

        {
          "iptables": false
        }
        
          Pour le bridge docker0, ajoutez ces règles (si nécessaire) :
          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.

            Créez un script de démarrage contenant vos règles personnalisées, par exemple :
            sudo nano /usr/local/bin/iptables-rules.sh
            

            Ajoutez vos règles IPTables dans ce script.

              Rendez le script exécutable :
              sudo chmod +x /usr/local/bin/iptables-rules.sh
              
                Créez un 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
                
                  Activezrechargez le service pourcomme qu'il s'exécute au démarragesuit :
                  sudo systemctl enable iptables-rules.service
                  sudo systemctl startrestart iptables-rules.service
                  

                  De cette façon, vos règles personnalisées seront appliquées de façon permanente à chaque démarrage, indépendamment de Docker, qui ne modifiera plus automatiquement les règles IPTables.


                  Documentation