读者来信
作者:Michael W Lucas

亲爱的 “摸电脑的” 建议专栏作家: FreeBSD 的 Jail 有几种不同的联网方式。我该如何决定用哪一种? ——困惑又苦恼的人
亲爱的 BAD:
我写这篇文字时正在 BSDCan 2025 现场。我们头顶上两层楼,有人在用冲击钻。钻头穿过混凝土建筑时震动发生偏移,频率恰好与人牙齿的共振频率一致。后来才发现,这位 “冲击钻先生” 需要证明自己在干活,才能拿到那天 50 块的工钱。我给了他 60 块,让他收工回家。别担心,这笔意外开支没影响我的 gelato 基金;我从大会经费里挪用了这笔钱。
这件事之所以落到我头上,仅仅是因为我躲闪得不够快,他们让我当了大会主席,这说明社区的某些部分需要更好的领袖选拔机制。被 “征召” 让我既困惑又苦恼。
关键是,我们都困惑又苦恼。只是困惑和苦恼的事情不同罢了。
Jail 联网是那种看起来简单、一动才发现处处是坑的话题。无论你用哪种虚拟化系统——Jail、bhyve 或某些更次要的系统——都要面对类似的抉择。Jail 可以共享宿主机的网络栈,也可以拥有自己的网络栈。在共享栈下,Jail 可以有自己的地址,或绑定到 loopback 接口上的私有地址,通过 NAT 访问外部世界。你还可以用 VNET 给 Jail 一个完整的网络栈。这几种方式都是灾难,但每种灾难都有独特的特性,可能让它更适合你的场景。
记住,Jail 是一个谎言。
Jail 自认为是一个完整的操作系统,期望对它访问的任何网络都拥有完全控制权。如果你给 Jail 分配一个 IP(公网或私网),Jail 就会认为自己完全掌控了那个地址。Jail 的 rc.conf 中并不包含配置接口的信息。在共享栈下,宿主机可以对 Jail 的网络为所欲为。想在 Jail 里运行 sshd(8)?默认情况下,SSH 守护进程会监听系统上每个 IP 地址。你必须重新配置才能改变这一行为。这不难,但很容易被忽视。同样,如果你想让多个 Jail 运行同一个数据库服务器?它们不能都用同一个端口和 IP 地址。你需要做的管理工作量,与共享该网络栈的 Jail 数量成正比。
既然如此,何不给每个 Jail 自己的网络栈?因为更复杂。你必须在宿主机上创建一个 bridge,然后为每个 Jail 创建一个虚拟接口。接口的一端进入 Jail;另一端插入 bridge。每多一层复杂,就多一次闪亮的失败机会。
VNET 的好处在于,每个 Jail 真正掌控自己的 IP 地址。你必须在 Jail 的 rc.conf 中设置它,并可以让每个服务独占那个地址。
VNET Jail 也不完全像宿主机。最常见的接口是 epair(4)。你无法在 epair 上抓包;如果想调试网络或捕获 netflow,必须在宿主机上做。你可能觉得 netflow 是网络管理员才关心的事,但并非如此。Netflow 什么问题都不解决,却能识别一切。如果我写 netflow 那本书时用的是 nfdump 而不是 flow tools,那本书现在还有用;可惜我在做糟糕选择方面天赋异禀,比如以系统管理为业。我不是说懂得 promiscuous mode、fdisk 或窗口缩放就会让人痛苦,但我敢说,快乐的人对这些一无所知。总之,epair 接口上用不了 promiscuous mode。提前规划。
共享栈 Jail 和 VNET Jail 都可以用私有或公网地址。如果用私有地址,没有出站 NAT,Jail 就访问不了外部世界。入站连接必须通过 NAT 映射。按照 “系统管理第 19 条定律”,“任何私有地址方案的目的,都是为了增加管理开销。”
你可能会合理地问我选择了哪种方案。我的托管环境有数量有限的公网 IPv4 地址,和一整个 IPv6 /64。我本可以用一种 NAT/直连混合方案,但我没有,我直接宣布某些 Jail 是 IPv6-only,只能访问互联网中 “现代” 的部分。我毫不犹豫地宣布某些人不配连接到我的私有 Port 服务器——反正我那个 /64 之外的人也下载不到。
只用公网地址会简单得多。可惜 IPv4 地址目前零售单价约 55 美元,最少要买 256 个,我挪用不出那么多钱,BSDCan 没那么多预算。
有人知道 EuroBSDCon 的财务状况吗?他们缺大会主席吗?我那位新助手用冲击钻可是一把好手。
想向 Michael 提问? 请发送至 letters@freebsdjournal.org
尽管 Michael W Lucas(https://mwl.io)竭尽全力,仍未能说服 FreeBSD 期刊董事会把他从这个专栏里开除。暂时还没有。他最近的著作是 Run Your Own Mail Server 和 Laserblasted。他的下一本书是 Networking for System Administrators 的第二版,详见 https://mwl.io/n4sa2e
最后更新于