Shorewall+Docker:相性抜群の組み合わせ

Matt Palmer
Nov 23, 2015 • 2 min read

以前にも触れたように、私たちDiscourseではDockerを愛用しています。セキュリティも同様に大切にしており、最近では「職人の手作りiptablesファイアウォールルール」をShorewallで管理する構成に置き換えています。これはPuppetとの相性がより良いためです。しかし残念ながら、現状では3歳の双子のように、2つが常にうまく連携してくれるわけではありません。

DockerとShorewallはどちらも、他の誰もファイアウォール設定を積極的に変更していないことを前提としています。Shorewallがそう前提するのは、既存のファイアウォール設定を完全に吹き飛ばし、ルールファイルから生成したルールセットに置き換えることを好むためです。一方Dockerは、ポートフォワーディングシステムを実装するためにNATルールを挿入するなどの処理を行います。それぞれ単独では理にかなっていますが、この2つの動作を組み合わせると…大爆発です。

Shorewallのルールセットを再読み込みするたびに、すべてのDockerコンテナへのトラフィックが止まってしまいます。Dockerを再起動すれば解決しますが、大規模な本番インフラでそんなことをしたい人はいないでしょう。私も御免です。

幸いなことに、Shorewallは素晴らしいシステムであるだけあって、独自のカスタム処理を行うために使えるフックポイント(Shorewallでは拡張スクリプトと呼ばれています)が豊富に用意されています。今回のケースでは、ファイアウォールを吹き飛ばす前に既存のDocker関連ファイアウォールルールを保存し、その後に復元するために利用します。DockerがほとんどのルールをDOCKERという名前の専用チェーンにまとめるという設計判断のおかげで、これは非常にシンプルに実現できます。

作成すべきフックは3つあり、すべて同じパスに配置します。

/etc/shorewall/init/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

上記の内容でこれら3つのファイルを作成すれば、shorewall start または shorewall restart を実行した際に、Shorewallで定義したルールとDockerのルールがすべて適用された状態でファイアウォールが再起動されます。

原文はこちら:


Good Loopでは、Discourseのセルフホスティングを安価で提供しています。開発元であるCDCK社の協力のもと、公式ブログ記事の翻訳・公開など、日本での普及にも努めています。

詳しくはこちら: Discourseの導入・運用支援・コンサルティング – Good Loop