web-dev-qa-db-ja.com

Dockerを使用している場合、Uncomplicated Firewall(UFW)は何もブロックしていません

Ubuntu Server(14.04 LTS)をセットアップするのはこれが初めてで、ファイアウォール(UFW)の構成に問題があります。

必要なのはsshhttpだけなので、これを実行しています:

Sudo ufw disable

Sudo ufw reset
Sudo ufw default deny incoming
Sudo ufw default allow outgoing

Sudo ufw allow 22/tcp
Sudo ufw allow 80/tcp

Sudo ufw enable
Sudo reboot

ただし、このマシンの他のポート上のデータベースに接続できます。私が間違っていることについてのアイデアはありますか?

EDIT:これらのデータベースはDockerコンテナー上にあります。これは関係があるのでしょうか? ufwの設定を上書きしますか?

EDIT2Sudo ufw status verboseの出力

Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), deny (routed)
New profiles: skip

To                         Action      From
--                         ------      ----
22/tcp                     ALLOW IN    Anywhere
80/tcp                     ALLOW IN    Anywhere
22/tcp (v6)                ALLOW IN    Anywhere (v6)
80/tcp (v6)                ALLOW IN    Anywhere (v6)
42
ESala

問題は、コンテナで-pフラグを使用していました。

Dockerはiptablesを直接変更しますが、ufw statusには表示されません。

可能な解決策は次のとおりです。

  1. -pフラグの使用を停止します。代わりにdockerリンクまたは docker networks を使用してください。

  2. コンテナをローカルでバインドして、マシンの外部に公開されないようにします。

    docker run -p 127.0.0.1:8080:8080 ...

  3. -pフラグの使用を主張する場合は、/etc/docker/daemon.jsonで無効にして再起動することにより、iptablesに触れないようにdockerに指示します。

    { "iptables" : false }

オプション1または2をお勧めします。オプション3 副作用 に注意してください。コンテナがインターネットに接続できなくなるなどです。

61
ESala

16.04は新しい課題を提示します。示されているようにすべての手順を実行しました ufwファイアウォールの背後でDockerを実行していますBUT DockerとUFWを16.04で動作させることができませんでした。言い換えれば、私が何をしたとしても、すべての港湾労働者のポートはインターネットにグローバルにさらされました。これが見つかるまで: IPTABLES/FirewallDに干渉しないようにDocker 1.12+を設定する方法

ファイル/etc/docker/daemon.jsonを作成し、以下を入れる必要がありました。

{
    "iptables": false
}

次にSudo service docker stopを発行し、Sudo service docker start FINALLYドッカーはUFWの適切なルールに従っています。

追加データ: DockerはUFWを無効にします!

8
Hal Jordan

Systemd(Ubuntu 15.10以降)のinitシステムを使用している場合、/etc/docker/daemon.json(存在しない場合は作成する必要がある)を編集し、iptablesキーが設定されていることを確認します。

{   "iptables" : false }

EDIT:これにより、コンテナ内からインターネットへの接続が失われる可能性があります

UFWを有効にしている場合は、コンテナ内からインターネットにアクセスできることを確認してください。そうでない場合は、DEFAULT_FORWARD_POLICY/etc/default/ufwACCEPTとして定義し、ここで説明するトリックを適用する必要があります。 https://stackoverflow.com/a/17498195/507564

4
orshachar

高速な回避策は、Dockerを実行してポートマッピングを実行する場合です。いつでもできる

docker run ...-p 127.0.0.1:<ext pot>:<internal port> ...

dockerが外部からアクセスされないようにします。

2
kimy82

コンテンツでの/etc/docker/daemon.jsonの使用

{
  "iptables": false
}

解決策のように聞こえるかもしれませんが、次の再起動までしか機能しません。その後、コンテナにインターネットへのアクセス権がないため、たとえばWebサイトにpingを実行できないことがわかります。望ましくない動作である可能性があります。

コンテナを特定のIPにバインドする場合も同様です。あなたはそれをしたくないかもしれません。 究極のオプションは、コンテナを作成し、何が起こってもUFWの背後に置くことであり、このコンテナをどのように作成するのかという解決策があります:

/etc/docker/daemon.jsonファイルを作成したら、次を呼び出します。

sed -i -e 's/DEFAULT_FORWARD_POLICY="DROP"/DEFAULT_FORWARD_POLICY="ACCEPT"/g' /etc/default/ufw
ufw reload

そのため、受け入れのためにUFWでデフォルトの転送ポリシーを設定し、以下を使用します。

iptables -t nat -A POSTROUTING ! -o docker0 -s 172.17.0.0/16 -j MASQUERADE

Docker-composeを使用する場合、上記のコマンドのIPは、docker-compose upで実行するときにdocker-composeが作成するネットワークのIPに置き換える必要があります。

問題と解決策をより包括的に説明しました この記事では

それが役に立てば幸い!

2
mkubaczyk

私の場合、特定のIPからのみDockerにアクセスできるようにiptablesを変更しました。

ESalaの答え

コンテナで-pフラグを使用すると、Dockerはufwを無視して、iptablesに直接変更を加えます。

Dockerによってiptablesに追加されたレコードの例

「DOCKER」チェーンへのルーティング:

-A PREROUTING -m addrtype --dst-type LOCAL -j DOCKER
-A OUTPUT ! -d 127.0.0.0/8 -m addrtype --dst-type LOCAL -j DOCKER

「DOCKER」チェーンからコンテナへのパケットの転送:

-A DOCKER -i docker0 -j RETURN
-A DOCKER ! -i docker0 -p tcp -m tcp --dport 6379 -j DNAT --to-destination 172.17.0.3:6379

iptablesを変更して、指定されたソースIPからのみDOCKERチェーンへのアクセスを許可できます(例:1.1.1.1):

-A PREROUTING -s 1.1.1.1 -m addrtype --dst-type LOCAL -j DOCKER
-A OUTPUT -s 1.1.1.1 ! -d 127.0.0.0/8 -m addrtype --dst-type LOCAL -j DOCKER

iptables-save > /tmp/iptables.confおよびiptables-restore < /tmp/iptables.confを使用して、iptablesルールをダンプ、編集、および復元できます。

1
AI Mechanic
  1. ドッカーコンソールにログインします。

    Sudo docker exec -i -t docker_image_name/bin/bash

  2. そして、ドッカーコンソール内で:

    Sudo apt-get update
    Sudo apt-get install ufw
    Sudo ufw allow 22
    
  3. Ufwルールを追加してufwを有効にします

    Sudo ufw enable

    • Dockerイメージは--cap-add = NET_ADMINで開始する必要があります

「NET_ADMIN」Dockerオプションを有効にするには:

1.コンテナの停止:

dockerはコンテナを停止します。 2.コンテナIDを取得します:

dockerはコンテナを検査します。 3. hostconfig.jsonを変更します(デフォルトのdockerパス:/ var/lib/docker、変更できます)

vim /var/lib/docker/containers/containerid/hostconfig.json

4.「CapAdd」を検索し、nullを["NET_ADMIN"]に変更します。

....、 "VolumesFrom":null、 "CapAdd":["NET_ADMIN"]、 "CapDrop":null、.... 5.ホストマシンでdockerを再起動します。

サービスドッカーの再起動。 6.conatinerを起動します。

dockerはコンテナを起動します。

0
Stefan

コンテナを起動するときに--network = Hostを使用して、Dockerがデフォルトのブリッジネットワークではなく、隔離されたホストオンリーネットワークにポートをマップするようにします。ブリッジネットワークをブロックする合法的な方法はありません。あるいは、カスタムユーザー定義ネットワークを分離して使用できます。

0
thecoder

docker-composeを使用していくつかのコンテナを起動しましたが、1つのポートがufwルールを無視して世界に公開されるという問題もありました。

Dockerコンテナでのみポートを使用できるようにするための修正は、docker-compose.ymlファイルのこの変更でした。

ports:
- "1234:1234"

これに:

ports:
- "1234"

これで、他のdocker-containerは引き続きポートを使用できますが、外部からアクセスできません。

0
TmTron