Docker et Shorewall

 

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.