web-dev-qa-db-ja.com

ホストのiptablesを使用して、docker-containerの公開ポートへのアクセスを防止します

いくつかのDockerのコンテナーを実行するホストがあります。

このホストにはいくつかのネットワークインターフェイスがあります。私の目標は、コンテナから公開されているポートの一部に特定のインターフェイスからのみアクセスできるようにし、他のインターフェイスからのアクセスを防ぐことです。

そのためにホストのiptablesを使用したいと思います。

しかし、単純に次のことを行うことは不可能です。

iptables -I INPUT -i vlan2 --dport 80 -j DROP

パケットは事前ルーティングによって転送されるためです。

iptables -t nat -L PREROUTING                                                                                                                               2
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination         
DOCKER     all  --  anywhere             anywhere             ADDRTYPE match dst-type LOCAL

Chain DOCKER (2 references)
target     prot opt source               destination         
DNAT       tcp  --  anywhere             anywhere             tcp dpt:mysql to:172.17.0.2:33066
DNAT       tcp  --  anywhere             anywhere             tcp dpt:http to:172.17.0.4:80

異なるコンテナに公開された2つのポート80と3306があり、インターフェイスvlan2からアクセスできないようにしたい

これを追加した後:

iptables -I FORWARD -i vlan2 -p tcp --dport 80 -j REJECT

Webサーバーは動作を停止しましたが、

iptables -I FORWARD -i vlan2 -p tcp --dport 3306 -j REJECT

mysqlへの接続を妨げないでください、私はまだ接続することができます。そして、tcpdumpはそれを証明します:

tcpdump -n -i vlan2 port 3306
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on vlan2, link-type EN10MB (Ethernet), capture size 262144 bytes
22:48:13.066636 IP 3.2.2.2.47259 > 1.1.2.3.3306: Flags [S], seq 3619220560, win 29200, options [mss 1460,sackOK,TS val 90183390 ecr 0,nop,wscale 7], length 0
22:48:13.066740 IP 1.1.2.3.3306 > 3.2.2.2.47259: Flags [S.], seq 2743923517, ack 3619220561, win 28960, options [mss 1460,sackOK,TS val 10989883 ecr 90183390,nop,wscale 7], length 0

そして、私はこれら2つのルールの違いを理解できません。

ホストのiptablesを使用してコンテナへのアクセスを防ぐ方法

1
Korjavin Ivan

問題は、natテーブルのPREROUTINGチェーンのNATルールがホストのポートを変換することです3306から172.17.0.2:33066であり、172.17.0.2:3306ではないため、フィルターテーブルのFORWARDチェーンのルールは宛先ポートに転送されたトラフィックをドロップしようとするため、tは何にでも一致します3306

1
Xavier Lucas