KVM 桥接网络不工作

THp*_*ubs 24 server networking kvm network-bridge

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

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

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

如果配置:

      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)
Run Code Online (Sandbox Code Playgroud)

brctl 显示:

 bridge name    bridge id      STP enabled    interfaces
 br0       8000.d02788b0e438   no        eth0
 virbr0         8000.000000000000   yes  
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

*在来宾中 *我无法从来宾复制粘贴信息,因为无法通过 ssh 连接到它。它没有从 DHCP 获得任何 IP。即使手动设置后也无法工作。

Joh*_*ber 23

预赛

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

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

你需要有桥接工具安装桥接工具 qemu-kvm安装 qemu-kvmlibvirt-bin安装 libvirt-bin安装。任何使用虚拟机的用户都应该添加到 libvirtd 组。

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

网络设置

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

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

网络图

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

virsh net-dumpxml default
Run Code Online (Sandbox Code Playgroud)

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

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

自动低速
iface lo inet环回
#auto eth0
#iface eth0 inet dhcp
自动 eth0
iface eth0 inet 手册
自动 br0
iface br0 inet dhcp
    网桥端口 eth0
    bridge_stp 关闭
    桥接_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 &
Run Code Online (Sandbox Code Playgroud)

您还可以在此处提供静态 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 proto 内核范围链接 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
Run Code Online (Sandbox Code Playgroud)

-netdev tap参数使 sudo 成为一项要求。当 VM 启动时,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(注意虚拟机运行时出现在我的网络上的 vnet0 接口):

$ifconfig
br0 链接封装:以太网 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 范围:链接
          上行广播运行多播 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  
          上行广播运行多播 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 链路封装:本地环回  
          inet 地址:127.0.0.1 掩码:255.0.0.0
          inet6 地址:::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 Link encap:Ethernet HWaddr ca:0c:73:c3:bc:45  
          inet6 地址:fe80::c80c:73ff:fec3:bc45/64 范围:链接
          上行广播运行多播 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 地址: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)

运行虚拟机时我的网桥配置:

$brctl 显示
网桥名称网桥 ID STP 启用接口
br0 8000.001e338807e5 没有 eth0
                                                        网络0
virbr0 8000.000000000000 是

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

和 br0 接口上的 MAC:

$brctl showmacs br0
port no 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 接口将我的主机连接到来宾使用的同一个网桥。

您可以使用traceroute 8.8.8.8. 如果第一个节点是您网络的路由器而不是访客的 IP 地址,您的网络应该可以正常工作。

请参阅此文档

虚拟管理器

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

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

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

我能够直接访问我家庭网络的其余部分,并从这个访客访问 Internet。我还能够从家庭网络上的另一台(非主机、非访客)Ubuntu 计算机 ssh 进入它。

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

/usr/bin/kvm -S -M pc-1.0 -enable-kvm -m 1024 -smp 1,sockets=1,cores=1,threads=1 -name 精确 -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-关机 -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,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>
Run Code Online (Sandbox Code Playgroud)

根据这个链接,性能和可靠性,它可能是最好设置网络设备模型,virtio通过按,您可以通过的virt-观众做到这一点按钮,将网卡设置,并设置“设备模型“到virtio。您还可以通过添加以下行将其添加到上面的 XML 中:

      <model type='virtio'/>
Run Code Online (Sandbox Code Playgroud)

总之

所有这一切发生在 12.04 是:

  1. 安装 virt-manager、bridge-utils、qemu-kvm 和相关包
  2. 确保希望使用 kvm 的每个用户都在 libvirtd 组中。
  3. 如上所述定义 /etc/network/interfaces(与引用的文章匹配)
  4. 重新启动,确保以太网已插入且无线(如果有)已关闭。
  5. 要么直接使用例如 对映像运行 kvm -device e1000,netdev=tunnel -netdev tap,id=tunnel,ifname=vnet0,要么使用 virt-manager 创建虚拟机,在 Step 4->Advanced Options 面板下指定 network 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


小智 10

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

参见: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
Run Code Online (Sandbox Code Playgroud)