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


44

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

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

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

EDIT2:の出力sudo 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)

どのデータベース?どのポート?これは同じマシンですか?出力は何 ufw status
ですか-solsTiCe

@solsTiCeはい、それは同じマシンだと確信しています。データベースは、ポート8083とを持つInfluxDB(ドッカーコンテナー上)8086です。ufw status verbose質問に出力を追加しました。ありがとう。
ESala

回答:


64

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

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

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

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

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

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

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

    { "iptables" : false }

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


8
これはとても便利です-ufwで許可していなかったポートにアクセスできるようになると夢中になりました。ただし、リバースプロキシなど、localhostでコンテナーにアクセスできるようになるなど、iptables = falseを使用すると、多くの問題が発生します。コンテナが正しくリッスンしていることを確認してください。-p80:80を使用せず、nginxまたはapacheを使用してポートなしでリバースプロキシする場合は-p 127.0.0.1:80:80または127.0.0.1:3000:80などの別のポートを使用してください。衝突。
アンドレアスレイフ

2
@AndreasReiffあなたは正しいですが、最近-p、できる限り避けることが最善であることがわかりました。例えば、リバースプロキシの場合、私は労働者コンテナの任意のポートをマッピングしていないし、それ自身で容器にnginxのを置く-p 80:80と、--link他の人に。この方法では、ポートの衝突はあり得ず、アクセスの唯一のポイントはnginxを介したものです。
ESala

1
また、この投稿で3番目の注意事項を確認してください。svenv.nl/unixandlinux/dockerufw
ヘンク

1
重要/etc/default/dockerupstart configによって使用される構成ファイルです。upstartからsystemdに移動した場合、このファイルは使用されません。
-orshachar

@ESalaこの回答は日付が付けられているため、正しいものとしてマークを外すことを検討する必要があります。
ctbrown

8

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

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

{
    "iptables": false
}

その後sudo service docker stopsudo service docker startFINALLY DockerがUFWの適切なルールに従っていることを発行しました。

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


Ubuntu 16.04およびDockerバージョン17.09では、このソリューションはコンテナーからのアウトバウンド接続を切断します。応答askubuntu.com/a/833363/262702およびaskubuntu.com/a/954041/262702
ctbrown

5

systemd(Ubuntu 15.10以降)のinitシステムを使用している場合は、編集します/etc/docker/daemon.json(存在しない場合は作成する必要がある場合があります)iptables

{   "iptables" : false }

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

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


2

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

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

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


2

/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が作成するネットワークのIPに置き換える必要がありますdocker-compose up

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

それが役に立てば幸い!


1

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

あたりとしてESalaの答え

-pコンテナでフラグを使用すると、Dockerはutableを無視して、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

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

-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ルールを使用iptables-save > /tmp/iptables.confしてiptables-restore < /tmp/iptables.conf、ダンプ、編集、および復元することができます。


0

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


0
  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

私が使用しdocker-compose、いくつかのコンテナを開始し、また、一方のポートがUFWのルールを無視して、世界にさらされたことが問題を抱えていました。

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

ports:
- "1234:1234"

これに:

ports:
- "1234"

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.