在虚拟化的世界里,网络连接如同现实世界的道路系统,而LinuxBridge就是那座关键的桥梁。本文将带你亲手搭建这座桥梁,让KVM虚拟机畅通无阻。
在动手配置前,我们需要理解几个关键概念:
KVM (Kernel-based Virtual Machine)
/dev/kvm
接口直接使用硬件虚拟化扩展LinuxBridge
brctl
或ip link
命令管理TAP设备
grep -E 'vmx|svm' /proc/cpuinfo
)# Ubuntu/Debian
sudo apt install qemu-kvm libvirt-daemon-system virtinst bridge-utils
# RHEL/CentOS
sudo yum install qemu-kvm libvirt virt-install bridge-utils
组件 | 名称 | IP地址 | 说明 |
---|---|---|---|
物理接口 | enp3s0 | DHCP | 主机物理网卡 |
网桥 | br0 | 192.168.1.50/24 | 主桥接接口 |
虚拟机1 | vm01 | 192.168.1.51/24 | 测试机1 |
虚拟机2 | vm02 | 192.168.1.52/24 | 测试机2 |
# 创建网桥
sudo brctl addbr br0
# 绑定物理接口
sudo brctl addif br0 enp3s0
# 配置IP并启用
sudo ip addr add 192.168.1.50/24 dev br0
sudo ip link set dev br0 up
# 释放物理接口IP
sudo ip addr flush dev enp3s0
# /etc/netplan/01-netcfg.yaml
network:
version: 2
renderer: networkd
bridges:
br0:
interfaces: [enp3s0]
addresses: [192.168.1.50/24]
gateway4: 192.168.1.1
nameservers:
addresses: [8.8.8.8, 1.1.1.1]
parameters:
stp: true
forward-delay: 4
应用配置:
sudo netplan apply
virt-install \
--name=ubuntu-vm \
--vcpus=2 \
--memory=2048 \
--disk path=/var/lib/libvirt/images/ubuntu.qcow2,size=20 \
--os-variant=ubuntu22.04 \
--network bridge=br0,model=virtio \
--graphics spice \
--cdrom /path/to/ubuntu-22.04.iso
<interface type='bridge'>
<mac address='52:54:00:4a:5f:3d'/>
<source bridge='br0'/>
<model type='virtio'/>
<address type='pci' domain='0x0000' bus='0x01' slot='0x00' function='0x0'/>
interface>
# 创建接口XML文件
cat > bridge-intf.xml <<EOF
<interface type='bridge'>
<source bridge='br0'/>
<model type='virtio'/>
</interface>
# 附加到虚拟机
virsh attach-device vm01 bridge-intf.xml --persistent
$ brctl show br0
bridge name bridge id STP enabled interfaces
br0 8000.00155d8e4f01 yes enp3s0
vnet0
vnet1
# 在虚拟机内
ip addr show ens3 # 确认IP分配
ping 192.168.1.1 # 测试网关
ping 8.8.8.8 # 测试外网
# 在宿主机
virsh domiflist vm01 # 列出虚拟机接口
bridge fdb show br0 # 查看MAC地址表
# 创建VLAN接口
sudo ip link add link br0 name br0.100 type vlan id 100
# 配置VLAN接口
sudo ip addr add 192.168.100.1/24 dev br0.100
sudo ip link set br0.100 up
<interface type='bridge'>
...
<bandwidth>
<inbound average='1024' peak='2048' burst='2048'/>
<outbound average='1024' peak='2048' burst='2048'/>
bandwidth>
interface>
brctl show
确认TAP设备已连接dmesg | grep vnet
查看内核日志# 1. 检查iptables规则
sudo iptables -L -n -v
# 2. 允许网桥流量转发
sudo sysctl net.bridge.bridge-nf-call-iptables=0
# 3. 验证NAT配置(如使用)
sudo iptables -t nat -L POSTROUTING
# 启用巨帧(需全线支持)
sudo ip link set dev br0 mtu 9000
# 调整缓冲区大小
sudo sysctl -w net.core.netdev_max_backlog=30000
sudo sysctl -w net.core.rmem_max=16777216
STP保护:防止环路导致网络瘫痪
brctl stp br0 on # 启用生成树协议
brctl setfd br0 4 # 设置转发延迟
MAC过滤:限制非法设备接入
# 启用MAC地址过滤
brctl setageing br0 300
brctl setfd br0 4
防火墙策略:隔离虚拟机流量
# 仅允许已建立的连接进入
iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
# 限制ICMP洪水攻击
iptables -A FORWARD -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT
启用SR-IOV(需硬件支持)
# 检查SR-IOV能力
lspci -vs 0000:03:00.0 | grep SR-IOV
# 启用VF(虚拟功能)
echo 8 > /sys/class/net/enp3s0/device/sriov_numvfs
使用vhost_net加速
<interface type='bridge'>
...
<driver name='vhost' queues='4'/>
<model type='virtio'/>
interface>
多队列virtio-net
# 虚拟机内核参数
ethtool -L eth0 combined 4
通过本文的详细指南,你已经掌握了:
附录:推荐工具清单
tcpdump
, wireshark
, iperf3
virt-manager
, cockpit-machines
netplan
, nmcli
iftop
, nload
, vnstat