使用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方面桥接的事情的文章。