利用 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
链,这是默认设置。
我有三个容器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
链,这是默认设置。