使用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 回答
看起来我最终回答了我自己的问题,但是我会将其记录给其他任何人 .
显然,这确实是KVM对我正在使用的选项的预期行为 .
在此URL:http://wiki.qemu.org/Documentation/Networking
我发现:
当然,我正在使用这种遗留语法 . 我认为新语法更灵活,但显然实际上有这种预期的行为:
它支持的vlan也只是模拟集线器,并且根本无法告诉我们根本不向主机转发 .
无论如何,我重写了QEMU选项以使用“新”netdev语法并获得了我想要的行为 .
你在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方面的桥接,我还有其他帖子 .