For the complete documentation index, see llms.txt. This page is also available as Markdown.

虚拟化与主机网络

概述

本章给出 OpenBSD 虚拟化的标准网络模式,涉及 vmd(8)vmctl(8):用 bridge(4) 实现二层桥接、用 vether(4) 实现路由分段、用 pf.conf(5) 锚点实现按 VM 分段。虚拟网卡使用 tap(4)。Hypervisor 配置位于 vm.conf(5)。这些模式用于将客户机接入既有 VLAN、提供带 NAT 的隔离路由网络,以及按 VM 实施最小权限网络策略。

设计考量

  • 接入模型。

    • 桥接: VM 出现在既有二层网段上。DHCP 或广播发现须到达客户机时使用。

    • 路由(vether): VM 位于虚拟三层接口之后;由主机路由或 NAT。用于隔离与严格控制。

  • 故障域。 避免不必要地扩展大二层层域。规模部署时优先采用 vether(4) 的路由分段。

  • VLAN。 桥接到 trunk 时,将承载 VLAN 标签的接口加入网桥,使标签透传;若只需单个 VLAN,则改将其 vlan(4) 接口加入网桥。

  • MAC 计数。 上游交换机可能限制学习到的 MAC 数。通过一个物理端口桥接大量 VM 可能超出限制。与交换策略协调,或改用路由接入。

  • 安全姿态。 将每台 VM 视为不可信。用 PF 锚点为每台 VM 应用显式策略,并对同主机 VM 间的流量默认拒绝。

  • 运维。 将 VM 镜像与网络定义纳入版本控制。初次部署时启用详细日志。采用一致的命名方案(例如 switch "lan"switch "dmz")。

配置

主机具有 em0(WAN/上行)与 em1(LAN 或 trunk)。示例展示:

  1. 将 VM 桥接到既有 LAN(或 trunk)。

  2. vether0 构建带可选 NAT 的隔离路由网络。

  3. 用 PF 锚点实施按 VM 策略。

1) Hypervisor 基础设置

为客户机接入创建网桥、定义 vmd switch,并启用 hypervisor。

vm.conf(5) 中定义 vmd switch 与一台简单 VM。switch 将 VM 绑定到 bridge0

创建磁盘并启动 VM(此处省略安装介质;按你的工作流调整)。

2) 既有 LAN(或 VLAN trunk)上的桥接客户机

bridge0 承载 em1、vmd switch 指向 bridge0 时,客户机出现在物理 LAN 上(若 em1 为 trunk,则出现在所有穿越 em1 的 VLAN 上)。若须向客户机暴露单个 VLAN,则改将该 VLAN 接口加入网桥:

由既有基础设施提供 DHCP 或静态地址。若要在本地为桥接客户机提供 DHCP,按你的策略在 bridge0em1 上配置 dhcpd(8)(参见服务章节)。

3) 用 vether(4) 与可选 NAT 实现路由客户机

vether0 之后为客户机创建隔离的三层网段。主机在 vether0 与上行链路间路由。

为路由网段创建专用网桥,并动态将客户机 tap 加入(客户机启动时 vmd 会添加 tap)。

将第二个 vmd switch 指向 bridge1,并将 VM 附加其上。

启用转发,并按需用 pf.conf(5) 通过 NAT 到上行链路。运行时用 pfctl(8) 管理 PF。

在主机上用绑定到 vether0dhcpd(8) 为路由客户机提供地址(参见服务章节),或在 10.50.0.0/24 中配置静态地址。

4) 用 PF 锚点实现微分段(按 VM 策略)

用 PF 锚点隔离客户机,并使按 VM 的规则保持小而可审计。

主策略:

按 VM 的策略文件:

加载并验证:

维护 VM 名称到 tap 接口的映射(来自 vmctl status)并在锚点文件中体现,或在 VM 部署时用模板生成锚点。

验证

  • Hypervisor 状态,使用 vmctl(8)

  • 桥接与成员,使用 ifconfig(8)

  • 路由与 NAT

  • 在线检查,使用 tcpdump(8)

故障排查

  • 桥接网络上客户机无法获取 DHCP。 确认 bridge0 中接口正确(trunk 用 em1,单 VLAN 用对应 vlan(4))。确保上游 DHCP 服务器可达该网段,且 PF 未阻断 BOOTP。

  • 路由客户机无连通性。 核对 net.inet.ip.forwarding=1vether0 地址正确、PF 已加载 NAT match 规则。在 $wanvether0 上用 tcpdump 追踪数据包。

  • 锚点未生效。 确认主策略中存在 anchorload anchor 行,且按 VM 的文件可编译。用 pfctl -a 'vm/*' -sr 检查。

  • VM 接入错误网络。 检查 vm.conf 中的 switch 段与 VM 定义中的 interface { switch "…" } 块。更改接入后须重载 vmd 或重启 VM。

  • 上游交换机 MAC 数超限。 减少该端口的桥接客户机,或将工作负载迁移到路由 vether0 模式。

  • VLAN 标签未保留。 传递多个 VLAN 时,桥接物理接口(例如 em1)而非单个 vlan(4) 子接口。仅暴露一个 VLAN 时,只桥接该 vlan(4) 接口。

参见

最后更新于