web-dev-qa-db-ja.com

Dockerで動作するようにファイアウォールを構成するにはどうすればよいですか?

私のコンピューターは、私のマシン以外からは決してアクセスできないはずのアプリケーションをポート1234でホストしています。ただし、私のDockerコンテナー(Apacheを実行している)はこれにアクセスできるはずです。同様に、私のDockerコンテナーはさまざまなポートで多数のリソースをホストしており、これらのリソースはコンピューターからのみアクセスできる必要があります。さて、これは私のシステムがその特定のネットワークにブリッジを使用するという事実によってさらに複雑になります:

NETWORK ID          NAME                DRIVER              SCOPE
4d4b5e752963        bridge              bridge              local               
c387eb42698a        project_default     bridge              local               
6818c0eb94bf        Host                Host                local               
f7e4ed6c05a2        none                null                local  

このブリッジには(面倒なことに)Docker Composeセットアップを再起動するたびに変わるランダムに生成されたIDが常にあります。

br-c387eb42698a Link encap:Ethernet  HWaddr 02:42:29:95:fd:2c  
          inet addr:172.18.0.1  Bcast:0.0.0.0  Mask:255.255.0.0
          inet6 addr: fe80::42:29ff:fe95:fd2c/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:405753 errors:0 dropped:0 overruns:0 frame:0
          TX packets:530699 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:85147217 (85.1 MB)  TX bytes:75260996 (75.2 MB)

つまり、次のものが必要です。

  • Anybr-c387eb42698a上のホスト(またはネットワーク名は何でも)でローカルマシンのポート1234にアクセスします(便利な172.18.0.1)
  • 私のマシンはany上のポートanyそのサブネット上のホストにアクセスできます。 (デフォルト)
  • 決してアクセスできない世界anyサブネットからポートまたはポート1234.

理想的には、ここでのソリューションは、IPに依存しない方法で動作するため、172.18.0.0/24サブネット上のブリッジに依存せず、発生するネットワークに接続している場合にデータリークを壊したり許可したりしません。 172.18.0.0/24サブネットを含めるため。

私が考えることができる最も簡単なことは、インターフェース名を使用し、その周りにUFWルールを設定することです。しかし、私のインターフェースは絶えず変化しているので、私は本当にそれを行うことはできません。

これどうやってするの?純粋なufw(または必要に応じてiptables)でこれを行うことを希望しますが、永続ID(またはカスタム名も)を常に割り当てるようにDockerを構成する必要があるソリューションを受け入れています。ブリッジインターフェイス。

3
Kaz Wolfe

これはVanilla UFWでは不可能です。これは、インターフェイス名が推測不可能な状態にあるためです。このような設定を行うには、手動で定義されたネットワークを作成する必要があります。つまり、構成設定でDockerのbridgeの-​​ driver options を使用して、 カスタムネットワーク を作成できます。これは次のようになります。

networks:
    my_bridge:
        driver: bridge
        driver_opts:
            com.docker.network.bridge.name: my-bridge

ここから、ブリッジ構成を構成ファイルの各サービスに追加できます。

myimage:
    image: myimage:1.0
    ports:
        - "2580:2580"
    networks:
        - my_bridge

次に、Composeシステムの次回起動時に、適切な名前で新しいネットワークが作成されます。

my-bridge Link encap:Ethernet  HWaddr 11:22:33:44:55:66  
      inet addr:172.18.0.1  Bcast:0.0.0.0  Mask:255.255.0.0
      inet6 addr: fe80::42:1122:3344:5566/64 Scope:Link
      UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
      RX packets:11 errors:0 dropped:0 overruns:0 frame:0
      TX packets:6 errors:0 dropped:0 overruns:0 carrier:0
      collisions:0 txqueuelen:0 
      RX bytes:788 (788.0 B)  TX bytes:695 (695.0 B)

そこから、ポート1234への接続を許可するUFWルールを追加するのは簡単です。

ufw allow in on my-bridge from any to any port 1234

そして突然、すべてが完璧に機能します!

5
Kaz Wolfe

受け入れられた回答を統合するには、dockerコマンドを使用して、docker-composeの外部にネットワークを作成することもできます。

Sudo docker network create -d bridge -o com.docker.network.bridge.name=my-bridge my_bridge

その後、発行するネットワークを検査できます

ip link show

これで、作成ファイルでデフォルトのネットワークを再ルーティングするか、既存のネットワークに再マップするネットワークを定義できます

version: "3"
services:
  test:
    image: nginx:Alpine
    ports:
      - "80:80"
networks:
  default:
    external:
      name: my_bridge
1