By Walid ETTAYEB

Si vous constatez que les ports de votre conteneur Docker sont exposés et contournent toutes les règles UFW, c'est normal car Docker manipule iptables lors de la création du conteneur. Par défaut, Docker fonctionne avec iptables sans que l'utilisateur ait à créer des règles iptables compliquées. Si vous ne voulez pas que Docker crée des règles iptables ou si vous utilisez UFW, vous devez les configurer correctement pour qu'ils fonctionnent bien ensemble.

Empêcher Docker de manipuler iptables

Selon les guides de Docker, il est possible de définir la clé iptables à false dans le fichier de configuration du moteur Docker situé dans /etc/docker/daemon.json.

Vous pouvez le faire en exécutant la commande suivante:

sudo bash -c 'echo "{
\"iptables\": false
}" >> /etc/docker/daemon.json'

Placer Docker derrière UFW

  1. Récupérez le nom de votre interface externe
echo $(ip route get 8.8.8.8 | awk -- '{printf $5}')
  1. Ajoutez ce qui suit à la fin du fichier /etc/ufw/after.rules. Remplacez eth0 par le nom de l'interface que vous avez obtenu à l'étape précédente. Le nom d'interface le plus courant est eth0
# sudo nano /etc/ufw/after.rules

# BEGIN UFW AND DOCKER
*filter
:ufw-user-forward - [0:0]
:ufw-docker-logging-deny - [0:0]
:DOCKER-USER - [0:0]
-A DOCKER-USER -j ufw-user-forward

-A DOCKER-USER -j RETURN -s 10.0.0.0/8
-A DOCKER-USER -j RETURN -s 172.16.0.0/12
-A DOCKER-USER -j RETURN -s 192.168.0.0/16

-A DOCKER-USER -p udp -m udp --sport 53 --dport 1024:65535 -j RETURN

-A DOCKER-USER -j ufw-docker-logging-deny -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -d 192.168.0.0/16
-A DOCKER-USER -j ufw-docker-logging-deny -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -d 10.0.0.0/8
-A DOCKER-USER -j ufw-docker-logging-deny -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -d 172.16.0.0/12
-A DOCKER-USER -j ufw-docker-logging-deny -p udp -m udp --dport 0:32767 -d 192.168.0.0/16
-A DOCKER-USER -j ufw-docker-logging-deny -p udp -m udp --dport 0:32767 -d 10.0.0.0/8
-A DOCKER-USER -j ufw-docker-logging-deny -p udp -m udp --dport 0:32767 -d 172.16.0.0/12

-A DOCKER-USER -j RETURN

-A ufw-docker-logging-deny -m limit --limit 3/min --limit-burst 10 -j LOG --log-prefix "[UFW DOCKER BLOCK] "
-A ufw-docker-logging-deny -j DROP

COMMIT
# END UFW AND DOCKER
  1. Supprimer "iptables" : "false" de /etc/docker/daemon.json

  2. Assurez-vous que DEFAULT_FORWARD_POLICY="DROP" dans /etc/default/ufw

  3. Tester avant de redémarrer

  4. Ouvrez les ports en fonction de vos besoins. Vous pouvez autoriser l'accès aux ports à tous les conteneurs ou à un conteneur spécifique.

Pour permettre l'accès public au port 8080:

sudo ufw route allow proto tcp from any to any port 8080

Autoriser l'accès public au port 80 pour le conteneur avec l'adresse privée 172.17.0.3

ufw route allow proto tcp from any to 172.17.0.3 port 80

Autoriser le DNS

ufw route allow proto udp from any to any port 53

Walid ETTAYEB • 36 Articles

Passionné par l'informatique depuis mon plus jeune âge, je transforme ma passion en expertise.

View Articles