如何通过 Linux 桥接器上的特定物理接口路由所有 VM 流量?

如何通过 Linux 桥接器上的特定物理接口路由所有 VM 流量?

我的目标是让所有 KVM 客户虚拟机使用子网上em2的地址发送和接收流量192.168.2.0/24

我有一台带有多张 NIC 的主机 Linux 机器(CentOS 7),其中 2 张在本场景中使用,em1并且em2

em1 接口的 IP 为192.168.0.131。该em2接口已连接到br0,因此它本身没有 IP,但br0已分配 IP 地址192.168.2.1

我已经在我的 Netgear 防火墙上创建了一条路由来引导192.168.2.0/24流量,192.168.2.1但是这个地址并没有像以前那样显示为附加设备192.168.0.131,可能是因为它是一个虚拟 Linux 桥。

从主机 VM,我可以 ping 通“桥接网关”、VM 客户机以及防火墙网关到互联网:

[root@boss ~]# ping -c1 192.168.2.1
64 bytes from 192.168.2.1: icmp_seq=1 ttl=64 time=0.085 ms

[root@boss ~]# ping -c1 192.168.2.10
64 bytes from 192.168.2.10: icmp_seq=1 ttl=64 time=0.476 ms

[root@boss ~]# ping -c1 192.168.0.254
64 bytes from 192.168.0.254: icmp_seq=1 ttl=64 time=4.17 ms

从客户虚拟机,我可以 ping 通em1,但不能 ping 通互联网网关192.168.0.254

[root@localhost ~]# ping -c1 192.168.0.131
64 bytes from 192.168.0.131: icmp_seq=1 ttl=64 time=0.282 ms

[root@localhost ~]# ping -c1 192.168.0.254
PING 192.168.0.254 (192.168.0.254) 56(84) bytes of data.

--- 192.168.0.254 ping statistics ---
1 packets transmitted, 0 received, 100% packet loss, time 0ms

这是我的配置em2

DEVICE=em2
TYPE=Ethernet
ONBOOT=yes
BRIDGE=br0

br0

DEVICE=br0
BOOTPROTO=none
ONBOOT=yes
TYPE=Bridge
IPADDR=192.168.2.1
PREFIX=24
GATEWAY=192.168.0.254
ZONE=public
STP=no

我的虚拟机主机上的路由表:

[root@boss ~]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.0.254   0.0.0.0         UG    0      0        0 em1
192.168.0.0     0.0.0.0         255.255.255.0   U     0      0        0 em1
192.168.2.0     0.0.0.0         255.255.255.0   U     0      0        0 br0

客户虚拟机启动如下virt-install

virt-install \
  --name vm-guest-1 \
  --network bridge=br0 \
  --virt-type kvm \

客户虚拟机eth0

DEVICE="eth0"
BOOTPROTO="none"
ONBOOT="yes"
TYPE="Ethernet"
IPADDR="192.168.2.10"
NETMASK=255.255.255.0

客户虚拟机路由表如下:

[root@localhost ~]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.2.1     0.0.0.0         UG    0      0        0 eth0
192.168.2.0     0.0.0.0         255.255.255.0   U     0      0        0 eth0

根据要求,我的主桥输出:

[root@boss ~]# brctl show
bridge name     bridge id           STP enabled    interfaces
br0             8000.d4ae529de039   no             em2
                                                   vnet0

疑问/问题:

我该如何/为什么无法路由到我的客户虚拟机,或者更确切地说,为什么我的客户虚拟机无法连接到互联网?

答案1

你基本上有两个选择:

  1. 在您当前的配置中vnet0,并且em2是桥接的,因此虚拟机无需路由即可访问 Netgear 设备。您只需为虚拟机分配一个地址192.168.0.0/24或使用 DHCP。
  2. 如果需要路由,请从em2网桥中移除接口并在 中为其分配一个地址192.168.0.0/24。然后将新路由表添加到/etc/iproute2/rt_tables

    100 vms
    

    现在为您的虚拟机添加路由表选择规则和默认路由:

    ip route add default dev em2 via 192.168.0.254 table vms
    ip rule add iif br0 table vms
    

    此外,您还需要修改 Netgear 设备上的静态路由以指向em2的地址。

编辑:在第二种配置中,来自虚拟机的以太网帧不会泄漏到物理网络上。仅当需要从网桥(即虚拟客户机)路由某些内容并通过(主表中的默认路由)发送流量时,才会选择附加路由br0表。您可以使用以下命令一次查看所有路由表:em2em1

ip route show table all

您可以在以下位置阅读有关路由表的更多信息Linux 的 IP 层网络管理指南

相关内容