Étonnamment, Docker ne fonctionne pas d’emblée avec le  » pare-feu universel  » de Linux, ou UFW. Ils modifient tous deux la même configuration iptables, ce qui peut entraîner des erreurs de configuration et exposer des conteneurs qui n’étaient pas censés être publics. Voici comment y remédier.

Pourquoi Docker ne fonctionne-t-il pas avec UFW ?

L’UFW est conçu comme un pare-feu très simple. Le problème est qu’UFW et Docker essaient tous deux de modifier les mêmes règles de pare-feu sous-jacentes, et ce conflit nécessite une configuration supplémentaire si vous voulez utiliser UFW et Docker ensemble.

COMMENT EXÉCUTER GRAFANA DANS UN CONTENEUR DOCKER ?

Si vous configurez un pare-feu UFW de base pour qu’il refuse par défaut et autorise HTTP et SSH, cela semblera sûr, mais ne bloquera pas le démarrage de conteneurs liés à d’autres ports par Docker. Ce problème peut être difficile à détecter, car UFW et Docker sont des systèmes distincts. UFW vous ment sans le savoir et n’affiche pas les ports ouverts des conteneurs Docker.

Cela peut être un problème majeur si vous ne l’attrapez pas. Par exemple, vous souhaitez peut-être exécuter un panneau d’administration interne sur le port 8000, et le mettre sur liste blanche pour votre propre adresse IP. Bien que cette configuration ne soit pas la plus sûre au départ, elle est généralement satisfaisante, surtout si le panneau dispose d’une authentification supplémentaire.

Cependant, UFW montrera la règle de pare-feu comme étant correctement mise sur liste blanche, et elle sera bien sûr visible pour vous depuis votre emplacement sur liste blanche. Mais, si elle est exécutée par Docker, elle sera visible sur le port 8000 depuis n’importe où par défaut.

Correction de la configuration de Docker

Il existe une solution proposée par Docker, qui consiste à modifier le fichier /etc/default/docker ou /etc/docker/daemon.json et à désactiver purement et simplement la fonctionnalité iptables de Docker :

DOCKER_OPTS= »–iptables=false »

Cela fonctionne, mais ce n’est qu’une demi-solution. Elle désactive la capacité de Docker à gérer son propre réseau et peut faire en sorte que les conteneurs ne puissent pas du tout accéder à Internet. Cela peut encore fonctionner, mais vous devrez maintenir manuellement les règles iptables pour les conteneurs Docker et les réseaux personnalisés, ce qui est compliqué, ennuyeux et va à l’encontre de la simplicité de l’UFW.

La vraie solution est compliquée, mais heureusement, elle est assez courante pour qu’il y ait un repo Github utile détaillant le problème et les étapes pour le résoudre. Essentiellement, vous devez modifier la configuration d’UFW dans /etc/ufw/after.rules pour ajouter le bloc suivant à la fin :

COMMENCER UFW ET DOCKER

*filtre
:ufw-user-forward – [0:0]
:ufw-docker-logging-deny – [0:0] (en anglais)
: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

Vous pouvez le faire manuellement, mais il y a un utilitaire sympa également fourni dans ce dépôt qui l’automatisera et fournira quelques commandes utiles pour vérifier le statut réel du pare-feu.
Vous pouvez le télécharger à partir de ce dépôt :

sudo wget -O /usr/local/bin/ufw-docker https://github.com/chaifeng/ufw-docker/raw/master/ufw-docker

sudo chmod +x /usr/local/bin/ufw-docker

Ensuite, installez la configuration, et redémarrez UFW.

ufw-docker install

sudo systemctl restart ufw

Une fois redémarré, les changements devraient s’appliquer automatiquement, mais si ce n’est pas le cas, vous devrez peut-être redémarrer Docker ou votre machine en général. Une fois le système activé, les ports devraient tous être correctement bloqués.

Liste blanche des ports de conteneurs Docker avec UFW

Cette solution nécessite que vous configuriez le port un peu différemment. L’utilitaire ufw-docker dispose d’une commande qui permet d’établir une liste blanche sélective des ports pour des conteneurs Docker spécifiques.

ufw-docker allow httpd 80

Cependant, si vous souhaitez utiliser une règle plus avancée, telle que la liste blanche basée sur l’IP, vous devrez utiliser ufw route allow

ufw route allow proto tcp de 1.2.3.4 vers tout port 9443