ファイアウォール ルールが Docker Web アプリへのアクセスを制限しない

ファイアウォール ルールが Docker Web アプリへのアクセスを制限しない

アクセスを制限するように設計された iptables 構成にもかかわらず、Docker コンテナ内のシステムで実行されているアプリケーションに公開されているポートが、世界に開かれたままになっているという問題があります。

この問題は、docker デーモンが起動時に iptables にルールを追加することに関係しているように思われます。、、およびフラグについても認識していますが--icc=true|false、これらのフラグのどの組み合わせを適用すればよいかわかりません。、を試してみましたが、どちらも望みどおりの効果はありませんでした。dockerデーモンが明らかに多数のルールを追加しており、それらがまだ必要な場合は手動で構成する必要があるため、使用したくないと思っています。--ip-forward=true|false--iptables=true|false--icc=false--ip-forward=false--iptables=false

これは、docker デーモンが起動する前のルールの状態です。

Chain INPUT (policy DROP 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 ACCEPT     all  --  lo     any     anywhere             anywhere            
    0     0 REJECT     all  --  !lo    any     anywhere             loopback/8           reject-with icmp-port-unreachable
    0     0 DROP       tcp  --  any    any     anywhere             anywhere             tcpflags:! FIN,SYN,RST,ACK/SYN state NEW
    0     0 DROP       all  -f  any    any     anywhere             anywhere            
    0     0 DROP       tcp  --  any    any     anywhere             anywhere             tcpflags: FIN,SYN,RST,PSH,ACK,URG/FIN,SYN,RST,PSH,ACK,URG
    0     0 DROP       tcp  --  any    any     anywhere             anywhere             tcpflags: FIN,SYN,RST,PSH,ACK,URG/NONE
   82  8831 ACCEPT     all  --  any    any     anywhere             anywhere             state RELATED,ESTABLISHED
    0     0 ACCEPT     icmp --  any    any     anywhere             anywhere             icmp echo-request
    0     0 ACCEPT     tcp  --  any    any     anywhere             anywhere             multiport dports ssh
    0     0 ACCEPT     tcp  --  any    any     <IP ADDRESS RANGE 1>  anywhere             multiport dports ssh,http,https,7990,7999,tproxy,8090,8095,18080
    0     0 ACCEPT     tcp  --  any    any     <IP ADDRESS RANGE 2>  anywhere             multiport dports ssh,http,https,7990,7999,tproxy,8090,8095,18080
    0     0 LOG        all  --  any    any     anywhere             anywhere             limit: avg 5/min burst 5 LOG level debug prefix "iptables denied: "
    0     0 REJECT     all  --  any    any     anywhere             anywhere             reject-with icmp-port-unreachable

Chain FORWARD (policy DROP 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
   24  2489 REJECT     all  --  any    any     anywhere             anywhere             reject-with icmp-port-unreachable

Chain OUTPUT (policy DROP 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
   77 10080 ACCEPT     all  --  any    any     anywhere             anywhere  

docker デーモンを実行すると次のようになります。

Chain INPUT (policy DROP 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 ACCEPT     all  --  lo     any     anywhere             anywhere            
    0     0 REJECT     all  --  !lo    any     anywhere             loopback/8           reject-with icmp-port-unreachable
    0     0 DROP       tcp  --  any    any     anywhere             anywhere             tcpflags:! FIN,SYN,RST,ACK/SYN state NEW
    0     0 DROP       all  -f  any    any     anywhere             anywhere            
    0     0 DROP       tcp  --  any    any     anywhere             anywhere             tcpflags: FIN,SYN,RST,PSH,ACK,URG/FIN,SYN,RST,PSH,ACK,URG
    0     0 DROP       tcp  --  any    any     anywhere             anywhere             tcpflags: FIN,SYN,RST,PSH,ACK,URG/NONE
 1335  230K ACCEPT     all  --  any    any     anywhere             anywhere             state RELATED,ESTABLISHED
    1    32 ACCEPT     icmp --  any    any     anywhere             anywhere             icmp echo-request
    7   380 ACCEPT     tcp  --  any    any     anywhere             anywhere             multiport dports ssh
    0     0 ACCEPT     tcp  --  any    any     <IP ADDRESS RANGE 1>  anywhere             multiport dports ssh,http,https,7990,7999,tproxy,8090,8095,18080
    0     0 ACCEPT     tcp  --  any    any     <IP ADDRESS RANGE 2>  anywhere             multiport dports ssh,http,https,7990,7999,tproxy,8090,8095,18080
   35  2016 LOG        all  --  any    any     anywhere             anywhere             limit: avg 5/min burst 5 LOG level debug prefix "iptables denied: "
   62  3672 REJECT     all  --  any    any     anywhere             anywhere             reject-with icmp-port-unreachable

Chain FORWARD (policy DROP 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
54492   21M DOCKER     all  --  any    docker0  anywhere             anywhere            
51882   20M ACCEPT     all  --  any    docker0  anywhere             anywhere             ctstate RELATED,ESTABLISHED
58371 9122K ACCEPT     all  --  docker0 !docker0  anywhere             anywhere            
    0     0 DROP       all  --  docker0 docker0  anywhere             anywhere            
 1186  121K REJECT     all  --  any    any     anywhere             anywhere             reject-with icmp-port-unreachable

Chain OUTPUT (policy DROP 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
 2090  263K ACCEPT     all  --  any    any     anywhere             anywhere            

Chain DOCKER (1 references)
 pkts bytes target     prot opt in     out     source               destination         
   86  7048 ACCEPT     tcp  --  !docker0 docker0  anywhere             172.17.0.2           tcp dpt:7990
 1639  395K ACCEPT     tcp  --  !docker0 docker0  anywhere             172.17.0.2           tcp dpt:7999
  791  151K ACCEPT     tcp  --  !docker0 docker0  anywhere             172.17.0.3           tcp dpt:http-alt
   20  1898 ACCEPT     tcp  --  !docker0 docker0  anywhere             172.17.0.4           tcp dpt:8090
   49  4561 ACCEPT     tcp  --  !docker0 docker0  anywhere             172.17.0.5           tcp dpt:18080
   25  3642 ACCEPT     tcp  --  !docker0 docker0  anywhere             172.17.0.6           tcp dpt:8095

iptables -Lまた、 を使用した場合にのみでは表示されない、 POSTROUTING および MASQUERADE ルールも多数ありますiptables-save。これらの意味もわかりません。

FORWARD チェーンの DOCKER ターゲット ルールが問題の原因であると思われますが、チェーンの先頭で docker デーモンによって挿入されているようなので、この問題を解決する方法がわかりません。

それで、docker の実行時にポート 7990、8090 などが外部に公開されないようにするには、何をすればよいか、誰かアドバイスをいただけませんか?

ありがとう

リチャード

答え1

このDOCKERチェーンは、FORWARD チェーンで定義されたカスタム チェーンです。パケットがanyインターフェイスに到達し、docker0 ブリッジ インターフェイスにバインドされると、カスタム DOCKER チェーンに送信されます。

パケット バイト ターゲット プロテクション オプトイン アウト ソース 宛先         
54492 21M DOCKER all -- any docker0 どこでも どこでも            

これで、DOCKER チェーンは、docker0 からのものを除くすべての着信パケットを取得し、コンテナの IP (172.xxx) とポート (この場合は 7990) に送信します。

パケット バイト ターゲット プロテクション オプトイン アウト ソース 宛先         
   86 7048 受け入れ tcp -- !docker0 docker0 どこでも 172.17.0.2 tcp dpt:7990

の出力を投稿するとiptables -t nat -L -n、ホストからコンテナへのポート転送を実行するルールが表示されますDNAT。たとえば、49154 のホスト インターフェイスにヒットするパケットは、コンテナ IP 172.17.0.2 およびポート 7990 にポート転送されます。

DNAT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:49154 から:172.17.0.2:7990

たとえば、ソース IP 0.0.0.0 を内部ネットワークから発信されたパケットのみを許可するように制限することで、コンテナにパケットが到達するのをブロックできます。コンテナ ポート 7990 への接続を、たとえば 192.168.1.0/24 の内部ネットワークからのみ許可するには、次のコマンドを実行します。

/sbin/iptables -I FORWARD '!' -s 192.168.1.0/24 -d 172.17.0.2 -p tcp --dport 7990 -j DROP

これにより、パケットが内部ネットワークから来ない限り、指定された IP:ポートのコンテナにパケットが転送されなくなります。設定に応じて、送信元/送信先の IP とポートを変更できます。

答え2

したがって、これはコメントになりますが、それに対するストレートな... ServerFault の報告はありません。

ここに掲載されている解決策を試しましたか:http://blog.viktorpetersson.com/post/101707677489/the-dangers-of-ufw-docker

このフラグを--iptables=falseこのように使用するのはどうでしょうかDOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4 --iptables=false"?

関連情報