首页 文章

kvm网络设备共享流量

提问于
浏览
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 \

在guest(也运行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接口,我看到两个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脚本:

%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显示

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

2 回答

  • 2

    看起来我最终回答了我自己的问题,但是我会将其记录给其他任何人 .

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

    在此URL:http://wiki.qemu.org/Documentation/Networking

    我发现:

    QEMU以前使用-net nic选项而不是-device DEVNAME和-net TYPE而不是-netdev TYPE . 自QEMU 0.12以来,这被认为是过时的,尽管它仍然有效 . 创建虚拟网络设备的遗留语法是:-net nic,model = MODEL

    当然,我正在使用这种遗留语法 . 我认为新语法更灵活,但显然实际上有这种预期的行为:

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

    它支持的vlan也只是模拟集线器,并且根本无法告诉我们根本不向主机转发 .

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

  • 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方面的桥接,我还有其他帖子 .

相关问题