Shorewall+Docker: Zwei großartige Geschmäcker, die zusammen großartig schmecken

As has been mentioned previously, we lurve us some Docker here at Discourse. We also lurve us some security, and I’ve recently been replacing our “artisinally handcrafted iptables firewall rules” with a Shorewall-managed configuration, which plays better with Puppet. Unfortunately, as it stands, like my twin three year olds, they don’t always play well. The…


This topic is for comments on the original blog entry at: http://blog.discourse.org/2015/11/shorewalldocker-two-great-tastes-that-taste-great-together/

8 „Gefällt mir“

Big fan of Shorewall, been using it for a looong time.

2 „Gefällt mir“

Docker has changed their iptables implementation so that the rules captured and replaced are no longer complete.

As a suggestion the revisions posted below should correct the issue and be more tolerant of future changes

/etc/shorewall/init and /etc/shorewall/stop should become

if iptables -t nat -L DOCKER >/dev/null 2>&1; then
    echo '*nat' > /etc/shorewall/docker_rules
    iptables -t nat -S | grep -i docker >> /etc/shorewall/docker_rules
    echo 'COMMIT' >> /etc/shorewall/docker_rules

    echo '*filter' >> /etc/shorewall/docker_rules
    iptables -t filter -S | grep -i docker >> /etc/shorewall/docker_rules
    echo 'COMMIT' >> /etc/shorewall/docker_rules
fi

and /etc/shorewall/start should be

if [ -f /etc/shorewall/docker_rules ]; then
    iptables-restore -n < /etc/shorewall/docker_rules

    rm -f /etc/shorewall/docker_rules
fi
4 „Gefällt mir“

Entschuldigt bitte die Thread-Nekromantie, aber da dies dazu beigetragen hat, dass meine eigenen Swarm-Dienste mit Shorewall funktionieren, könnten diese zusätzlichen Hinweise auch für andere nützlich sein.

Die oben genannten Skripte funktionieren möglicherweise nicht wie erwartet für Ihre Anforderungen, und das liegt daran, dass iptables -S die Regeln im Anhängen-Format zurückgibt. Wenn Ihre Shorewall-Regeln wie meine recht aggressiv sind, bedeutet ein einfaches Anhängen, dass Sie wahrscheinlich eine DROP-Regel erhalten, lange bevor Sie eine der Docker-spezifischen iptables-Ketten erreichen.

Hier sind meine Modifikationen, um die Regeln stattdessen vorauszustellen:

Hier sind /etc/shorewall/{init,stop}:

rules=/etc/shorewall/.docker_rules
if iptables -t nat -L DOCKER >/dev/null 2>&1; then
    echo '*nat' > $rules
    iptables -t nat -S | grep -i docker > $rules.nat
    grep '^-N' $rules.nat >> $rules
    tac $rules.nat | sed -n 's/^-A \([^ ]\+\) /-I \1 1 /p' >> $rules
    rm -f $rules.nat
    echo 'COMMIT' >> $rules

    echo '*filter' >> $rules
    iptables -t filter -S | grep -i docker > $rules.filter
    grep '^-N' $rules.filter >> $rules
    tac $rules.filter | sed -n 's/^-A \([^ ]\+\) /-I \1 1 /p' >> $rules
    rm -f $rules.filter
    echo 'COMMIT' >> $rules
fi

Und hier ist /etc/shorewall/start:

rules=/etc/shorewall/.docker_rules
if [ -f $rules ]; then
    iptables-restore -n < $rules
    rm -f $rules
fi