KVM会安装一个虚拟网桥,并让所有的虚拟机连上它。这个网络提供自己的子网,并让虚拟机以nat方式访问外网。有时我们希望用一个主机的网桥来代替它,以便虚拟机和宿主机可以在同一个网段相互访问。本文将阐述这一方法的完整过程。
1. 关掉所有虚拟机
操作前确保virsh list –all下没有任何运行着的虚拟机。其实最好是在创建虚拟机之前实现这个网桥,以避免需要对已经存在的虚拟机网络进行修改。
2.配置宿主机网桥的参数
出于性能原因,建议在主机网桥上禁掉Netfilter,有可能需要先加载br_netfilter模块,在/lib/modules/5.4.0-80-generic/kernel/net/bridge下可以找到br_netfilter.ko,
如果需要手动加载该模块
modprobe br_netfilter
(因为稍后有在udev中定义加载模块,所以这个手动命令可以不用)
创建一个文件/etc/sysctl.d/bridge.conf,内容用这些参数:
net.bridge.bridge-nf-call-ip6tables=0 net.bridge.bridge-nf-call-iptables=0 net.bridge.bridge-nf-call-arptables=0
netfilter实际上既可以在L2层过滤,也可以在L3层过滤的,如果net.bridge.bridge-nf-call-iptables=1,也就意味着二层的网桥在转发包时也会被iptables的FORWARD规则所过滤,这样就会出现L3层的iptables rules去过滤L2的帧的问题。所以涉及一些dnat, snat就不生效。所以在网桥中一般会有上面的参数,即要求iptables不对bridge的数据进行处理。
接着我们创建一个文件:/etc/udev/rules.d/99-bridge.rules
添加如下这一行:
ACTION==”add”, SUBSYSTEM==”module”, KERNEL==”br_netfilter”, \ RUN+=”/sbin/sysctl -p /etc/sysctl.d/bridge.conf”
注意必须是一行,这会在启动时在合适的位置设置Netfilter的标记,重启以这些配置生效。
3. 接下来取消KVM安装的默认网络
KVM默认的网络定义在/etc/libvirt/qemu/networks/default.xml,在networks目录下有个autostart子目录,里面有软链接到default.xml上。
原始的内容是自动生成的,比如:
<!-- WARNING: THIS IS AN AUTO-GENERATED FILE. CHANGES TO IT ARE LIKELY TO BE OVERWRITTEN AND LOST. Changes to this xml configuration should be made using: virsh net-edit default or other application using the libvirt API. --> <network> <name>default</name> <uuid>3c846700-cc91-4057-9540-507b6ec45b38</uuid> <forward mode='nat'/> <bridge name='virbr0' stp='on' delay='0'/> <mac address='52:54:00:75:37:63'/> <ip address='192.168.122.1' netmask='255.255.255.0'> <dhcp> <range start='192.168.122.2' end='192.168.122.254'/> </dhcp> </ip> </network>
可以用virsh命令来移除这个default网络,事实上在虚拟机的配置xml文件,也是位于/etc/libvirt/qemu目录下的。
# virsh net-destroy default # virsh net-undefine default
可以用ip addr来检查一下,看virbr0和virbr0-nic网卡项是不是已经消失了。事实上,net-undefine之后,相关网络的xml文件也被移除了。
4. 创建我们要的桥接网络
备份 /etc/netplan/00-installer-config.yaml 来添加网桥,和ethernets项并列:
bridges: br0: macaddress: 52:54:00:75:37:63 interfaces: [wlo1] addresses: gateway4: gateway6: mtu: 1500 nameservers: adresses: [10.10.8.62,1.1.1.1] parameters: stp: true forward-delay: 4 dhcp4: no dhcp6:no
5. 让KVM认这个网桥
创建host-bridge.xml ,插入下面内容:
<network><name>host-bridge</name><forward mode=”bridge”/><bridge name=”br0″/></network>
用下面默认设置虚拟机的默认网络:
# virsh net-define host-bridge.xml # virsh net-start host-bridge # virsh net-autostart host-bridge
用virsh命令检查是否生效
virsh net-list --all
后记: 如果用无线网卡来当网桥接口,该如何操作呢,网上已经有人做一些探讨: