KVM NET设备共享流量



使用linux kvm/qemu,我有一个虚拟机,在主机上显示了两个NICS作为TAP接口:

 -net nic,macaddr=AA:AA:AA:AA:00:01,model=virtio 
 -net tap,ifname=tap0a,script=ifupbr0.sh 
 -net nic,macaddr=AA:AA:AA:AA:00:02,model=virtio 
 -net tap,ifname=tap0b,script=ifupbr1.sh 

在来宾(也运行linux)中,它们配置了不同的子网:

eth0      Link encap:Ethernet  HWaddr aa:aa:aa:aa:00:01  
          inet addr:10.0.0.10  Bcast:10.0.255.255  Mask:255.255.0.0
           UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1

eth1      Link encap:Ethernet  HWaddr aa:aa:aa:aa:00:02  
          inet addr:192.168.0.10  Bcast:192.168.0.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1

路线只能到达预期的地方:

ip route list
default via 10.0.0.1 dev eth0  metric 100 
10.0.0.0/16 dev eth0  proto kernel  scope link  src 10.0.0.10 
192.168.0.0/24 dev eth1  proto kernel  scope link  src 192.168.0.10 

,但KVM似乎并没有以某种方式将其视为与不同的网络有关。如果我追踪各个接口,他们都会看到相同的流量。

例如,如果我在10.0.0.0/16子网上ping,ping -i eth0 10.0.0.1

和同时使用TCPDUMP跟踪两个Tap接口,我看到两个点击接口都可以通过:

sudo tcpdump -n -i tap0a
10:51:56.308190 IP 10.0.0.10 > 10.0.0.1: ICMP echo request, id 867, seq 1, length 64
10:51:56.308217 IP 10.0.0.1 > 10.0.0.10: ICMP echo reply, id 867, seq 1, length 64
sudo tcpdump -n -i tap0b
10:51:56.308190 IP 10.0.0.10 > 10.0.0.1: ICMP echo request, id 867, seq 1, length 64
10:51:56.308217 IP 10.0.0.1 > 10.0.0.10: ICMP echo reply, id 867, seq 1, length 64

对我来说似乎很奇怪,因为很明显,来宾操作系统只会在TAP0A接口上实际发送。

这是预期的行为吗?有没有办法按照我的预期将接口分开?这是我的一些错误配置问题吗?


其他信息,这是两个ifupbr0.sh和ifupbr1.sh脚本:

%cat ifupbr1.sh

#!/bin/sh
set -x
switch=br0
echo args = $*
if [ -n "$1" ];then
        sudo tunctl -u `whoami` -t $1
        sudo ip link set $1 up
        sleep 0.5s
        sudo brctl addif $switch $1
        exit 0
else
        echo "Error: no interface specified"
        exit 1
fi

%cat ifupbr1.sh

#!/bin/sh
set -x
switch=br1
echo args = $*
if [ -n "$1" ];then
        sudo tunctl -u `whoami` -t $1
        sudo ip link set $1 up
        sleep 0.5s
        sudo brctl addif $switch $1
        exit 0
else
        echo "Error: no interface specified"
        exit 1
fi

即使我从BR1脱离了" TAP0B"接口,我也会看到这个问题。它仍然显示我只期望TAP0A的流量。也就是说,即使:

%brctl show

bridge name     bridge id               STP enabled     interfaces
br0             8000.26a2d168234b       no              tap0a
br1             8000.000000000000       no
br2             8000.000000000000       no

看起来我最终回答了自己的问题,但我会为其他任何人记录下来。

显然,这确实是我正在使用的选项的KVM的预期行为。

在此网址:http://wiki.qemu.org/documentation/networking

我发现:

qemu以前使用了-net NIC选项,而不是-Device DevName 和-NET类型而不是-netDev类型。这被认为已过时 由于qemu 0.12,尽管它继续工作。

创建虚拟网络设备的旧语法是:

-net NIC,Model = Model

果然,我正在使用此遗产语法。我认为新的语法更加灵活,但显然实际上具有这种预期的行为:

过时的-NET语法会自动创建一个模拟集线器(称为 qemu" vlan",用于虚拟局域网),从任何设备转发流量 将其连接到上,到" VLAN"上的所有其他设备。这不是 802.1q vlan,只是一个孤立的网络段。

它所支持的VLAN也只是模拟的枢纽,我最好说,我最好告诉主机。

无论如何,我重新设计了使用"新" NetDev语法的QEMU选项,并在这里获得了我想要的行为。

您在ifupbr0.sh和ifupbr1.sh脚本中有什么?您正在使用什么桥接工具?那是将您的流量隔离到所需接口的重要部分。

我已经使用OpenVswitch来处理我的桥接东西。但是在此之前,我在Debian中使用了桥梁。

我在http://blog.raymond.burkholder.net/index.php?/archives/31-qemukvm-bridgetap-network-network-configuration.html上写了一些有关桥接的信息。我还有其他关于我在openvswitch方面桥接的事情的文章。

相关内容

  • 没有找到相关文章

最新更新