1. ホーム
  2. ubuntu

[解決済み] Ubuntuでのdocker + ufwのベストプラクティスを教えてください。

2022-07-24 23:05:18

質問

Dockerを試したところです。素晴らしいのですが、ufwとうまく動作しないようです。デフォルトでは、docker は iptables を少し操作します。結果はバグではありませんが、私が期待したものではありませんでした。 詳しくは UFW+Dockerの危険性

私の目標は、以下のようなシステムを構築することです。

    Host (running ufw) -> docker container 1 - nginx (as a reverse proxy)
                       -> docker container 2 - node web 1
                       -> docker container 3 - node web 2
                       -> .......

私はufwを通して受信トラフィックを管理したい(例えばアクセス制限)ので、dockerにiptablesを触らせたくありません。以下は私のテストです。

環境です。

  • 新しくインストールした Ubuntu 14.04 (kernel: 3.13.0-53 )
  • Docker 1.6.2
  • ufw転送が有効です( [UFW転送を有効にする]) 2 )
  • --iptables=false がDockerデーモンに追加されました。

最初の試み

docker run --name ghost -v /home/xxxx/ghost_content:/var/lib/ghost -d ghost
docker run --name nginx -p 80:80 -v /home/xxxx/nginx_site_enable:/etc/nginx/conf.d:ro --link ghost:ghost -d nginx

運が悪い。最初のコマンドは問題ありませんが、2番目のコマンドはエラーを投げます。

Error response from daemon: Cannot start container

2回目の試行

すると、こんなものが出てきました。 unable to link containers with --iptables=false #12701

以下のコマンドを実行した後、すべてが問題ないように見えます。

sudo iptables -N DOCKER

しかし、コンテナ内の送信接続を確立することができないことに気づきました。たとえば

xxxxg@ubuntu:~$ sudo docker exec -t -i nginx /bin/bash
root@b0d33f22d3f4:/# ping 74.125.21.147
PING 74.125.21.147 (74.125.21.147): 56 data bytes
^C--- 74.125.21.147 ping statistics ---
35 packets transmitted, 0 packets received, 100% packet loss
root@b0d33f22d3f4:/# 

もし私が --iptables=false を削除すると、コンテナのインターネット接続は正常に戻りますが、ufw は「正しく」動作しません (まあ...私の定義では)。

それで、docker + ufw のベストプラクティスは何でしょうか?どなたか、何らかの手助けをしていただけませんか?

どのように解決するのですか?

私は数ヶ月前にこのような問題が発生したことがあり、最近、私のブログで解決策と一緒に問題を説明することにしました。これがその近道です。

使用方法 --iptables=false を使っても、あなたが説明したようなケースにはあまり役に立ちません。ここでは単に十分ではありません。デフォルトでは、どのコンテナも発信接続を行うことはできません。

ここで、UFW の背後にあるコンテナを持つための方法について、あなたが省略している小さなステップがあります。あなたは --iptables=false を使うか、あるいは /etc/docker/daemon.json ファイルを作成し、その内容は次のようになります。

{
  "iptables": false
}

を指定しても結果は同じですが、後者の場合、docker サービス全体を service docker restart で再起動するか、この機能を無効にする前に docker が iptables のルールを追加する機会があったのなら、再起動する必要があります。

完了したら、あと2つのことをするだけです。

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

ということで、UFWでacceptのデフォルトフォワードポリシーを設定し、使用します。

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

この方法では、iptables ルールで docker の面倒な動作を無効にすると同時に、docker に必要なルーティングを提供して、コンテナがうまく送信接続できるようにします。UFWルールはこの時点からまだ制限されていますが。

これが、あなたや、答えを探しにここに来た人たちのために問題を解決してくれることを願っています。

この問題と解決策をより包括的に説明したのは、次のサイトです。 https://www.mkubaczyk.com/2017/09/05/force-docker-not-bypass-ufw-rules-ubuntu-16-04/