Shorewall+Docker: Two Great Tastes That Taste Great Together

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: Shorewall+Docker: Two Great Tastes That Taste Great Together

8개의 좋아요

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

2개의 좋아요

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개의 좋아요

오래된 스레드를 다시 꺼내서 죄송합니다. 하지만 이 내용 덕분에 제 스웜 서비스들이 shorewall과 함께 작동하게 되었으니, 다른 분들에게도 이 추가 노트가 유용할 수 있을 것 같습니다.

위 스크립트가 사용자의 필요에 따라 의도대로 작동할 수도, 아닐 수도 있습니다. 그 이유는 iptables -S를 실행하면 규칙들이 append 형식으로 반환되기 때문입니다. 제 shorewall 규칙처럼 비교적 공격적인 규칙을 사용하고 있다면, 단순한 append는 Docker 전용 iptables 체인에 도달하기 훨씬 전에 DROP이 발생하게 만들 가능성이 높습니다.

대신 규칙을 prepend하도록 수정한 방법은 다음과 같습니다:

/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

그리고 /etc/shorewall/start 파일은 다음과 같습니다:

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