KVM桥接网络不起作用


23

我只是按照以下指南在我的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显示:

 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路由:

 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。即使手动设置,也无法使用。


我可以建议您提供以下命令的输出吗?在主机:ifconfigbrctl showbrctl showmacs br0,和ip route。在来宾:ifconfigip routeping 8.8.8.8ping <your internet router>,和traceroute 8.8.8.8。我不能说我已经按照您的方式配置了kvm,但是我已经开始使用该kvm命令进行桥接。我确实必须断开无线连接,以便主机可以连接到Internet,并且,如您所引用的说明所述,您需要使用以太网连接到Internet。
约翰·格鲁伯

@JohnSGruber刚刚添加了您请求的信息。但是我无法从访客复制粘贴信息,因为无法通过ssh对其进行粘贴。它没有从DHCP获得任何IP。即使手动设置,也无法使用。
THpubs 2012年

您在brctl showmacs br0上面的列表中分配给访客的MAC地址吗?
John S Gruber 2012年

我没有手动添加mac ..但是让我检查它获得的mac ..
THpubs 2012年

@JohnSGruber不,我在这里没有看到该MAC!
THpubs 2012年

Answers:


22

初赛

以下内容适用于Ubuntu 12.04。在测试时,应禁用计算机的防火墙,以免受到干扰。

/ etc / default / qemu-kvm文件应与最初安装的文件相同。

您将需要安装bridge-utils qemu-kvmlibvirt-bin。任何使用虚拟机的用户都应添加到libvirtd组中。安装bridge-utils 安装qemu-kvm安装libvirt-bin

似乎不再需要添加CAP_NET_ADMIN功能。

网络设置

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

下图可能使区别更加清楚:

网络图

您可以看到如何通过以下方式定义默认用户网络:

virsh net-dumpxml default

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

在/ etc / network / interfaces中(从您在问题中提到的帖子的桥接部分开始):

自动搜索
iface lo inet回送
#auto eth0
#iface eth0 inet dhcp
自动eth0
iface eth0 inet手册
自动br0
iface br0 inet dhcp
    bridge_ports eth0
    bridge_stp关闭
    bridge_fd 0
    bridge_maxwait 0

重启; 并确保无线网络未处于活动状态。使用检查默认的IP路由ip route。它必须使用br0接口。

注意:如果在进行此更改时未连接以太网,则需要插入以太网电缆并获得载体,否则引导将挂起两分钟,并且您将无法使用网络功能,这是因为eth0接口在此文件中之前,必须先启动,然后才能正常进行引导。

注意:通常,您不能使用无线网络代替eth0,因为它们无法使用多个MAC地址(我推断它们需要第二个用于桥接)。

或者,您可以禁用以太网,并确保它没有IP地址,并且没有使用设置默认路由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路由列表
默认通过192.168.1.1 dev br0 metric 100 
169.254.0.0/16 dev br0范围链接指标1000 
192.168.1.0/24 dev br0 proto内核作用域链接src 192.168.1.45 
192.168.122.0/24 dev virbr0原型内核作用域链接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。在启动虚拟机时,qemu-kvm运行以下命令:

ifconfig vnet0 0.0.0.0以上
brctl addif brctl addif br0 vnet0

这是通过/ etc / qemu-ifup完成的

VM的vnet0接口已添加到br0网桥,因为上面的默认路由使用该网桥接口。如果不存在,则将tap接口添加到virbr0接口。由于未连接到Internet,在我的实验中,将使用NAT将来宾连接到主机和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链接encap:以太网HWaddr 00:1e:33:88:07:e5  
          inet地址:192.168.1.45广播:255.255.255.255掩码:255.255.255.0
          inet6地址:fe80 :: 21e:33ff:fe88:7e5 / 64范围:链接
          UP广播多播MTU:1500公制:1
          RX数据包:6526错误:0丢弃:0超限:0帧:0
          TX数据包:7543错误:0掉落:0超限:0运营商:0
          冲突:0 txqueuelen:0 
          接收字节:2712940(2.7 MB)发送字节:1071835(1.0 MB)

eth0链接encap:以太网HWaddr 00:1e:33:88:07:e5  
          UP广播多播MTU:1500公制:1
          RX数据包:7181错误:0掉落:0超限:0帧:0
          TX数据包:7740错误:0掉落:0超限:0运营商:0
          碰撞:0 txqueuelen:1000 
          接收字节:2974585(2.9 MB)发送字节:1096580(1.0 MB)
          中断:43个基地址:0x6000 

lo链接封套:本地环回  
          inet地址:127.0.0.1掩码:255.0.0.0
          inet6 addr::: 1/128范围:主机
          上环运行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链接encap:以太网HWaddr ca:0c:73:c3:bc:45  
          inet6 addr:fe80 :: c80c:73ff:fec3:bc45 / 64范围:链接
          UP广播多播MTU:1500公制:1
          RX数据包:226错误:0掉落:0超限:0帧:0
          TX封包:429个错误:0掉落:0超限:0载波:0
          碰撞:0 txqueuelen:500 
          接收字节:26919(26.9 KB)发送字节:58929(58.9 KB)

virbr0链接encap:以太网HWaddr d6:18:22:db:ff:93  
          inet地址:192.168.122.1广播:192.168.122.255掩码:255.255.255.0
          广播多播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显示
桥接名称桥接ID STP启用的接口
br0 8000.001e338807e5否eth0
                                                        vnet0
virbr0 8000.000000000000是

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

MAC位于br0接口上:

$ 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否167.69
  2 ca:0c:73:c3:bc:45是0.00

请注意,br0接口将我的主机连接到来宾使用的同一网桥。

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

请参阅本文档

经理

确保已安装virt-managerhal。该hal软件包是建议的依赖项,virt-manager用于在创建或编辑来宾时确定系统的网络配置。

在如上所述定义br0桥的同时,我使用virt-manager创建了一个虚拟机,如下所示:

在此处输入图片说明 在此处输入图片说明 在此处输入图片说明 在此处输入图片说明 在此处输入图片说明

我能够直接从此访客访问我的家庭网络的其余部分并访问Internet。我还能够从家庭网络中的另一台(非主机,非来宾)Ubuntu计算机上下载该文件。

这是kvmvirt-manager运行的很长的命令(用于与EApubs或其他对此有麻烦的人进行比较):

/ usr / bin / kvm -S -M pc-1.0 -enable-kvm -m 1024 -smp 1,套接字= 1,内核= 1,线程= 1-精确命名-uuid f057a729-eda6-4b85-84dc-f100c9ae3789- nodefconfig -nodefaults -chardev套接字,id = charmonitor,path = / var / lib / libvirt / qemu / precise.monitor,server,nowait -mon chardev = charmonitor,id = monitor,mode = control -rtc base = utc -no-关闭-驱动器文件= / media / natty / home / gruber / ubuntu-kvm / tmpW8gSGB.qcow2,如果=无,id =驱动器-ide0-0-0,格式= qcow2-设备ide-drive,总线= ide.0 ,unit = 0,驱动器=驱动器-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-设备intel-hda,id =声音0,bus = pci.0,addr = 0x4-设备hda-duplex,id =声音0-codec0,bus =声音0.0,cad = 0-设备virtio-balloon-pci,id = balloon0,bus = pci.0,addr = 0x5

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

    <interface type='bridge'>
      <mac address='52:54:00:b0:8e:aa'/>
      <source bridge='br0'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
    </interface>

根据链接,出于性能和可靠性的考虑,最好将网络设备型号设置为virtio,您可以在virt-viewer中通过按i按钮,转到NIC设置,然后设置“设备型号”来执行此操作。到virtio。您还可以通过添加以下行将其添加到上面的XML中:

      <model type='virtio'/>

综上所述

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->高级选项”面板下指定网络Bridge br0。

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

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

  1. 准备并配置您需要的任何防火墙服务。
  2. 在来宾配置或DHCP服务中分配静态地址。
  3. 如果您使用的是NAT路由器,请打开要实现的服务的端口,将其定向到来宾的IP地址。

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

https://help.ubuntu.com/community/KVM/Installationhttps://help.ubuntu.com/community/KVM/Networkinghttps://help.ubuntu.com/12.04/serverguide/libvirt。 html


嗨,我那台机器上没有无线网卡。仅以太网:)
THpubs 2012年

我了解您没有无线功能,但其他阅读此问题的人可能会使用。我已经发布了一个virt-manager部分,因为这是您所使用的。创建虚拟机时,是否在步骤4“高级选项”中指定“桥接到br0”?virt-manager启动的kvm命令中的网络参数是否与我的匹配?(您可以通过运行看到它ps aux | grep kvm)。
约翰·格鲁伯

您好,使用virt管理器创建虚拟机时,在高级选项中,看不到eth0和br0。
THpubs 2012年

嗯,这可能就是问题所在,这是使其在virt-manager下工作的关键。您是否正在托管它的计算机上运行(并brctl show在问题中定义了br0 ?),您正在运行哪个版本的Ubuntu?也许就是这样。什么版本的virt-manager?(我的是0.9.1-1ubuntu5.1)。
约翰·格鲁伯

我正在运行Ubuntu 12.04和virt-manager 0.9.1-1ubuntu5.1。实际上,我没有在主机中安装virt-manager。我将其放在远程计算机中,并使用它连接到主机。我有这个问题吗?
THpubs 2012年

6

如果您看到的行为是主机可以访问来宾,而来宾可以访问主机,但是来宾不能访问网络上的其他计算机,反之亦然……则可能是主机的防火墙阻止了访问。

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

具体来说,这部分内容:“最后一步是在网桥上禁用netfilter:

# cat >> /etc/sysctl.conf <<EOF
net.bridge.bridge-nf-call-ip6tables = 0
net.bridge.bridge-nf-call-iptables = 0
net.bridge.bridge-nf-call-arptables = 0
EOF

3

这是我用来为建立桥梁的两个脚本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  

然后,使用默认界面(通常是具有Internet连接的tun-tap界面)创建该界面及其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您应该看到一个br0IP地址的接口192.168.1.1,如create-qemu-bridged-tuntap.sh脚本内所指定:

#> ip addr
8: br0: <NO-CARRIER,BROADCAST,MULTICAST,UP> 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

这是host address由所看到guest。相反,访客将具有IP地址192.168.1.95(同样,可以在主脚本中轻松更改此地址)。

现在,使用virt-manager,您只需要设置来宾nic即可br0用作物理接口。

virt-manager-br0-nic

在中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

尽管您正在使用网桥来执行此操作,但在我看来,您正在创建NAT转发功能。但是,如果您可以转发某些主机端口,也许它将完成EApubs的要求。无论如何,非常有趣且非常有用的答案。
John S Gruber 2012年

谢谢,它对于我的目的来说是完美的。但是,事实上,我不需要对虚拟机的远程访问,我认为EApubs只是试图在其虚拟机上进行Internet访问。
Avio 2012年

@Avio没有我的朋友,我需要远程访问我的机器。如果我设置了NAT并创建了VM,它就可以工作。
THpubs 2012年

这里我们就来一个问题,我在那里的IP转发被关闭,这是一个线索cat /proc/sys/net/ipv4/ip_forward0。启用并坚持使用它可以解决此问题,有关本帖子中的说明
杰克·科布
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.