qemu - 通过 br0 的两个客户端(tap0 和 tap1)无法互相 ping,但服务器 ping 正常

Tor*_*xed 6 networking kvm ubuntu ping qemu

我有:

  • 运行带有 KVM 的 Ubuntu 的主机系统(功能)
  • 两个客户端,一个 Ubuntu 和一个 Windows 7,没什么特别的。

我还通过 br0 为客户端设置了(见下文)网桥:

  • br0:192.168.2.1(DHCP 运行)
  • eth0 -> br0
  • 点击0 -> br0
  • 点击1 -> br0

br0 可以给客户端 IP,他们得到:

  • Windows 7:192.168.2.29
  • Ubuntu:192.168.2.30

这是我的问题:

  • Windows ICMP -> br0:有效
  • Ubuntu ICMP -> br0:有效
  • Ubuntu ICMP -> Windows:失败

http://www.youtube.com/watch?v=5C1VvJezouI


我玩了一些 NAT(我通过 iptables 掌握了它的窍门),这就像一个魅力!没有任何问题,两个客户端都可以 ping www.google.se 并获取数据等,但不能在彼此之间?!


这是我从头到尾运行的命令:

tc qdisc del dev wlan0 root 2>/dev/null
tc qdisc del dev wlan0 ingress 2>/dev/null
iptables -P INPUT ACCEPT
iptables -F INPUT
iptables -P OUTPUT ACCEPT
iptables -F OUTPUT
iptables -P FORWARD DROP
iptables -F FORWARD
iptables -t nat -F PREROUTING
iptables -t nat -F OUTPUT
iptables -t nat -F POSTROUTING
iptables -t nat -F
iptables -t mangle -F
ip route flush table main
iptables -t mangle -A PREROUTING -p tcp -j CONNMARK --restore-mark

modprobe ifb numifbs=1
modprobe ip_conntrack
modprobe xt_mark
modprobe iptable_nat

echo "1" > /proc/sys/net/ipv4/ip_forward
echo "0" > /proc/sys/net/bridge/bridge-nf-call-arptables
echo "0" > /proc/sys/net/bridge/bridge-nf-call-iptables
echo "0" > /proc/sys/net/bridge/bridge-nf-call-ip6tables

ifconfig br0 192.168.2.1 netmask 255.255.255.0
route add -net 192.168.2.0 netmask 255.255.255.0 dev br0
ip route add default via 192.168.2.1 dev wlan0

kpartx -av win7.img
kpartx -av ubuntu.img

tunctl -u `whoami` -t tap0
ip link set tap0 up
brctl addif br0 tap0

tunctl -u `whoami` -t tap1
ip link set tap1 up
brctl addif br0 tap1

kvm -no-reboot -m 1300 -hda /dev/mapper/loop0p1 -boot order=c -net nic,macaddr="DE:AD:BE:EF:EC:B6" -net tap,ifname=tap0,script=/etc/qemu-dummy

kvm -no-reboot -m 1300 -hda /dev/mapper/loop1p1 -boot order=c -net nic,macaddr="DE:AD:BE:EF:EC:B7" -net tap,ifname=tap1,script=/etc/qemu-dummy
Run Code Online (Sandbox Code Playgroud)

在这一点上,我试图在客户端之间 ping 没有成功,所以我关闭了系统并运行:

brctl delif br0 tap0
brctl delif br0 tap1
ifconfig tap0 down
ifconfig tap1 down
tunctl -d tap0
tunctl -d tap1
kpartx -dv win7.img
kpartx -dv ubuntu.img
Run Code Online (Sandbox Code Playgroud)

rha*_*sti 2

brctl delif br0 tap0
brctl delif br0 tap1

kvm -no-reboot -m 1300 -hda /dev/mapper/loop0p1 -boot order=c -net nic,macaddr="DE:AD:BE:EF:EC:B6" -net bridge,br=br0
kvm -no-reboot -m 1300 -hda /dev/mapper/loop1p1 -boot order=c -net nic,macaddr="DE:AD:BE:EF:EC:B7" -net bridge,br=br0
Run Code Online (Sandbox Code Playgroud)

在您当前的场景中,正在使用水龙头。
如果所有 VM 都应该能够访问其他 VM 以及虚拟化主机,则可以选择让 br0 充当交换机。

另一种方法是在桥接模式下使用 macvtap甚至使用openvswitch