利用iptables在docker容器之间丢弃数据包

时间:2015-05-26 19:27:31

标签: docker iptables

我有三个容器C1,C2和C3,形成一个集群,并运行一个DNS实例。容器使用DNS解析其IP,并且在使用vanilla docker配置公开所需端口时已经可以相互通信。

如何利用主机中的iptables在任何时间点丢弃C1和C2之间的数据包?

1 个答案:

答案 0 :(得分:6)

从您的问题中不清楚您的目标是什么,所以这里有几个选项。

禁用ICC

如果您使用--icc=false运行Docker守护程序,则默认情况下 的容器将无法通信,除非您明确地将它们与--link链接。

如果您遵循此路线,请注意this issue(tl; dr:您必须确保在最近的内核上加载br_netfilter模块。)

修改容器内的iptables

您可以使用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

修改主机上的iptables

您可以修改主机上的FORWARD链,以阻止特定容器之间的流量。例如,要将数据包从C1丢弃到C2:

iptables -I FORWARD 1 -s <ip_of_c1> -d <ip_of_c2> -j DROP

这将在-I FORWARD 1表的第1位(FORWARD)插入上述规则。这是必要的,因为它必须出现在-i docker0 -o docker0 -j ACCEPT规则之前Docker将FORWARD链添加到--icc=true,这是默认值。