> For the complete documentation index, see [llms.txt](https://freebsd-journal-cn.bsdcn.org/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://freebsd-journal-cn.bsdcn.org/2025040506-wang-luo/we-get-letters.md).

# 读者来信

作者：Michael W Lucas

![邮箱插图](/files/3oIVGEzO2RKL7rKKQuFe)

亲爱的 “摸电脑的” 建议专栏作家： 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>


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://freebsd-journal-cn.bsdcn.org/2025040506-wang-luo/we-get-letters.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
