当前位置: 首页 > 面试题库 >

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

萧献
2023-03-14
问题内容

我刚刚试用了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(内核:3.13.0-53)
  • Docker 1.6.2
  • 启用UFW转发。(启用UFW转发)
  • --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

第二次尝试

然后我发现了这一点:无法使用–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从Docker守护程序中删除,那么容器的互联网连接将恢复正常,但是ufw将无法“正常”工作(根据我的定义)。

那么,docker + ufw的最佳实践是什么?谁能提供帮助?

谢谢。

巴特


问题答案:

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

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

您只需要走一小步,就可以在这里将集装箱放在UFW后面。您可以使用--iptables=false或创建/etc/docker/daemon.json内容如下的文件

{
  "iptables": false
}

结果将是相同的,但是后一个选项要求您使用来重新启动整个docker服务,service docker restart或者如果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/上
更全面地描述了问题和解决方案



 类似资料:
  • 本文档旨在实验Docker1.13新特性和帮助大家了解docker集群的管理和使用。 环境配置 Docker1.13环境配置 docker源码编译 网络管理 网络配置和管理是容器使用中的的一个重点和难点,对比我们之前使用的docker版本是1.11.1,docker1.13中网络模式跟之前的变动比较大,我们会花大力气讲解。 如何创建docker network Rancher网络探讨和扁平网络实现

  • 本文衍生自官方的 Best practices for writing Dockerfiles , 在此之上增加了个人见解。 除此之外,官方还提供了几个标准的 Dockerfile 作为示例: buildpack-deps Go Rails 容器应该短命 docker 中的容器(container)应该是用过即弃的,每次使用时都应该重新从镜像(image)中构建。 使用 .dockerignore

  • 问题内容: 我刚开始学习Go,并通读现有代码以学习“其他人的做法”。在这种情况下,遍历使用go“工作区”,尤其是与项目依赖关系有关的地方。 在处理各种Go项目时,使用一个或多个Go工作区(即$ GOPATH的定义)的常见(或存在)最佳实践是什么?我应该期望有一个类似于我所有项目的中央代码存储库的Go工作区,还是在我处理这些项目时都明确将其分解并设置$ GOPATH(有点像python) virtu

  • 问题内容: 我正在构建一个基于expressjs的应用程序,我想在其中记录所有事件。我可以找到温斯顿,这似乎很酷。无论如何,我正在寻找一种方法将其连接到我的expressjs应用程序。 我还想要在应用程序内部登录。我的要求不是那么简单,所以我想将所有内容记录在我的应用程序中(不仅是请求)。 我目前的情况: server.js (我想在此级别记录http请求) 路线/something.js con

  • 问题内容: 我将开始使用AngularJS进行客户端和Django进行服务器端项目。 使他们像最好的朋友一样工作的最佳实践是什么(静态文件,身份验证,部署等) 问题答案: 有多种方法可以从Django模板中为客户端模板提供支持,以实现有趣的优化。但是,鉴于Django和AngularJS的模板语言之间的相似之处,在这里几乎不值得付出任何努力。对于此类大多数项目,我会将AngularJS的静态服务与

  • 这里有些给使用和编写 Ansible playbook 的贴士. 你能在我们的 ansible-example repository.找到展示这些最佳实践的 playbook 样例.(注意: 这些示例用的也许不是最新版的中所有特性,但它们仍旧是极佳的参考.) Topics 最佳实践 接下来的章节将向你展示一种组织 playbook 内容方式. 你对 Ansible 的使用应该符合你的需求而不是我们