我的主机有一个接口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规则是否应该过滤流量?
答案 0 :(得分:4)
答案是:你不能这样做。使用网桥时,流量会进入主机并输出,因此它会访问主机的IP堆栈。当你使用macvlan时,唯一的ip堆栈是容器中的堆栈,因此永远不会调用主机上的iptables规则。
唯一的方法是更改 容器内的iptables规则。
如果您不想让容器访问,例如如果你想控制容器,那么从主机本身使用ip netns exec ...
,它将控制容器中的iptables规则而不给容器本身控制。
我写了一个脚本来做到这一点。它可以在https://github.com/deitch/ctables和麻省理工学院获得许可。