Ubuntu
qemu - 通過 br0 的兩個客戶端(tap0 和 tap1)無法互相 ping,但伺服器 ping 正常
我有:
- 使用 KVM 執行 Ubuntu 的主機系統(功能性)
- 兩個客戶端,一個 Ubuntu 和一個 Windows 7,沒什麼特別的。
我還通過 br0 為客戶端設置(見下文)橋接:
- br0:192.168.2.1(執行 DHCP)
- eth0 -> br0
- tap0 -> br0
- tap1 -> br0
br0 可以給客戶端IP,他們得到:
- 視窗 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
在這一點上,我試圖在客戶端之間 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
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
在您目前的場景中,正在使用水龍頭。
如果所有虛擬機都應該能夠訪問其他虛擬機以及虛擬化主機,那麼讓 br0 充當交換機是一種選擇。
另一種方法是在橋接模式下使用 macvtap ,甚至使用openvswitch。