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社の協力のもと、公式ブログ記事の翻訳・公開など、日本での普及にも努めています。
