web-dev-qa-db-ja.com

プライベートでプロキシされたDockerネットワーク設定

Desired schema

上記は、目的のネットワークのレイアウトです。私はそれを正しくするのに苦労しています。 ルーターからの内部リンクはこの問題には関係ありません

要件:

  1. 一般に直接公開される唯一のコンテナは、プロキシである必要があります。
  2. すべてのコンテナは、できればホスト名を介して相互に通信できます(ユーザー定義のDockerネットワークを参照)。
  3. Portainerなどの一部のサービスでは、サーバーから一部のデータを取得するためにインターネットアクセス(送信)が必要ですが、それ以外の場合は直接アクセスできないようにする必要があります。
  4. ホストはコンテナサービスに直接アクセスできますが、外部からではなく、ホスト自体からのみアクセスできます。

これまでに達成したこと:

  1. プロキシは、目的のコンテナを外部に正しくプロキシします。
  2. すべてのコンテナは相互に通信でき、それらのIPはサービス名を介して解決できます。

問題:

  1. プロキシを使用せずに(公開されたポートを使用して)、すべてのコンテナーに直接アクセスできます。
  2. ブリッジネットワークにない場合はインターネットがありませんが、インターネットがある場合は直接アクセスできます。

私は3つのネットワークが必要だと信じています:

  1. コンテナ自体の内部ネットワーク
  2. インターネットがあるネットワーク(ただし、どういうわけかポートを公開していません)
  3. 一般に公開されるプロキシによって使用されるネットワーク

私はPortainerを介してすべてを構成しており、DockerホストはFirewalldを使用しています。提案を事前に感謝します!

1
Limnic

さて、この問題を再検討した後、Dockerのチートシートを読んでいて、インターフェイスにバインドできることに気付きました。デフォルトでは、インターフェースが指定されていない場合、インターフェースは0.0.0.0にバインドされますが、たとえば127.0.0.1:80:80を指定すると、Dockerホストのみがポート80のコンテナーにアクセスできるようになります。

このように、プライベートネットワーク(192.168.1.0/24)を、Dockerコンテナーのすべての公開ポートにバインドするインターフェイスとして指定し(ネットワーク内から直接アクセスできるように)、バインドしたCaddyプロキシのみを0.0.0.0。これは私が望むように動作しており、特別な設定は必要ありませんでした。

さらに、すべてのコンテナをinternalという同じユーザー定義ネットワークにリンクしました。このネットワークでは、外部アクセスを制限するtrueに設定しました。このようにして、コンテナは相互に通信でき、コンテナ名で解決でき、プライベートネットワーク以外からはアクセスできません。すべてのコンテナからのすべてのサービスは、リバースプロキシによってのみ公開されます。

0
Limnic

すべてのコンテナをDockerオーバーレイネットワークに配置します。このようにして、それらは互いに通信しますが、それ以外の場合はそれらのいずれにも接続できません。プロキシを入力Dockerサービスとしてセットアップします。デフォルトでは、コンテナはインターネットに接続するためのアクセス権も持っています。

一部のコンテナのみにインターネットへのアクセスを許可する場合は、そのオーバーレイネットワークのIPマスカレードを無効にして次の手順を実行します。

a。 ICCを無効にし、マスカレードを有効にして、インターネットへのアクセスが必要なコンテナのみをそのネットワークに接続して、別のオーバーレイネットワークを作成します。

b。 Squidなどのプロキシコンテナをセットアップし、IPマスカレードを許可するDockerのデフォルトのブリッジネットワークを介してインターネットアクセスを許可します。

c。 a)とb)の組み合わせ。

0