You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

KVM虚拟机手动桥接网络创建及多场景配置技术咨询

KVM虚拟机手动桥接网络创建及多场景配置技术咨询

嘿,我来一步步帮你搞定这些KVM网络配置的问题,都是实际操作过的经验,放心参考~

1. 手动创建带主机IP的桥接接口br0

brctl确实是可行的,但现在更推荐使用ip命令(更现代,也是当前主流工具),我给你两种配置方式,覆盖临时生效和开机持久化的需求:

  • 临时配置(重启主机后失效)

    1. 创建桥接口:ip link add name br0 type bridge
    2. 激活桥接口:ip link set br0 up
    3. 给桥分配静态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定义桥接网络(强烈推荐)

    1. 先写一个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>
    
    1. 用Virsh命令定义这个网络:virsh net-define br0-network.xml
    2. 启动这个网络:virsh net-start br0-network
    3. 设置开机自动启动:virsh net-autostart br0-network
      之后你创建虚拟机的时候,选择这个br0-network作为网络接口,Libvirt会自动创建对应的vnetX接口并挂载到br0上,完全不用手动操作。
  • 方法二:手动挂载已有vnetX到br0
    如果是已经创建好的虚拟机,可以先关掉VM,然后手动把它的vnet接口加到桥:

    1. 找到VM对应的vnet接口(比如vnet1):ip link show
    2. 将接口挂载到br0:brctl addif br0 vnet1 或者 ip link set vnet1 master br0
    3. 激活vnet接口:ip link set vnet1 up
      不过这种方法虚拟机重启后可能需要重新操作,所以还是优先用Libvirt的配置方式。

3. 为VM配置NAT模式的互联网连通性

要让br0上的VM通过主机访问外网,需要完成两步:开启主机IP转发,配置NAT规则:

  1. 临时开启IP转发(重启后失效)
    执行echo 1 > /proc/sys/net/ipv4/ip_forward

  2. 持久化开启IP转发
    编辑/etc/sysctl.conf,找到net.ipv4.ip_forward=1这一行,去掉前面的注释符#,然后执行sudo sysctl -p让配置生效。

  3. 配置iptables NAT规则
    假设主机的外网接口是eth0(你要换成自己实际的物理外网接口,比如ens33wlan0),执行以下命令:

    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

火山引擎 最新活动