Fiese Stolperfalle UFW und Docker - Ports erreichbar!

Die Docker eigene Firewall weicht UFW auf! Hier ist Vorsicht geboten! Bindet man einen Docker-Port an 0.0.0.0, gilt die UFW-Einstellung nicht mehr!

Zuallerst sollte man Ports nicht publizieren, Traefik braucht das nicht. Wenn doch, nur an 127.0.0.1:xxx.

Kann man das nicht beeinflussen, wie z.B. bei der offiziellen Bitwarden Installation, hilft der beschriebene Holzhammer:

Zuerst sollte das interne Docker-Netz auf einen bestimmten IP-Range gepinnt werden:

/etc/docker/daemon.json:

{
  "userns-remap": "default",
  "log-driver": "journald",
  "userland-proxy": false,
  "default-address-pools": [
     { "base":"172.16.0.0/16","size": 24 }
   ]
}

Anhängen an /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 172.16.0.0/12

-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 172.16.0.0/12
-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

Dann Ports 80 und 443 freigeben, damit Traefik erreichbar ist:

ufw route allow proto tcp from any to any port 443
ufw route allow proto tcp from any to any port 80

Basis:

chaifeng/ufw-docker: To fix the Docker and UFW security flaw without disabling iptables (github.com)