• 欢迎访问伊栖物联网社区,聚焦物联网技术和解决方案QQ群:735553309
  • ,从传感器到片上嵌入式系统,无线接入,边缘计算,在这里您可以讨论一切
  • 参加最新的物联网研讨会报名
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏伊栖Eccee

更改KVM默认的网桥

其它 peyoot 3年前 (2021-07-24) 1442次浏览 0个评论

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

后记: 如果用无线网卡来当网桥接口,该如何操作呢,网上已经有人做一些探讨:

付费查看内容

已有1人支付


ECCEE版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:更改KVM默认的网桥
喜欢 (1)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址