Dockerを実行しているCentOSサーバーがあり、iptablesを使用してサーバーを保護しようとしています。また、コンテナのポートに外部からアクセスできない限り、コンテナにインターネットへのアクセスを許可する方法を理解することはできません。
'--iptables = false'コマンドを使用してDockerがiptablesをいじるのを止め、iptablesを手動で構成するのに苦労しています。
次のようにファイアウォールを設定したいと思います。
私は最初の2つを持っていますが、3つ目を有効にしようとすると、最初の2つが無効になります。
2つのテストコンテナがあります。 Web出力ポート3333を転送するhttpdコンテナとDebianを実行している別のコンテナ。
IPTablesはで構成されています
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
iptables -A INPUT -i lo -j ACCEPT
そのため、外部からmyserver:3333にアクセスできません。しかし、私はホストから実行できます:curl localhost:3333そしてアクセスできます。
次に追加しました:
iptables -A INPUT -i docker0 -j ACCEPT
そして今、私は私のdebianテストコンテナcurl 172.17.0.1:3333で実行することができ、それもうまく機能します。
しかし、テストコンテナ内にいて、次のように試してみると、curlhttpbin.org/ip応答がありません。
私は https://fralef.me/docker-and-iptables.html を読んでいて、提案を試しました:
iptables-A FORWARD -i docker0 -o eth0 -j ACCEPT
iptables-A FORWARD -i eth0 -o docker0 -j ACCEPT
これらを使用して、テストコンテナから丸くすることができますが、これにより3333も世界に開かれます。コンテナーがアクセスできるようにiptablesを構成し、アクセスを禁止するにはどうすればよいですか?
デフォルトのファイアウォールの動作が役に立ちます。発信アクセスを制限するには、宛先ドメインでACLを備えたプロキシを使用します。コンテナに基づいてアクセスを制限することもできます。先週、SquidのID ACLタイプと、コンテナーの名前を返すカスタムIDサーバーを使用して、これを行うためのいくつかの機能を作成しました。
詳細は https://distracted-it.blogspot.co.nz/2017/11/provisioning-limited-access-via-squid.html
また、プロキシを経由せずにコンテナサーバーが直接接続しないようにする必要があります。
私が見つけた解決策は、私が欲しいものを提供しているようです:
iptables -A INPUT -i docker0 -j ACCEPT
iptables -A FORWARD -i docker0 -o eth0 -j ACCEPT
iptables -A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
これは許可するようです
しかし、これらのポートへのアクセスは外の世界に開かれていません。
私の問題は、INPUTに追加した関連/確立された命令がFORWARDに変換されないことを理解していなかったことだと思います。