github编辑

12.2 命名空间

命名空间(Namespace)是 Linux 内核的一个强大特性,为容器提供了隔离的运行环境。

12.2 什么是 Namespace

Namespace 是 Linux 内核提供的资源隔离机制,它让容器内的进程仿佛运行在独立的操作系统中。 Namespace 是容器技术的核心基础之一。它回答了一个关键问题:如何让一个进程 “以为” 自己独占整个系统?

spinner

12.2.1 Namespace 的类型

Linux 内核提供了以下几种 Namespace,Docker 容器使用了全部:

Namespace
隔离内容
容器中的效果

PID

进程 ID

容器内 PID 从 1 开始,看不到其他容器和宿主机进程

NET

网络栈

独立的网卡、IP 地址、端口、路由表

MNT

挂载点

独立的文件系统视图,自己的根目录

UTS

主机名

独立的主机名和域名

IPC

进程间通信

独立的信号量、消息队列、共享内存

USER

用户/组 ID

容器内的 root 可以映射为宿主机的普通用户

Cgroup

Cgroup 根目录

隔离 cgroup 层级视图 (Linux 4.6+)


12.2.2 PID Namespace

PID Namespace 负责进程 ID 的隔离,使得容器内的进程彼此不可见。

PID 的作用

隔离进程 ID,让每个容器有自己的进程编号空间。

PID 隔离效果

运行以下命令:

PID 关键点

  • 容器内的 PID 1 进程特殊重要——它是容器的主进程,退出则容器停止

  • 容器内无法看到宿主机或其他容器的进程

  • 宿主机可以看到所有容器内的进程 (但 PID 不同)


12.2.3 NET Namespace

NET Namespace 负责网络栈的隔离,包括网卡、路由表和 iptables 规则等。

NET 的作用

隔离网络栈,每个容器拥有独立的网络环境。

NET 隔离效果

如下代码块所示,展示了相关示例:

spinner

NET 关键点

  • 每个容器有独立的网卡、IP、路由表、iptables 规则

  • 多个容器可以监听相同端口 (如都监听 80)

  • Docker 使用 veth pair 连接容器网络和宿主机网桥


12.2.4 MNT Namespace

MNT Namespace 负责文件系统挂载点的隔离,确保容器看到独立的文件系统视图。

MNT 的作用

隔离文件系统挂载点,每个容器有自己的根目录。

MNT 隔离效果

如下代码块所示,展示了相关示例:

与 chroot 的区别

相关信息如下表:

特性
chroot
MNT Namespace

安全性

可以逃逸

更安全

挂载隔离

完全隔离

/proc/mounts

共享

独立


12.2.5 UTS Namespace

UTS Namespace 主要用于隔离主机名和域名。

UTS 的作用

隔离主机名和域名,让每个容器可以有自己的主机名。

UTS 隔离效果

运行以下命令:

UTS = “UNIX Time-sharing System”,是历史遗留的名称。


12.2.6 IPC Namespace

IPC Namespace 用于隔离进程间通信资源,如 System V IPC 和 POSIX 消息队列。

IPC 的作用

隔离 System V IPC 和 POSIX 消息队列。

隔离的资源

  • 信号量 (semaphores)

  • 消息队列 (message queues)

  • 共享内存 (shared memory)

IPC 关键点

  • 同一容器内的进程可以通过 IPC 通信

  • 不同容器的进程无法通过 IPC 通信 (除非显式共享)


12.2.7 USER Namespace

USER Namespace 允许将容器内的用户 ID 映射到宿主机的不同用户 ID。

USER 的作用

隔离用户和组 ID,实现权限隔离。

USER 隔离效果

如下代码块所示,展示了相关示例:

spinner

安全意义

容器内的 root 用户可以映射为宿主机上的普通用户,即使容器被突破,攻击者在宿主机上也只有普通权限。

💡 笔者建议:生产环境建议启用 User Namespace,增强安全性。


12.2.8 动手实验:体验 Namespace

使用 unshare 命令可以在不使用 Docker 的情况下体验 Namespace:

实验 1:UTS Namespace

运行以下命令:

实验 2:PID Namespace

运行以下命令:

实验 3:NET Namespace

运行以下命令:


12.2.9 Namespace 的局限性

Namespace 提供了隔离但不是安全边界:

方面
说明

共享内核

所有容器共享宿主机内核,内核漏洞可能影响所有容器

部分资源未隔离

/proc、/sys 部分内容仍可见;时间无法隔离

非虚拟化

比虚拟机隔离性弱

需要更强隔离时,可考虑 gVisor、Kata Containers 等安全容器方案。


最后更新于