Ubuntu Server(14.04 LTS)をセットアップするのはこれが初めてで、ファイアウォール(UFW)の構成に問題があります。
必要なのはssh
とhttp
だけなので、これを実行しています:
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の設定を上書きしますか?
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)
問題は、コンテナで-p
フラグを使用していました。
Dockerはiptables
を直接変更しますが、ufw status
には表示されません。
可能な解決策は次のとおりです。
-p
フラグの使用を停止します。代わりにdockerリンクまたは docker networks を使用してください。
コンテナをローカルでバインドして、マシンの外部に公開されないようにします。
docker run -p 127.0.0.1:8080:8080 ...
-p
フラグの使用を主張する場合は、/etc/docker/daemon.json
で無効にして再起動することにより、iptables
に触れないようにdockerに指示します。
{ "iptables" : false }
オプション1または2をお勧めします。オプション3 副作用 に注意してください。コンテナがインターネットに接続できなくなるなどです。
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を無効にします!
Systemd(Ubuntu 15.10以降)のinitシステムを使用している場合、/etc/docker/daemon.json
(存在しない場合は作成する必要がある)を編集し、iptables
キーが設定されていることを確認します。
{ "iptables" : false }
EDIT:これにより、コンテナ内からインターネットへの接続が失われる可能性があります
UFWを有効にしている場合は、コンテナ内からインターネットにアクセスできることを確認してください。そうでない場合は、DEFAULT_FORWARD_POLICY
を/etc/default/ufw
でACCEPT
として定義し、ここで説明するトリックを適用する必要があります。 https://stackoverflow.com/a/17498195/507564
高速な回避策は、Dockerを実行してポートマッピングを実行する場合です。いつでもできる
docker run ...-p 127.0.0.1:<ext pot>:<internal port> ...
dockerが外部からアクセスされないようにします。
コンテンツでの/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に置き換える必要があります。
問題と解決策をより包括的に説明しました この記事では
それが役に立てば幸い!
私の場合、特定の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ルールをダンプ、編集、および復元できます。
ドッカーコンソールにログインします。
Sudo docker exec -i -t docker_image_name/bin/bash
そして、ドッカーコンソール内で:
Sudo apt-get update Sudo apt-get install ufw Sudo ufw allow 22
Ufwルールを追加してufwを有効にします
Sudo ufw enable
「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はコンテナを起動します。
コンテナを起動するときに--network = Hostを使用して、Dockerがデフォルトのブリッジネットワークではなく、隔離されたホストオンリーネットワークにポートをマップするようにします。ブリッジネットワークをブロックする合法的な方法はありません。あるいは、カスタムユーザー定義ネットワークを分離して使用できます。
docker-compose
を使用していくつかのコンテナを起動しましたが、1つのポートがufwルールを無視して世界に公開されるという問題もありました。
Dockerコンテナでのみポートを使用できるようにするための修正は、docker-compose.yml
ファイルのこの変更でした。
ports:
- "1234:1234"
これに:
ports:
- "1234"
これで、他のdocker-containerは引き続きポートを使用できますが、外部からアクセスできません。