跳转到内容

客户机网络:网卡型号、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 有两个坑

  1. 不要手动填一个和网络里其他设备重复的 MAC,会导致地址冲突,两边网络都不稳定。
  2. 改完之后客户机内部软重启不会生效。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> 看一眼当前的完整配置。

防火墙开关:两层都要打开 ​

客户机防火墙要生效,需要同时满足两个开关,这是最容易踩的坑:

  1. 虚拟机/容器 → Firewall → Options → Firewall: Yes(这台客户机的防火墙总开关)。
  2. 这块网卡本身的 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 设备,不需要模拟硬件型号。防火墙开关和限速逻辑是一致的。

延伸阅读 ​

Proxmox VE 非官方中文使用指南,与 Proxmox Server Solutions GmbH 无隶属关系。