web-dev-qa-db-ja.com

Dockerコンテナがアクセスできるようにiptablesを設定する

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を構成し、アクセスを禁止するにはどうすればよいですか?

1
Dave Alger

デフォルトのファイアウォールの動作が役に立ちます。発信アクセスを制限するには、宛先ドメインでACLを備えたプロキシを使用します。コンテナに基づいてアクセスを制限することもできます。先週、SquidのID ACLタイプと、コンテナーの名前を返すカスタムIDサーバーを使用して、これを行うためのいくつかの機能を作成しました。

詳細は https://distracted-it.blogspot.co.nz/2017/11/provisioning-limited-access-via-squid.html

また、プロキシを経由せずにコンテナサーバーが直接接続しないようにする必要があります。

1
Cameron Kerr

私が見つけた解決策は、私が欲しいものを提供しているようです:

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

これは許可するようです

  • Dockerコンテナ間の通信
  • コンテナからインターネットへの通信(サーバー上のeth0を介して)
  • 応答としてのコミュニケーション(関連/確立済み)

しかし、これらのポートへのアクセスは外の世界に開かれていません。

私の問題は、INPUTに追加した関連/確立された命令がFORWARDに変換されないことを理解していなかったことだと思います。

1
Dave Alger