【问题标题】:Leverage iptables to drop packets between docker containers利用 iptables 在 docker 容器之间丢弃数据包
【发布时间】:2015-05-27 03:54:14
【问题描述】:

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

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

【问题讨论】:

    标签: docker iptables


    【解决方案1】:

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

    禁用 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
    

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

    【讨论】:

    • 我会尝试你的最后一种方法。我总是忘记规则的位置很重要。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-23
    相关资源
    最近更新 更多