KVM桥接网络无法正常工作

我根据本指南在我的Ubuntu服务器上安装了KVM: https : //help.ubuntu.com/community/KVM/Installation

然后准备一个桥接网络,如下所示: https : //help.ubuntu.com/community/KVM/Networking

然后,我用virt-manager创建了一个虚拟机。 我尝试过几次,但客人无法连接到网络! 有帮助吗?

ifconfig:

br0 Link encap:Ethernet HWaddr d0:27:88:b0:e4:38 inet addr:192.168.20.100 Bcast:192.168.20.255 Mask:255.255.255.0 inet6 addr: fe80::d227:88ff:feb0:e438/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:62 errors:0 dropped:0 overruns:0 frame:0 TX packets:62 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:10493 (10.4 KB) TX bytes:8433 (8.4 KB) eth0 Link encap:Ethernet HWaddr d0:27:88:b0:e4:38 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:62 errors:0 dropped:0 overruns:0 frame:0 TX packets:63 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:11361 (11.3 KB) TX bytes:8479 (8.4 KB) Interrupt:41 lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 inet6 addr: ::1/128 Scope:Host UP LOOPBACK RUNNING MTU:16436 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:0 (0.0 B) TX bytes:0 (0.0 B) virbr0 Link encap:Ethernet HWaddr 5a:8c:57:95:af:3b inet addr:192.168.122.1 Bcast:192.168.122.255 Mask:255.255.255.0 UP BROADCAST MULTICAST MTU:1500 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:0 (0.0 B) TX bytes:0 (0.0 B) 

brctl show:

  bridge name bridge id STP enabled interfaces br0 8000.d02788b0e438 no eth0 virbr0 8000.000000000000 yes 

brctl showmacs br0:

  port no mac addr is local? ageing timer 1 5c:d9:98:67:b6:28 no 48.33 1 d0:27:88:b0:e4:38 yes 0.00 1 e0:2a:82:f9:6c:09 no 0.00 

ip route:

  default via 192.168.20.1 dev br0 metric 100 192.168.20.0/24 dev br0 proto kernel scope link src 192.168.20.100 192.168.122.0/24 dev virbr0 proto kernel scope link src 192.168.122.1 

* 在访客*我无法复制从客人粘贴信息,因为无法ssh到它。 它没有从DHCP获得任何IP。 即使手动设置后也无法工作。

预赛

以下为Ubuntu 12.04工作。 您应该在测试时禁用计算机的防火墙,以免干扰。

/ etc / default / qemu-kvm文件应该与最初安装的一样。

你需要有bridge-utils 安装bridge-utils QEMU-KVM 安装qemu-kvm 和libvirt-bin 安装libvirt-bin 安装。 应将使用虚拟机的任何用户添加到libvirtd组。

似乎不再需要添加CAP_NET_ADMINfunction。

网络设置

默认网络模式是用户模式,也称为SLIRP。 它使用预定义的virbr0网桥,NAT网络路由到来宾计算机。 NAT路由使用内核的ip_forwardingfunction和iptables 。 桥接模式使用(未编号的)以太网接口所连接的guest虚拟机中的虚拟网桥,主机和guest虚拟机都具有其网络接口。

以下图表可能会使差异更加清晰:

在此处输入图像描述

您可以看到如何定义默认用户网络:

 virsh net-dumpxml default 

我可以使用以下方法设置桥接模式:

在/ etc / network / interfaces中(来自您在问题中提到的post的桥接部分):

汽车公司
 iface lo inet loopback
 #auto eth0
 #iface eth0 inet dhcp
自动eth0
 iface eth0 inet manual
自动br0
 iface br0 inet dhcp
     bridge_ports eth0
     bridge_stp关闭
     bridge_fd 0
     bridge_maxwait 0 

重启; 并确保无线网络未激活。 使用ip route检查默认IP ip route 。 它必须使用br0接口。

注意如果在进行此更改时未连接以太网,则需要插入以太网电缆并获取运营商或引导将挂起两分钟而您将无法使用网络function这是因为eth0接口,在此文件中,必须在引导才能正常进行之前启动。

NB通常你不能使用无线网络而不是eth0,因为他们无法使用多个MAC地址(我推断他们需要第二个用于网桥)。

作为替代方案,您可以禁用以太网的使用并确保它没有IP地址,并且没有使用ip route设置默认ip route 。 然后:

  sudo ifconfig eth0 0.0.0.0 up sudo brctl addbr br0 sudo brctl addif br0 eth0 sudo ifconfig br0 up sudo dhclient br0 & 

您还可以在此处提供静态IP地址,以及定义默认路由和DNS地址。 对于这个例子, dhclient这样做的。

这是我的路线表:

  $ ip route list
默认通过192.168.1.1 dev br0 metric 100 
 169.254.0.0/16 dev br0范围链接度量标准1000 
 192.168.1.0/24 dev br0原型内核范围链接src 192.168.1.45 
 192.168.122.0/24 dev virbr0 proto kernel scope link src 192.168.122.1 

使用kvm

然后我可以启动一个桥接的kvm机器:

  $ sudo kvm -name Quantal -m 1024 -hda foo.qcow2 --soundhw ac97 -device virtio-net,netdev=tunnel -netdev tap,id=tunnel,ifname=vnet0 

-netdev tap参数使sudo成为一项要求。 当vm启动时,qemu-kvm运行以下命令:

  ifconfig vnet0 0.0.0.0 up
 brctl addif brctl addif br0 vnet0 

这是由/ etc / qemu-ifup完成的

vm的vnet0接口被添加到br0网桥,因为上面的默认路由使用该网桥接口。 如果不存在,则将tap接口添加到virbr0接口。 由于未连接到Internet,因此在我的实验中,NAT将用于将guest虚拟机连接到主机和Internet。 您可以将vnet0定向到/ etc / default / qemu-kvm中的特定网桥。 使用下面的virt-manager,您可以明确指示要连接的桥接器。

由于qemu-kvm发出上述命令,并且-netdev tap,id=tunnel,ifname=vnet0参数,vm虚拟机连接到vnet0隧道,隧道连接到br0桥。

我现在可以从我网络上的另一台计算机直接ssh到这个来宾vm。

我的主机ifconfig (注意vm运行时网络上出现的vnet0接口):

  $使用ifconfig
 br0链接封装:以太网HWaddr 00:1e:33:88:07:e5  
           inet addr:192.168.1.45 Bcast:255.255.255.255掩码:255.255.255.0
           inet6 addr:fe80 :: 21e:33ff:fe88:7e5 / 64范围:链接
           UP BROADCAST RUNNING MULTICAST MTU:1500公制:1
           RX数据包:6526错误:0丢弃:0超限:0帧:0
           TX数据包:7543错误:0丢弃:0溢出:0载波:0
          碰撞:0 txqueuelen:0 
           RX字节:2712940(2.7 MB)TX字节:1071835(1.0 MB)

 eth0链接封装:以太网HWaddr 00:1e:33:88:07:e5  
           UP BROADCAST RUNNING MULTICAST MTU:1500公制:1
           RX数据包:7181错误:0丢弃:0超限:0帧:0
           TX数据包:7740错误:0丢弃:0溢出:0载波:0
          碰撞:0 txqueuelen:1000 
           RX字节:2974585(2.9 MB)TX字节:1096580(1.0 MB)
          中断:43基地址:0x6000 

 lo Link encap:Local Loopback  
           inet addr:127.0.0.1掩码:255.0.0.0
           inet6 addr::: 1/128范围:主机
           UP LOOPBACK RUNNING MTU:16436公制:1
           RX数据包:10个错误:0丢弃:0超出:0帧:0
           TX数据包:10个错误:0丢弃:0溢出:0载波:0
          碰撞:0 txqueuelen:0 
           RX字节:664(664.0 B)TX字节:664(664.0 B)

 vnet0链接封装:以太网HWaddr ca:0c:73:c3:bc:45  
           inet6 addr:fe80 :: c80c:73ff:fec3:bc45 / 64范围:链接
           UP BROADCAST RUNNING MULTICAST MTU:1500公制:1
           RX数据包:226错误:0丢弃:0超限:0帧:0
           TX数据包:429错误:0丢弃:0溢出:0载波:0
          碰撞:0 txqueuelen:500 
           RX字节:26919(26.9 KB)TX字节:58929(58.9 KB)

 virbr0链接封装:以太网HWaddr d6:18:22:db:ff:93  
           inet addr:192.168.122.1 Bcast:192.168.122.255掩码:255.255.255.0
           UP BROADCAST MULTICAST MTU:1500公制:1
           RX数据包:0错误:0丢弃:0超限:0帧:0
           TX数据包:0错误:0丢弃:0溢出:0载波:0
          碰撞:0 txqueuelen:0 
           RX字节:0(0.0 B)TX字节:0(0.0 B) 

运行VM时我的网桥配置:

  $ brctl秀
 bridge name bridge id STP启用的接口
 br0 8000.001e338807e5没有eth0
                                                         vnet0
 virbr0 8000.000000000000是的 

请注意,虚拟机的vnet0接口和eth0接口都连接到br0桥接器。

并且br0接口上的MAC:

  $ brctl showmacs br0
端口没有mac addr是本地的吗? 老化计时器
   1 00:05:5d:cf:64:61没有2.54
   1 00:19:d2:42:5d:3f没有36.76
   1 00:19:df:da:af:7c没有2.86
   1 00:1e:33:88:07:e5是0.00
   1 00:60:0f:e4:17:d6没有0.79
   2 52:54:00:12:34:56没有0.80
   1 58:6d:8f:17:5b:c0没有5.91
   1 c8:aa:21:be:8d:16 no 167.69
   2 ca:0c:73:c3:bc:45是0.00 

请注意,br0接口将我的主机连接到guest虚拟机使用的同一个桥。

您可以使用traceroute 8.8.8.8检查是否已桥接而不是NAT路由到您自己的网络。 如果第一个节点是您的网络路由器而不是客户的IP地址,那么您的网络应该正常工作。

请参阅此文档 。

virt-manager中

确保你已经安装了virt-managerhalhal包是virt-manager的建议依赖项,用于在创建或编辑guest virt-manager确定系统的网络配置。

虽然如上所述定义了br0桥,但我使用virt-manager创建了一个虚拟机,如下所示:

在此处输入图像描述在此处输入图像描述在此处输入图像描述在此处输入图像描述在此处输入图像描述

我能够直接进入我的家庭网络的其余部分,并从这位客人那里上网。 我也可以从家庭网络上的其他(非主机,非客户)Ubuntu计算机进入ssh。

这是由virt-manager运行的非常长的kvm命令(用于与EApubs或其他任何有此问题的人进行比较):

  / usr / bin / kvm -S -M pc-1.0 -enable-kvm -m 1024 -smp 1,sockets = 1,cores = 1,threads = 1 -name precise -uuid f057a729-eda6-4b85-84dc-f100c9ae3789  - nodefconfig -nodefaults -chardev socket,id = charmonitor,path = / var / lib / libvirt / qemu / precise.monitor,server,nowait -mon chardev = charmonitor,id = monitor,mode = control -rtc base = utc -no- shutdown -drive file = / media / natty / home / gruber / ubuntu-kvm / tmpW8gSGB.qcow2,if = none,id = drive-ide0-0-0,format = qcow2 -device ide-drive,bus = ide.0 ,unit = 0,drive = drive-ide0-0-0,id = ide0-0-0,bootindex = 1 -netdev tap,fd = 18,id = hostnet0 -device rtl8139,netdev = hostnet0,id = net0,mac = 52:54:00:0e:da:9b,bus = pci.0,addr = 0x3 -chardev pty,id = charserial0 -device isa-serial,chardev = charserial0,id = serial0 -usb -vnc 127.0.0.1: 0 -vga cirrus -device intel-hda,id = sound0,bus = pci.0,addr = 0x4 -device hda-duplex,id = sound0-codec0,bus = sound0.0,cad = 0 -device virtio-balloon- PCI,ID = balloon0,总线= pci.0,ADDR = 0x5的 

这是/etc/libvirt/qemu/quantal.xml中虚拟机描述的网络部分

     

根据此链接,为了性能和可靠性,最好将网络设备模型设置为virtio ,您可以通过按下i按钮,进入NIC设置,并设置“设备”,在virt-viewer中执行此操作。模型“到virtio 。 您还可以通过添加以下行将其添加到上面的xml中:

   

综上所述

所有这一切都在12.04上进行了:

  1. 安装virt-manager,bridge-utils,qemu-kvm和相关软件包
  2. 确保每个希望使用kvm的用户都在libvirtd组中。
  3. 如上定义/ etc / network / interfaces(与引用的文章相匹配)
  4. 重新启动,确保已插入以太网并且无线(如果有)已关闭。
  5. 使用例如-device e1000,netdev=tunnel -netdev tap,id=tunnel,ifname=vnet0直接对图像运行kvm,或者使用virt-manager创建虚拟机,在步骤4->高级下指定网桥br0选项面板。

网络,function,模板或配置无需进一步更改。

要将新访客中的服务公开到Internet,您应该:

  1. 准备并配置您需要的任何防火墙服务。
  2. 在guest虚拟机配置或DHCP服务中分配静态地址。
  3. 如果您使用的是NAT路由器,请为您正在实施的服务打开一个端口,将其指向访客的IP地址。

请记住测试并重新启用主机的防火墙服务。 它可能需要任何输入才能将流量转发给访客。

请参阅https://help.ubuntu.com/community/KVM/Installation,https://help.ubuntu.com/community/KVM/Networking和https://help.ubuntu.com/12.04/serverguide/libvirt。 HTML 。

这些是我用来为qemu-kvm创建桥梁的两个脚本。

首先,让主机成为IP路由器。

脚本ip-router.sh

 #!/bin/bash internetinterface="eth0" username=`whoami` if [ "x$username" != "xroot" ] ; then echo echo "You must be root in order to run this script..." echo exit fi if [ "x$1" != "x" ] ; then internetinterface="$1" fi if [ "x$1" == "xdel" ] || [ "x$2" == "xdel" ] ; then disable="1" else disable="0" fi if [ "$disable" == "0" ] ; then echo "Enabling IP forward and setting up masquerade NAT on interface $internetinterface" echo 1 > /proc/sys/net/ipv4/ip_forward iptables -t nat -A POSTROUTING -o $internetinterface -j MASQUERADE else echo "Disable IP forward and setting down masquerade NAT on interface $internetinterface" echo 0 > /proc/sys/net/ipv4/ip_forward iptables -t nat -D POSTROUTING -o $internetinterface -j MASQUERADE fi 

然后,创建tun-tap接口并将其与您的默认接口(通常是具有Internet连接的接口) bridge

脚本create-qemu-bridged-tuntap.sh

 #!/bin/bash bridgename=br0 tapinterface=tap0 outinterface=eth1 if [ "x$1" != "x" ] ; then outinterface="$1" fi ifaces=`awk -F: '{print $1}' /proc/net/dev | tail -n +3` iffound="0" for i in $ifaces do if [ "$outinterface" == "$i" ] ; then iffound="1" fi done if [ "$iffound" == "0" ] ; then echo echo "Can't find the output interface." echo exit 1 fi outifaceip=`ifconfig | grep -A1 $outinterface | tail -1 | awk -F: '{print $2}' | awk '{print $1}'` outifaceiptokens=`echo $outifaceip | awk -F \. '{print NF}'` if [ "$outifaceiptokens" != "4" ] ; then echo echo "The selected output interface $outinterface doesn't seem to have a valid IP address." echo exit 1 fi hostaddress="192.168.1.1" guestaddress="192.168.1.95" sudo tunctl -t $tapinterface sudo brctl addbr $bridgename sudo brctl addif $bridgename $tapinterface sudo ip link set $bridgename up sudo ip addr add $hostaddress/24 dev $bridgename sudo route add -host $guestaddress dev $bridgename sudo parprouted eth1 $bridgename sudo ~/scripts/ip-router.sh $outinterface 

我每天都使用这些脚本,所以它们也应该适合你。 您必须安装一些软件包才能完成所有这些工作。 使用:

 dlocate `which COMMAND` 

你可以看到COMMAND需要哪个包。 例如,要查看哪个包需要具有brctl ,只需运行:

 dlocate `which brctl` 

你会有:

 bridge-utils: /sbin/brctl 

对这些脚本中的所有命令使用相同的方法,您应该(至少)运行此aptitude命令行:

 sudo aptitude install dlocate iproute parprouted iptables uml-utilities bridge-utils net-tools 

最后,您可以启动主脚本(作为普通用户):

 #> create-qemu-bridged-tuntap.sh eth0 Set 'tap0' persistent and owned by uid 0 Enabling IP forward and setting up masquerade NAT on interface eth0 

运行ip addr你应该看到一个带有IP地址192.168.1.1br0接口,如create-qemu-bridged-tuntap.sh脚本中所指定的:

 #> ip addr 8: br0:  mtu 1500 qdisc noqueue state DOWN link/ether 36:76:ee:d6:63:b2 brd ff:ff:ff:ff:ff:ff inet 192.168.1.1/24 scope global br0 

这是guest看到的host address 。 相反,来宾将拥有IP地址192.168.1.95 (同样,这可以在主脚本中轻松更改)。

现在,使用virt-manager ,您只需设置guest虚拟机以将br0用作物理接口。

virt-manager中-BR0网卡

guest内部,你只需要给eth0一个IP地址192.168.1.95 ,一切都应该运行正常。

 Slackware13:~> ifconfig eth0 Link encap:Ethernet HWaddr 52:54:00:F7:6A:78 inet addr:192.168.1.95 Bcast:192.168.1.255 Mask:255.255.255.0 

如果您看到的行为是主机可以访问guest虚拟机,并且guest虚拟机可以访问主机,但guest虚拟机无法访问网络上的其他计算机或反之亦然…可能主机的防火墙阻止访问。

请参阅: https : //bugs.launchpad.net/ubuntu/+source/ufw/+bug/573461

具体来说,本节:“最后一步是禁用网桥上的netfilter:

 # cat >> /etc/sysctl.conf <