notes/docker-passe-sous-nftables
Ton INPUT est en drop, et Docker publie quand même le port à tout internet
Un port publié par Docker ne passe jamais par la chaîne INPUT. Le pare-feu avait l'air fermé, le phpMyAdmin était ouvert, et un test depuis le bureau ne voyait rien.
- docker
- nftables
- sécurité
Une machine Debian 12 en production, un table inet firewall avec INPUT en policy drop et une liste blanche d'adresses d'administration. Dans le compose, une ligne ports: - "8080:80" devant un phpMyAdmin. Le compteur de la règle DNAT de Docker affichait 313 827 paquets le 30 septembre 2026.
Le trafic vers un port publié ne passe pas par INPUT. Docker pose une règle DNAT dans ip nat qui renvoie le paquet vers le conteneur, et un paquet réécrit de cette façon traverse FORWARD. Ta politique drop ne le voit jamais passer. Sur cette machine, la FORWARD de inet firewall était en policy accept et la chaîne DOCKER-USER, la seule que Docker te laisse pour filtrer ses ports, était vide.
Le plus vicieux, c'est le test. Tu lances un curl depuis ton poste, il répond 200, tu te dis que c'est normal puisque ton adresse est en liste blanche. Elle l'est. Sauf que ton poste répondrait 200 dans les deux cas, port filtré ou port ouvert à tous. Un contrôle lancé depuis une adresse autorisée ne prouve rien, ni dans un sens ni dans l'autre.
Deux commandes à passer sur toute machine qui fait tourner Docker :
ss -ltnp | grep docker-proxy
nft list chain ip filter DOCKER-USER
La première liste ce qui écoute sur 0.0.0.0 ou [::]. La seconde, si elle revient vide, te dit que personne ne filtre ces ports.
Un outil d'administration se publie sur 127.0.0.1:8080:80 et se joint par un proxy local ou un tunnel SSH. Si le port doit vraiment sortir, les règles s'écrivent dans DOCKER-USER. Ce phpMyAdmin ne servait plus à personne. Il a été retiré de la machine le jour même.