1

使用 linux KVM/QEMU,我有一个虚拟机,主机上有两个 NIC 作为 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 似乎并未将其视为连接到不同的网络。如果我跟踪各个接口,它们都会看到相同的流量。

例如,如果我 ping 10.0.0.0/16 子网,ping -I eth0 10.0.0.1

并同时使用 tcpdump 跟踪两个 Tap 接口,我看到两个 Tap 接口上都出现了 ping:

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 脚本:

% 猫 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

% 猫 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

即使我将“tap0b”接口与 br1 分离,我也会看到这个问题。它仍然显示了我只期望 tap0a 的流量。也就是说,即使:

% brctl 显示

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

2 回答 2

2

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

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

在这个网址: http ://wiki.qemu.org/Documentation/Networking

我发现:

QEMU 以前使用 -net nic 选项而不是 -device DEVNAME 和 -net TYPE 而不是 -netdev TYPE。自 QEMU 0.12 以来,这被认为已过时,尽管它仍在继续工作。

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

-net nic,型号=型号

果然,我使用的是这种遗留语法。我认为新语法更灵活,但它显然实际上具有这种预期行为:

过时的 -net 语法自动创建了一个模拟集线器(称为 QEMU“VLAN”,用于虚拟 LAN),它将流量从连接到它的任何设备转发到“VLAN”上的所有其他设备。它不是 802.1q VLAN,只是一个隔离的网段。

它支持的 vlan 也只是模拟集线器,据我所知,根本不会转发给主机。

无论如何,我重新设计了 QEMU 选项以使用“新”netdev 语法并获得了我想要的行为。

于 2014-01-28T21:41:00.327 回答
0

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

我已经使用 openvswitch 来处理我的桥接内容。但在此之前,我在 Debian 中使用了 bridge-utils。

我在http://blog.raymond.burkholder.net/index.php?/archives/31-QEMUKVM-BridgeTap-Network-Configuration.html写了一些关于 bridge-utils 的信息。我还有其他关于我在 OpenVSwitch 方面进行桥接的帖子。

于 2014-01-28T19:19:37.160 回答