【发布时间】:2015-05-27 03:54:14
【问题描述】:
我有三个容器 C1、C2 和 C3,形成一个集群,并运行一个 DNS 实例。容器使用 DNS 解析它们的 IP,并且已经可以相互通信,因为它们使用 vanilla docker 配置公开所需的端口。
如何利用主机的iptables 在任何时间点丢弃 C1 和 C2 之间的数据包?
【问题讨论】:
我有三个容器 C1、C2 和 C3,形成一个集群,并运行一个 DNS 实例。容器使用 DNS 解析它们的 IP,并且已经可以相互通信,因为它们使用 vanilla docker 配置公开所需的端口。
如何利用主机的iptables 在任何时间点丢弃 C1 和 C2 之间的数据包?
【问题讨论】:
从您的问题中不清楚您的目标是什么,所以这里有几个选项。
如果您使用--icc=false 运行 Docker 守护程序,则容器将默认无法通信,除非您明确将它们与 --link 链接。
如果您遵循这条路线,请注意 this issue(tl;dr:您必须确保在最近的内核上加载了 br_netfilter 模块)。
您可以使用nsenter 工具在容器内运行iptables 命令,并将DROP 规则添加到容器的INPUT 链中。例如,如果您知道 (a) 容器 C1 的 PID 和 (b) 容器 C2 的 IP 地址(两者都可以通过 docker inspect 获得),您可以运行:
nsenter -t <pid_of_C1> --net iptables -A INPUT -s <ip_of_c2> -j DROP
您可以修改主机上的FORWARD 链来阻止特定容器之间的流量。例如,将数据包从 C1 丢弃到 C2:
iptables -I FORWARD 1 -s <ip_of_c1> -d <ip_of_c2> -j DROP
这会将上述规则插入FORWARD 表的位置 1 (-I FORWARD 1)。这是必要的,因为它必须出现在-i docker0 -o docker0 -j ACCEPT 规则之前,当--icc=true 是默认设置时,Docker 将添加到FORWARD 链中。
【讨论】: