Shorewall et Docker
J'utilise Shorewall depuis des années pour gérer la configuration des iptables sur les serveurs que je gère. shorewall est un très bon outils qui permet via une configuration assez simple d'administrer les règles iptables.
Jusque là tout va bien, mais arrive Docker qui va lui aussi gérer ses propres règles iptables, notement pour le nat des conteneurs pour qu'ils puissent accéder à Internet, mais aussi pour la publication des ports des services gérés dans les conteneurs.
Et là c'est le drame !
Créer les règles shorewall pour Docker
Il faut créer dans shorewall les règles pour que les conteneurs puissent avoir accès à Internet :
/etc/shorewall/shorewall.conf
IP_FORWARDING=On
/etc/shorewall/masq
#INTERFACE:DEST SOURCE
eth0 172.17.0.0/16
Adapter l'adresse du réseau et l'interface réseau suivant la configuration.
/etc/shorewall/interfaces
#ZONE INTERFACE OPTIONS
dock docker0
/etc/shorewall/zones
#ZONE INTERFACE
dock ipv4
/etc/shorewall/policy
...
dock all ACCEPT
...
A adapter, il faut aussi accepter le traffic entre la zone fw et dock.
Tout va bien tant qu'il ne faut pas recharger la configuration de shorewall. Que ce passe t'il dans ce cas ? Shorewall va réinitialiser les iptables et donc enlever les règles DOCKER.
On devrait avoir ceci comme règles au minima pour Docker :
# iptables -L|grep DOCKER*
DOCKER-ISOLATION all -- anywhere anywhere
DOCKER all -- anywhere anywhere
DOCKER all -- anywhere anywhere
Chain DOCKER (2 references)
Chain DOCKER-ISOLATION (1 references)
Après redémarrage de shorewall, il n'y a plus de règles et la c'est la cata c'est la cata .... tout dépend maintenant de la version de shorewall que vous avez d'installé.
Shorewall avant la version 5.0.6
Cas sur les serveurs Debian Jessie par exemple, on a une version 4.6.4.3 de shorewall.
Dans ce cas il faut aller modifier les process de démarrage et de rechargement de shorewall comme ceci, on va utiliser les Extensions Scripts de shorewall
On va en créer 3 : init § stop et start.
/etc/shorewall/init
if iptables -t nat -L DOCKER >/dev/null 2>&1; then
echo '*nat' >/etc/shorewall/docker_rules
iptables -t nat -S DOCKER >>/etc/shorewall/docker_rules
iptables -t nat -S POSTROUTING >>/etc/shorewall/docker_rules
echo "COMMIT" >>/etc/shorewall/docker_rules
echo '*filter' >>/etc/shorewall/docker_rules
iptables -S DOCKER >> /etc/shorewall/docker_rules
echo "COMMIT" >>/etc/shorewall/docker_rules
fi
/etc/shorewall/stop
if iptables -t nat -L DOCKER >/dev/null 2>&1; then
echo '*nat' >/etc/shorewall/docker_rules
iptables -t nat -S DOCKER >>/etc/shorewall/docker_rules
iptables -t nat -S POSTROUTING >>/etc/shorewall/docker_rules
echo "COMMIT" >>/etc/shorewall/docker_rules
echo '*filter' >>/etc/shorewall/docker_rules
iptables -S DOCKER >> /etc/shorewall/docker_rules
echo "COMMIT" >>/etc/shorewall/docker_rules
fi
/etc/shorewall/start
if [ -f /etc/shorewall/docker_rules ]; then
iptables-restore -n </etc/shorewall/docker_rules
run_iptables -t nat -I PREROUTING -m addrtype --dst-type LOCAL -j DOCKER
run_iptables -t nat -I OUTPUT ! -d 127.0.0.0/8 -m addrtype --dst-type LOCAL -j DOCKER
run_iptables -I FORWARD -o docker0 -j DOCKER
run_iptables -I FORWARD -o docker0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
run_iptables -I FORWARD -i docker0 ! -o docker0 -j ACCEPT
run_iptables -I FORWARD -i docker0 -o docker0 -j ACCEPT
rm -f /etc/shorewall/docker_rules
fi
Une fois shorewall relancé il sauvegardera la conf des iptables de Docker dans un fichier et la rechargera en cas de redémarrage
Shorewall après la version 5.0.6
Cas pour la Debian 9. Cette fois-ci shorewall intègre une gestion de Docker
Il faut pour cela :
/etc/shorewall/shorewall.conf
DOCKER=Yes
Avec cette configuration Shorewall et Docker vont fonctionner ensemble sans problèmes.