Docker - 从容器修改主机的IPTABLES

时间:2015-05-11 13:30:19

标签: docker iptables fail2ban

我想运行一个具有中央日志和fail2ban服务的docker容器,以防止dos / ddos​​攻击。

运行具有此功能的容器时遇到问题,它也可以修改主机iptables。

有一个项目ianblenke/docker-fail2ban,但它不起作用......

赋予容器标志特权只允许我控制此容器上的iptables。有没有办法通过容器控制主机iptables

问候。

2 个答案:

答案 0 :(得分:11)

默认情况下,Docker容器在隔离的网络命名空间内运行,在那里他们无法访问主机网络配置(包括iptables)。

如果您希望容器能够修改主机的网络配置,则需要将--net=host选项传递给docker run。从docker-run(1)手册页:

--net="bridge"
   Set the Network mode for the container
       'bridge': creates a new network stack for the container on the docker bridge
       'none': no networking for this container
       'container:': reuses another container network stack
       'host':  use  the host network stack inside the container.
       Note: the host mode gives the container full access to
       local system services such as D-bus and is therefore
       considered insecure.

您需要同时使用--privileged--net=host

答案 1 :(得分:4)

不再需要

--privileged标志。 从Docker 1.2开始,您现在可以使用参数--cap-add=NET_ADMIN--cap-add=NET_RAW运行您的图像,这将允许内部iptables。

也许值得注意的是,在未安装Docker Hub iptables软件包的官方Ubuntu映像中。 所以一般的指示应该是

  • apt-get install iptables
  • 使用--net=host--cap-add=NET_ADMIN --cap-add=NET_RAW选项运行docker容器。

此外,如果您的docker镜像缺少iptables包,并且您不想从中创建自定义图像,则可以在同一网络空间中运行带有iptables的容器。例如。如果您正在运行容器container-without-iptables,并且想要在同一网络命名空间中启动某些container-with-iptables,则可以执行以下操作:

docker run -it --pid=container:container-without-iptables --net=container:container-without-iptables --cap-add sys_admin container-with-iptables