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

Leverage iptables to drop packets between docker containers

我有三个容器C1、C2、C3,组成一个集群,还有一个DNS实例运行。容器使用 DNS 解析它们的 IP,并且已经可以相互通信,因为它们使用 vanilla docker 配置公开所需的端口。

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

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

禁用 ICC

如果您 运行 Docker 守护程序与 --icc=false,则容器将 默认情况下 无法通信,除非您明确 link 他们 --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

这会将上述规则插入 FORWARD table 的位置 1 (-I FORWARD 1)。这是必要的,因为它必须在 -i docker0 -o docker0 -j ACCEPT 规则之前,即 Docker 将在 --icc=true 时添加到 FORWARD 链,这是默认设置。