Dockerのiptables

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

このあたりのベストプラクティスはどうするのが良いのかなぁ。

コメントを残す

メールアドレスが公開されることはありません。

Enter code * Time limit is exhausted. Please reload CAPTCHA.

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください