gpt4 book ai didi

ubuntu - Ubuntu下docker + ufw的最佳实践是什么

转载 作者:IT老高 更新时间:2023-10-28 12:36:41 31 4
gpt4 key购买 nike

我刚刚尝试了 Docker。它很棒,但似乎不适用于 ufw。默认情况下,docker 会稍微操作 iptables。结果不是错误,但不是我所期望的。
有关更多详细信息,您可以阅读 The dangers of 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(内核: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
    没运气。第一个命令没问题,但第二个命令会抛出错误
    Error response from daemon: Cannot start container
    第二次尝试
    然后我发现了这个: 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:/#
    如果我从 Docker 守护进程中删除 --iptables=false,那么容器的 Internet 连接将恢复正常,但 ufw 将无法“正常”工作(好吧……根据我的定义)。
    那么,docker + ufw 的最佳实践是什么?任何人都可以提供一些帮助吗?

    最佳答案

    几个月前我就遇到过这样的问题,最近决定在我的博客上描述这个问题和解决方案。这是捷径。

    使用 --iptables=false 不会对您描述的情况有多大帮助。光在这里是不够的。默认情况下,您的任何容器都不能进行任何传出连接。

    在您将容器置于 UFW 后面的过程中,您省略了一小步。您可以使用 --iptables=false 或创建内容如下的 /etc/docker/daemon.json 文件

    {
    "iptables": false
    }

    结果将是相同的,但后一个选项要求您使用 service docker restart 重新启动整个 docker 服务,或者如果 docker 在您禁用此功能之前有机会添加 iptables 规则,则甚至重新启动。

    完成后,只需再做两件事:
    $ 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

    这样你所实现的就是在你的 iptables 规则中禁用 docker 困惑行为,同时 docker 提供了必要的路由,因此容器可以很好地进行传出连接。不过,从现在开始,UFW 规则仍将受到限制。

    希望这可以为您和任何来到这里寻找答案的人解决问题。

    我在 https://www.mkubaczyk.com/2017/09/05/force-docker-not-bypass-ufw-rules-ubuntu-16-04/更全面地描述了问题和解决方案

    关于ubuntu - Ubuntu下docker + ufw的最佳实践是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30383845/

    31 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com