J'ai pas mal bossé sur cette problématique et ai trouvé deux solutions:
- Un script iptables qui est exécuté à chaque up -d
et qui recréé autant que possible les chaines docker originales.
- Ne rien bloquer en output.
Pour préciser : Docker gère de base ces propres règles netfilter. C'est nécessaire à son bon fonctionnement.
Il est possible de lui dire de ne pas toucher à netfilter, mais là, il faut faire soit même le job (ma première solution).
C'est franchement galère dès qu'on a plus de 3-4 containers et qu'on touche souvent à son serveur.
Sinon, on peut aussi laisser docker vivre sa vie avec netfilter et ne travailler que sur les entrées/sorties.
Vu la destination de mon serveur et que je suis le seul à m'y connecter au niveau système, j'ai personnellement choisi cette option:
# Set the ports you need to be open :
PORT_OPEN[0]=80 # HTTP
PORT_OPEN[1]=443 # HTTPS
PORT_OPEN[2]=53 # DNS
PORT_OPEN[3]=913 # OpenVPN
PORT_OPEN[4]=25 # SMTP
PORT_OPEN[5]=587 # SMTP SARTTLS
PORT_OPEN[6]=993 # IMAPS SSL/TLS
PORT_OPEN[7]=4190 # Sieve SARTTLS
PORT_OPEN[8]=22 # SSH
# Base iptables rules :
iptables -F # Flush existing rules.
iptables -X # Delete user defined rules.
iptables -P INPUT DROP # Drop all input connections.
iptables -P OUTPUT ACCEPT # Drop all output connections.
iptables -P FORWARD DROP # Drop all forward connections.
iptables -A INPUT -i lo -j ACCEPT # Allow input on loopback.
iptables -A OUTPUT -o lo -j ACCEPT # Allow input on loopback.
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT # Don't break established connections.
iptables -A INPUT -p icmp -j ACCEPT # Allow ping request
for i in "${PORT_OPEN[@]}"; do
iptables -A INPUT -p tcp --dport $i -j ACCEPT # Set specified rules.
done
iptables -A INPUT -j DROP # Drop anything else
netfilter-persistent save # Save rules.
netfilter-persistent reload # Reload rules.
systemctl stop docker
systemctl start docker
Évidemment, il convient de redémarrer docker après application afin qu'il recréé ces propres règles.