Dockerサービスが起動したときや、
コンテナを作ったときに、iptablesに自動的にフィルターが入ります。
困ったことに、特に設定しなければ、
INPUTもFORWARDもACCEPTになるため精神衛生上よくありません。
せめてINPUTとFORWARDはDROPとしておきたいです。
それに加えて、DOCKERコンテナへのフィルターを書く場合は、
mangleで設定しなければなりません。(natテーブルでもいけるかもしれません)
https://ja.wikipedia.org/wiki/Iptables#/media/File:Netfilter-packet-flow.svg
例えば
8.8.8.8からDockerコンテナ側への通信をDROPさせたい場合は、
以下のようにmangleテーブルにPREROUTING DROPを追加します。
# vi iptables *filter :FORWARD DROP :INPUT DROP :OUTPUT ACCEPT -A INPUT -p icmp -j DROP -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT -A INPUT -p tcp ! --syn -m state --state NEW -j DROP COMMIT *mangle -A PREROUTING -s 8.8.8.8/32 -j DROP COMMIT
こんな感じ
ipteblesをreloadしたら、dockerも再起動しないと、
dockerのフィルターがきえてしまうので注意。
フィルタの確認
# iptables -L Chain INPUT (policy DROP) target prot opt source destination DROP icmp -- anywhere anywhere ACCEPT tcp -- anywhere anywhere tcp dpt:availant-mgr ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED DROP tcp -- anywhere anywhere tcp flags:!FIN,SYN,RST,ACK/SYN state NEW Chain FORWARD (policy DROP) target prot opt source destination DOCKER-USER all -- anywhere anywhere DOCKER-ISOLATION-STAGE-1 all -- anywhere anywhere ACCEPT all -- anywhere anywhere ctstate RELATED,ESTABLISHED DOCKER all -- anywhere anywhere ACCEPT all -- anywhere anywhere ACCEPT all -- anywhere anywhere Chain OUTPUT (policy ACCEPT) target prot opt source destination Chain DOCKER (1 references) target prot opt source destination Chain DOCKER-ISOLATION-STAGE-1 (1 references) target prot opt source destination DOCKER-ISOLATION-STAGE-2 all -- anywhere anywhere RETURN all -- anywhere anywhere Chain DOCKER-ISOLATION-STAGE-2 (1 references) target prot opt source destination DROP all -- anywhere anywhere RETURN all -- anywhere anywhere Chain DOCKER-USER (1 references) target prot opt source destination RETURN all -- anywhere anywhere
mangleはテーブルを指定します。
# iptables -L -t mangle Chain PREROUTING (policy ACCEPT) target prot opt source destination DROP all -- 8.8.8.8 anywhere Chain INPUT (policy ACCEPT) target prot opt source destination Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination Chain POSTROUTING (policy ACCEPT) target prot opt source destination
このあたりのベストプラクティスはどうするのが良いのかなぁ。