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
- Récupérez le nom de votre interface externe
echo $(ip route get 8.8.8.8 | awk -- '{printf $5}')
- Ajoutez ce qui suit à la fin du fichier
/etc/ufw/after.rules
. Remplacezeth0
par le nom de l'interface que vous avez obtenu à l'étape précédente. Le nom d'interface le plus courant esteth0
# 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
-
Supprimer
"iptables" : "false"
de/etc/docker/daemon.json
-
Assurez-vous que
DEFAULT_FORWARD_POLICY="DROP
" dans/etc/default/ufw
-
Tester avant de redémarrer
-
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