iptables 不适用于容器中的 macvlan 流量

iptables not working on macvlan traffic in container

我有一台主机,只有一个接口 eth0,IP 10.0.10.10/24。我启动docker,添加一个容器,没有网络。然后我在 eth0 上创建一个 macvlan 设备,给它 IP 10.0.10.20/24,然后把它放在容器中。

主机和容器现在都具有完整的网络访问权限。

然后我在主机上创建一个 iptables 规则以丢弃所有进出容器 IP 10.0.10.20 的流量。规则不起作用,流量通过。

当然,如果我在容器内执行此操作(ip netns exec $PID iptables ... 或通过赋予容器 NET_ADMIN 功能),它会起作用。

底层主机的iptables规则不应该过滤流量吗?

答案是:你做不到。使用网桥时,流量会进出主机,因此会到达主机的 ip 堆栈。当你使用 macvlan 时,唯一的 ip 栈是容器中的,因此主机上的 iptables 规则永远不会被调用。

唯一的方法是更改​​容器内 的 iptables 规则。

如果您不想授予容器访问权限,例如如果你想控制容器,那么从主机本身使用 ip netns exec ...,这将控制容器中的 iptables 规则,而不给容器本身控制。

我写了一个脚本来做到这一点。它可在 https://github.com/deitch/ctables 获得并获得麻省理工学院许可。