外观
客户机网络:网卡型号、MAC、防火墙开关与限速
创建虚拟机时网络那一页只有寥寥几项,但每一项背后都有取舍。这篇把网卡型号、MAC 地址、每客户机的防火墙开关和限速讲清楚,容器(LXC)的网络配置逻辑基本一致,会在文中标注差异。
改网卡配置会打断这台客户机的网络
本文涉及的操作只影响这一台客户机,不会影响宿主机或其他客户机。但改动生效的方式不同:改防火墙、限速等大多数参数即时生效;改型号或 MAC 地址需要重启这台客户机的网卡(虚拟机层面的重启,客户机内部软重启通常不够)才能生效。给生产中的客户机改配置前,先在测试虚拟机上验证一遍。
网卡配置存在哪里
虚拟机的网卡定义在 /etc/pve/qemu-server/<vmid>.conf 里的 netN 一行,例如:
text
net0: virtio=BC:24:11:AA:BB:CC,bridge=vmbr0,firewall=1,queues=4,rate=12.5容器对应 /etc/pve/lxc/<ctid>.conf 里的 netN,字段含义类似,但用的是 veth 而不是 tap 设备,因此没有型号选项(容器和宿主机共享内核,不需要模拟网卡硬件)。
网卡型号怎么选
| 型号 | 说明 | 适合 |
|---|---|---|
| VirtIO (paravirtualized) | 半虚拟化网卡,性能最好,CPU 开销最低 | 默认首选,前提是客户机有驱动 |
| E1000 | 模拟 Intel 82540EM 真实网卡 | 老系统、安装器认不出 VirtIO 时临时用 |
| Realtek RTL8139 | 模拟更老的网卡 | 极老的系统,基本用不到 |
装系统时如果认不到 VirtIO 网卡,可以先用 E1000 把系统装好,装完驱动后再改回 VirtIO。Windows 客户机需要装 VirtIO 驱动,装驱动和改型号是两回事:先装驱动,确认系统认出网卡,再把型号切回 VirtIO 并重启。
MAC 地址
MAC 地址由 PVE 自动生成,一般不需要手动改。需要改的场景通常是:某些软件按 MAC 做许可证绑定,或者要让 DHCP 服务器给固定 IP。
改 MAC 有两个坑
- 不要手动填一个和网络里其他设备重复的 MAC,会导致地址冲突,两边网络都不稳定。
- 改完之后客户机内部软重启不会生效。MAC 是虚拟硬件层面的属性,必须把这台虚拟机整个关机再开机(Stop 之后 Start,而不是客户机内部的 reboot)才会应用新值。
用 Web UI 改比手动编辑配置文件安全,因为命令行方式改 netN 是整行替换:
sh
# 宿主机 shell,示例:把 net0 的 MAC 改掉,同时保留原有的 bridge 和 firewall 设置
qm set <vmid> -net0 virtio=DE:AD:BE:EF:00:01,bridge=vmbr0,firewall=1漏写原来的 bridge、firewall 等字段会把它们重置成默认值,改之前先用 qm config <vmid> 看一眼当前的完整配置。
防火墙开关:两层都要打开
客户机防火墙要生效,需要同时满足两个开关,这是最容易踩的坑:
- 虚拟机/容器 → Firewall → Options → Firewall: Yes(这台客户机的防火墙总开关)。
- 这块网卡本身的 Firewall 勾选框(每个
netN单独一个开关,对应配置里的firewall=1)。
任何一个没开,这块网卡的流量都不会经过防火墙规则。而且这还只是客户机这一层——完整的三级开关(数据中心 / 节点 / 客户机)机制见PVE 防火墙:三级开关与默认策略。
只想限制某块网卡能用哪些 IP
不需要写复杂规则,给这块网卡挂一个 IP 集合(IP Set)就够:
text
# /etc/pve/firewall/<vmid>.fw
[IPSET ipfilter-net0]
192.168.2.10命名成 ipfilter-netN 的 IP 集合会被识别成对应网卡的白名单,只放行列出的地址。适合防止客户机被劫持后伪造源地址。
限速
rate 参数限制这块网卡的速率,作用在 tap 设备上,和接到哪个网桥无关:
text
net0: virtio=BC:24:11:AA:BB:CC,bridge=vmbr0,rate=10单位是 MB/s(字节),不是 Mb/s(比特)
Web UI 和配置文件里的 rate 单位是兆字节每秒。填 10 表示限速 10 MB/s,换算成通常说的网速大约是 80 Mbps。这是最常见的误解,配置之前先想清楚你要的是哪个单位。
多队列(Multiqueue)
queues 参数让虚拟网卡使用多个队列并行处理流量,能提升高并发场景下的吞吐,代价是多占用一些 CPU:
text
net0: virtio=BC:24:11:AA:BB:CC,bridge=vmbr0,queues=4队列数不是越多越好
经验上限是这台客户机的 vCPU 核心数。给 2 核的虚拟机配 8 个队列不会有额外收益,反而增加调度开销。Web UI 上限制在 8,需要更高时才需要直接编辑配置文件。
检查结果
sh
# 宿主机 shell,确认配置已生效
qm config <vmid> | grep ^net
# 确认限速真的作用在 tap 设备上(<num> 是网卡序号,从 0 开始)
tc class show dev tap<vmid>i<num>客户机内部(Linux 为例):
sh
ip link show eth0
ethtool -l eth0 # 确认多队列数量改完型号或 MAC 之后,完整关机再开机一次,确认客户机能重新拿到 IP、能 ping 通网关。改了限速的话,用 iperf3 或类似工具实测一次,确认速率确实被限制在预期范围,而不是配完就假设生效。
常见问题
开了防火墙但完全不生效。 检查两层开关:客户机总开关 + 这块网卡的 Firewall 勾选框,两个都要开。
限速看起来没起作用。 先确认单位理解对了(MB/s 不是 Mb/s),再用 tc class show 确认规则确实挂在了 tap 设备上;Open vSwitch 网桥下限速功能在个别版本有已知问题,遇到异常可以先换回 Linux Bridge 排查。
改了 MAC 之后客户机拿不到网络。 检查是否只做了客户机内部的软重启——MAC 变更需要虚拟机整个 Stop/Start。另外确认新 MAC 没有和网络里其他设备冲突。
多队列设置后网络反而变慢或不稳定。 队列数超过了 vCPU 数,或者客户机操作系统没有正确识别多队列,先把队列数调回默认(不设置该参数)观察。
容器(LXC)网络没有型号选项。 这是正常的,容器共享宿主机内核,网卡是 veth 设备,不需要模拟硬件型号。防火墙开关和限速逻辑是一致的。