
アクセスを制限するように設計された 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"
?