iptables不能在容器中的macvlanstream量上工作

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

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

然后,我在主机上创build一个iptables规则,以删除容器的IP 10.0.10.20所有stream量。 规则不起作用,并且stream量通过。

当然,如果我从容器内( ip netns exec $PID iptables ...或者通过提供容器NET_ADMINfunction)执行它,它就可以工作。

底层主机的iptables规则是否不过滤stream量?

答案是:你做不到。 当使用网桥时,stream量会进入主机,然后到达主机的IP堆栈。 当你使用macvlan时,唯一的ip栈是容器中的ip栈,所以主机上的iptables规则永远不会被调用。

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

如果你不想让容器访问,例如,如果你想控制容器,那么使用主机本身的ip netns exec ... ,它将控制容器中的iptables规则而不给容器本身控制。

我写了一个脚本来做到这一点。 它可以在https://github.com/deitch/ctables和MIT许可。