我有三个容器C1,C2和C3,形成一个集群,并运行一个DNS实例。容器使用DNS解析其IP,并且在使用vanilla docker配置公开所需端口时已经可以相互通信。
如何利用主机中的iptables
在任何时间点丢弃C1和C2之间的数据包?
答案 0 :(得分:6)
从您的问题中不清楚您的目标是什么,所以这里有几个选项。
如果您使用--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
这将在-I FORWARD 1
表的第1位(FORWARD
)插入上述规则。这是必要的,因为它必须出现在-i docker0 -o docker0 -j ACCEPT
规则之前Docker将FORWARD
链添加到--icc=true
,这是默认值。