FirewallDとdocker:ポートがパブリックにアクセスされないようにブロック

FirewallDとdocker:ポートがパブリックにアクセスされないようにブロック

現在、Centos8とFirewalldで実行されている2つのDockerコンテナへのアクセスを制限するにはいくつかの問題があります。まず、コンテナの構成は次のとおりです。

services:
  service1:
    ports:
      - 1234:1234
  service2:
    ports:
      - 6969:6969

Docker領域には、次の(デフォルト)構成があります。

docker (active)
  target: ACCEPT
  icmp-block-inversion: no
  interfaces: br-b2ef50b272a2 docker0
  sources:
  services:
  ports:
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:

このようにして残すときにdocker-compose upを実行すると、アプリケーションが実行され、アプリケーション間で通信が行われますが、そのポートもパブリックインターネット経由でアクセスできます。私の究極の目標は、アプリケーション間の内部通信を維持しますが、そのポートへのパブリックアクセスをブロックし、特定のIPのみを許可することです。これまで私が成功しなかったこと:

  1. まず docker zone の対象を に変更してみました。default これは2つのアプリケーション間の通信を失っただけで、他の影響はありませんでした。
  2. 豊富なルールが追加されました。 rule family="ipv4" source NOT address="X.X.X.X" port port="6969" protocol="tcp" reject ルールは無視されました。

2つのサービスが互いに通信している間にFirewallDとdockerゾーンを使用してこれらのポートへのアクセスをブロックする方法はありますか?

答え1

設定にリバースプロキシサービスを追加し、service1およびservice2ポートの公開を停止し、リバースプロキシにトラフィックをフィルタリングさせることができます。

ポートを公開しないと、コンテナは互いに通信し続け(同じDockerネットワーク内)、組み込みDocker DNSを介してサービス名でIPを解決できます。 (例:サービス1、サービス2)

この場合、作成ファイルはおおよそ次のようになります。

services:
  service1:

  service2:

  proxy:
    ports:
      - 80:80
      - 443:443
      - <extra ports>:<extra ports>

たとえば、追加の構成としてnginxコンテナを使用できます。 (プロキシがそのサービスで指定した外部ポートをリッスンするように設定されていることを確認してください。)

location /service1 {
    allow X.X.X.X;
    deny  all;
    proxy_pass http://service1:1234;
}

location /service2 {
    allow X.X.X.X;
    deny  all;
    proxy_pass http://service2:6969;
}

または、nginx設定でそれぞれサービスポートでリッスンする2つの「サーバー」ディレクティブを作成し、URLパスを追加したくない場合は、ルートロケーション(「/」)を介してトラフィックを転送できます。

これにより、サービスの複数のコピーを実行し、すべて同じポートでリッスンしながら、リバースプロキシを介してサービスを公開してトラフィックをフィルタリングできます。

関連情報