Docker for Mac下禁用容器出站连接及相关网络接口疑问
Docker for Mac下禁用容器对外出站连接&网络接口说明
一、禁用容器对外出站连接的两种方法
方法1:使用Docker自定义内部网络(推荐,无需操作虚拟机)
这种方式最省心,不用深入到xhyve虚拟机内部,直接通过Docker原生网络功能就能实现隔离:
- 创建一个仅支持容器内部通信的隔离网络:
docker network create --internal --subnet 172.18.0.0/16 no-internet--internal参数会让这个网络完全切断与外部的连接,容器之间可以正常通信,但无法访问主机或外网资源。 - 启动容器时指定该网络即可:
用这个网络启动的容器彻底没有对外出站能力,而且Docker重启后配置依然有效。docker run -it --network no-internet your-image-name
方法2:进入xhyve虚拟机配置iptables(适合细粒度控制场景)
Docker for Mac的iptables规则是在xhyve虚拟机内部生效的,所以需要先进入虚拟机操作:
- 连接到xhyve虚拟机的终端:
进入后输入screen ~/Library/Containers/com.docker.docker/Data/vms/0/ttyroot(无密码)就能登录虚拟机系统。 - 添加iptables规则阻断出站流量:
- 先保留容器间通信(不需要的话可跳过):
iptables -A FORWARD -i docker0 -o docker0 -j ACCEPT - 拒绝所有从docker0接口流向外部的流量:
iptables -A FORWARD -i docker0 ! -o docker0 -j DROP
- 先保留容器间通信(不需要的话可跳过):
- 注意:xhyve虚拟机重启后这些规则会丢失,虽然可以导出规则做持久化,但Docker for Mac的虚拟机经常自动重启,所以还是方法1更实用。
二、关于Docker for Mac的网络接口关联
你看到的en0是Mac主机的物理无线网卡,而xhyve虚拟机和Mac主机之间的直接通信是通过虚拟接口vmenet0(可以在Mac主机上用ifconfig命令查看)。
简单梳理下流量路径:
容器的流量先到虚拟机内部的docker0网桥,再通过虚拟机的虚拟网卡转发到Mac主机的vmenet0,最后Mac主机通过en0(或其他物理网卡)将流量发送到外网。所以nettop显示Docker使用en0,是因为虚拟机的出站流量最终走的是主机的物理网卡,而虚拟机与主机的内部通信依赖vmenet0完成。
内容的提问来源于stack exchange,提问作者captain
相关产品推荐
相关产品推荐

