--network none 并非绝对安全,因默认保留lo接口导致127.0.0.1仍可达;需组合--cap-drop=all、--read-only、--tmpfs及禁用lo才能实现物理级网络隔离。

使用 --network none 是构建物理级网络隔离沙箱最直接有效的方式,但它本身并不等于“绝对安全”——关键在于理解其行为边界,并补足默认残留(如 lo 接口)带来的潜在通路。
None 模式的真实行为:不是“没网络”,而是“仅保留回环”
Docker 的 none 模式会为容器创建独立网络命名空间,但仍默认初始化 loopback 接口(lo),地址为 127.0.0.1。这意味着:
- 容器内
ping 127.0.0.1会成功,curl http://localhost也能通 - 若宿主机服务监听在
0.0.0.0:端口,且容器内进程主动发包到127.0.0.1:端口,该流量不经过 docker0 网桥,而是走宿主机内核的本地回环路径,可能意外打通 - 因此,“物理隔离”需主动移除或禁用 lo,而非仅依赖
--network none
彻底切断回环通路的实操组合
要真正实现网络层面的物理隔离,推荐以下三步组合操作:
-
启动时禁用全部能力:用
--cap-drop=ALL移除所有 Linux 能力,防止容器内进程自行启用网络栈 -
关闭只读保护外的可写路径:添加
--read-only并配合--tmpfs /run --tmpfs /tmp,避免通过临时文件绕过限制 -
屏蔽 hosts 解析干扰:挂载空文件覆盖
/etc/hosts,例如-v /dev/null:/etc/hosts,防止 localhost 被重定向
完整命令示例:
docker run -d --network none --cap-drop=ALL --read-only --tmpfs /run --tmpfs /tmp -v /dev/null:/etc/hosts nginx进阶加固:运行时移除 lo 接口(适用于必须保留基础网络栈的场景)
若容器需保留部分网络功能(如绑定内部端口),但又必须阻断对宿主机 127.0.0.1 的访问,可在启动后进入 netns 手动处理:
- 获取容器 PID:
PID=$(docker inspect -f '{{.State.Pid}}' <container_name>)</container_name> - 关闭回环接口:
nsenter -t $PID -n ip link set dev lo down - (可选)彻底删除 lo:
nsenter -t $PID -n ip link delete lo—— 注意:此举将导致localhost解析失败、ping 127.0.0.1返回 Network is unreachable
配合其他隔离维度,形成纵深防御
纯网络隔离只是沙箱的一环。真正安全的 AI Agent 或代码执行沙箱还需叠加:
-
文件系统隔离:用
--read-only+--tmpfs限制写入,避免敏感文件被篡改或泄露 -
资源限制:添加
--memory=512m --cpus=1 --pids-limit=30防止 fork 炸弹或内存耗尽 -
用户命名空间映射:启用
--userns-remap,使容器内 root 映射为宿主机非特权用户 -
禁用特权模式:确保未使用
--privileged或--cap-add=NET_ADMIN等高危参数











