none模式仅提供网络层面最小隔离,禁用外部接口、仅保留lo,需叠加能力裁剪(如--cap-drop=net_admin/net_raw)、seccomp限制及命名空间封闭才可实现绝对物理隔离。
要让容器真正实现“绝对物理隔离”的沙箱效果,none 模式是起点,但不是终点。它本身只提供网络层面的最小化隔离——禁用所有外部网络接口,仅保留 lo 回环设备。真正的“绝对物理隔离”需叠加命名空间控制、能力裁剪与运行时约束,而非仅靠 --network=none 一条命令。
明确 None 模式的实际隔离边界
启动时加 --network none,Docker 仍会为容器创建独立的 network namespace,但:
- 不创建 veth 设备,不接入任何网桥(如 docker0)
- 不分配 IP 地址,
ip addr只显示lo: 127.0.0.1/8 - 无法访问宿主机网络、其他容器、互联网,也无法被外部访问
- 进程仍可调用 socket 相关系统调用(如
socket(AF_UNIX, ...)),但因无网络设备,绝大多数会失败
补强隔离:关闭网络能力与系统调用
仅靠 None 模式不能阻止容器内进程尝试构造原始包或滥用网络栈。必须配合运行时安全配置:
-
--cap-drop=NET_ADMIN --cap-drop=NET_RAW:禁止配置路由/防火墙、禁止原始套接字(防 ARP 欺骗、端口扫描) -
--security-opt=no-new-privileges:防止进程提权后重新获取网络能力 - 加载精简 seccomp profile,屏蔽
bind、connect、sendto等敏感网络系统调用(适用于纯计算型沙箱)
验证是否达成“绝对隔离”状态
启动后立即检查三项关键指标,缺一不可:
-
docker inspect -f '{{.NetworkSettings.Networks}}'→ 输出应为map[](空映射) -
docker exec ip link show→ 仅含lo,无eth0或其他接口 -
docker exec cat /proc/sys/net/ipv4/ip_forward→ 应为0(确认未启用转发)
延伸加固:配合其他命名空间限制
若目标是完整沙箱(不只是网络),建议组合使用:
-
--ipc=private --uts=private --pid=private:隔离进程间通信、主机名、PID 空间 -
--read-only:挂载根文件系统为只读,防止写入恶意配置 -
--tmpfs /tmp:size=10M,mode=1777:限制临时目录大小与权限 - 避免挂载宿主机敏感路径(如
/proc、/sys、/dev),尤其禁用--privileged










