虚拟化与主机网络
概述
本章给出 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)。示例展示:
将 VM 桥接到既有 LAN(或 trunk)。
用
vether0构建带可选 NAT 的隔离路由网络。用 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,按你的策略在 bridge0 或 em1 上配置 dhcpd(8)(参见服务章节)。
3) 用 vether(4) 与可选 NAT 实现路由客户机
在 vether0 之后为客户机创建隔离的三层网段。主机在 vether0 与上行链路间路由。
为路由网段创建专用网桥,并动态将客户机 tap 加入(客户机启动时 vmd 会添加 tap)。
将第二个 vmd switch 指向 bridge1,并将 VM 附加其上。
启用转发,并按需用 pf.conf(5) 通过 NAT 到上行链路。运行时用 pfctl(8) 管理 PF。
在主机上用绑定到 vether0 的 dhcpd(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=1、vether0地址正确、PF 已加载 NATmatch规则。在$wan与vether0上用tcpdump追踪数据包。锚点未生效。 确认主策略中存在
anchor与load 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)接口。
参见
最后更新于