KVM虚拟机手动桥接网络创建及多场景配置技术咨询
嘿,我来一步步帮你搞定这些KVM网络配置的问题,都是实际操作过的经验,放心参考~
1. 手动创建带主机IP的桥接接口br0
用brctl确实是可行的,但现在更推荐使用ip命令(更现代,也是当前主流工具),我给你两种配置方式,覆盖临时生效和开机持久化的需求:
临时配置(重启主机后失效):
- 创建桥接口:
ip link add name br0 type bridge - 激活桥接口:
ip link set br0 up - 给桥分配静态IP(这里用192.168.100.1/24做例子,你可以换成自己想用的网段):
ip addr add 192.168.100.1/24 dev br0
- 创建桥接口:
持久化配置(重启后保留设置):
如果你用的是Debian/Ubuntu这类基于Netplan的系统,找到Netplan配置文件(通常在/etc/netplan/目录下,比如00-installer-config.yaml),编辑添加以下内容:network: ethernets: # 这里不需要绑定物理网卡,因为我们要做纯虚拟的NAT桥 bridges: br0: addresses: [192.168.100.1/24] interfaces: [] parameters: stp: true forward-delay: 4 dhcp4: false保存后执行
sudo netplan apply让配置生效。要是用RHEL/CentOS这类系统,创建
/etc/sysconfig/network-scripts/ifcfg-br0文件,内容如下:TYPE=Bridge NAME=br0 DEVICE=br0 BOOTPROTO=static IPADDR=192.168.100.1 NETMASK=255.255.255.0 ONBOOT=yes STP=yes DELAY=0然后重启网络服务:
sudo systemctl restart network补充一句:你之前用brctl创建桥的思路完全没问题,只是
ip命令现在是更推荐的标准工具,两种方法都能达到目的。
2. 将虚拟机的vnetX接口接入br0
其实不用手动折腾qemu-bridge-helper或者直接用brctl加接口,通过Libvirt配置是最省心的,还能保证虚拟机重启后自动连接到br0:
方法一:通过Libvirt定义桥接网络(强烈推荐)
- 先写一个XML配置文件(比如命名为
br0-network.xml):
<network> <name>br0-network</name> <forward mode='nat'/> <!-- 这里先配置NAT,后面第三个问题会用到 --> <bridge name='br0'/> <ip address='192.168.100.1' netmask='255.255.255.0'> <dhcp> <range start='192.168.100.10' end='192.168.100.100'/> </dhcp> </ip> </network>- 用Virsh命令定义这个网络:
virsh net-define br0-network.xml - 启动这个网络:
virsh net-start br0-network - 设置开机自动启动:
virsh net-autostart br0-network
之后你创建虚拟机的时候,选择这个br0-network作为网络接口,Libvirt会自动创建对应的vnetX接口并挂载到br0上,完全不用手动操作。
- 先写一个XML配置文件(比如命名为
方法二:手动挂载已有vnetX到br0
如果是已经创建好的虚拟机,可以先关掉VM,然后手动把它的vnet接口加到桥:- 找到VM对应的vnet接口(比如vnet1):
ip link show - 将接口挂载到br0:
brctl addif br0 vnet1或者ip link set vnet1 master br0 - 激活vnet接口:
ip link set vnet1 up
不过这种方法虚拟机重启后可能需要重新操作,所以还是优先用Libvirt的配置方式。
- 找到VM对应的vnet接口(比如vnet1):
3. 为VM配置NAT模式的互联网连通性
要让br0上的VM通过主机访问外网,需要完成两步:开启主机IP转发,配置NAT规则:
临时开启IP转发(重启后失效):
执行echo 1 > /proc/sys/net/ipv4/ip_forward持久化开启IP转发:
编辑/etc/sysctl.conf,找到net.ipv4.ip_forward=1这一行,去掉前面的注释符#,然后执行sudo sysctl -p让配置生效。配置iptables NAT规则:
假设主机的外网接口是eth0(你要换成自己实际的物理外网接口,比如ens33、wlan0),执行以下命令:sudo iptables -t nat -A POSTROUTING -s 192.168.100.0/24 -o eth0 -j MASQUERADE sudo iptables -A FORWARD -i br0 -o eth0 -j ACCEPT sudo iptables -A FORWARD -i eth0 -o br0 -m state --state RELATED,ESTABLISHED -j ACCEPT要是想让iptables规则重启后保留,Ubuntu可以安装
iptables-persistent,然后执行iptables-save > /etc/iptables/rules.v4;RHEL系可以用firewall-cmd或者同样用iptables-save保存规则。额外提醒:如果你用了前面Libvirt定义的网络配置,Libvirt会自动帮你配置这些NAT规则,完全不用手动写,这也是推荐用Libvirt管理网络的一大原因~
4. 确保DHCP请求仅作用于br0上的VM
如果你用的是前面Libvirt配置的br0网络,里面的DHCP服务是专门绑定在br0接口上的,只会监听br0上的DHCP请求,不会干扰主机的其他网络或者物理网络,完全符合你的需求。
要是你是手动配置的DHCP服务(比如用dnsmasq),那一定要指定监听br0接口:
sudo dnsmasq --interface=br0 --dhcp-range=192.168.100.10,192.168.100.100,255.255.255.0,24h
这样dnsmasq只会处理br0上的VM的DHCP请求,不会影响其他设备。
备注:内容来源于stack exchange,提问作者Ranvir




