首先,这是不是出于安全原因或在生产环境中使用。这是因为我想在相对低规格的工作站上使用不同的配置管理系统,而不使用 VM(时间和资源开销)或 LXC(版本要求和不必要的复杂性)。 Chroot 相对不安全,但设置起来也快速且轻松。
不管怎样:给定一个 chroot 环境和一个虚拟以太网接口(eth0:1 等),我如何确保 chroot 中的程序始终使用虚拟接口?
请注意,我不需要真正的网络隔离,即在 chroot 内部看不到真正的接口。我只希望 chroot 程序能够响应与主机(或其他 chroot)不同的 IP 地址,这样我就可以正确使用服务器/客户端设置,例如 Puppet。
主机运行 Debian Wheezy x64。
也许我的处理方式是错误的。我想要的是拥有多个 chroot,并且能够通过主机系统的主机名访问每个 chroot。那可能吗?
答案1
Chroot 在这里没有帮助。它只影响文件名,不影响网络和其他功能。
现代版本的 Linux 提供了一种逐步虚拟化环境某些方面的方法,通过命名空间。除了传统的文件名虚拟化chroot
(因此 chroot 进程不会看到 chroot 之外的文件)之外,您还可以虚拟化进程 ID(因此 PID 命名空间内的进程将无法向命名空间外的进程发送信号或跟踪)、用户(因此用户命名空间内的用户 1234 独立于命名空间外的用户 1234)等。您感兴趣的是网络命名空间,其中进程有自己的网络接口、IP 地址、路由等。
我推荐阅读Michael Kerrisk 撰写的优秀 LWN 文章系列,至少有介绍和文章网络命名空间。
网络命名空间自内核 2.6.29 起就已存在(早期版本中提供了部分实现),因此它们可在除 RHEL5/CentOS5 之外的所有当代发行版上使用。从内核 3.8 开始,您甚至可以将网络命名空间与用户命名空间结合起来,并在命名空间内执行网络设置,而无需在命名空间外拥有 root 权限;对于早期的内核,例如 wheezy 的 3.2,您首先需要主机系统中的 root 访问权限才能创建用户命名空间。用户态工具的出现比内核功能要慢,因此许多当前系统不具备充分利用内核功能的所有工具。 Debian wheezy 附带unshare
,这足以创建该名称空间,但缺少 shell 包装nsenter
器setns
在主机的命名空间内进行操作(它7月进入不稳定状态)。
看在 Linux 上“离线”(无外部网络)运行子进程的命令创建网络命名空间的简单示例。斯科特·劳的博客有更详细的教程。
答案2
回答:据我通过相当广泛的谷歌搜索得知,chroot 中缺乏网络命名空间实际上使得这成为不可能。您无法通过任何方式为 chroot 环境分配其自己的 IP、其自己的主机名或 FQDN 或类似的任何内容。
Chroot 对于保护单个程序或守护进程非常有用。对于创建任何类型的隔离测试系统来说,它似乎几乎毫无用处。