KVM 桥接网络不工作

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 显示:

 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。即使手动设置后也无法工作。

答案1

准备工作

以下内容对我的 Ubuntu 12.04 有用。在测试时您应该禁用计算机的防火墙,以免受到干扰。

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

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

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

网络设置

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

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

网络逻辑示意图

您可以看到默认用户网络的定义方式:

virsh net-dumpxml default

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

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

自动档
iface lo inet 环回
#自动 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 地址(我推断他们需要第二个 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 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

-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。您可以在 /etc/default/qemu-kvm 中将 vnet0 定向到特定网桥。使用下面的 virt-manager,您可以明确指示要连接到哪个网桥。

因为以上qemu-kvm发出的命令,以及参数-netdev tap,id=tunnel,ifname=vnet0,使得vm虚机连接到vnet0隧道,而该隧道又连接到br0网桥。

我现在可以从网络上的另一台计算机直接 ssh 进入该客户虚拟机。

我的主机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 链路封装:以太网 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
                                                        vnet0
virbr0 8000.000000000000 是

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

br0 接口上的 MAC 地址如下:

$brctl showmacs br0
端口无 MAC 地址是本地的吗?老化计时器
  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 创建了一个虚拟机,如下所示:

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

我能够从这台客户机直接访问家庭网络的其余部分和互联网。我还能够从家庭网络上的另一台(非主机、非客户机)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 驱动器,总线=ide.0,单元=0,驱动器=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,总线=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,总线=pci.0,addr=0x4 -device hda-duplex,id=sound0-codec0,总线=sound0.0,cad=0 -device virtio-balloon-pci,id=balloon0,总线=pci.0,地址=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 中按按钮,转到 NIC 设置,并将“设备型号”设置为virtio。您也可以通过添加以下行将其添加到上面的 XML 中:

      <model type='virtio'/>

总之

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 创建虚拟机,并在步骤 4->高级选项面板下指定网络桥 br0。

不需要对网络、功能、模板或配置进行进一步更改。

要将新客户机中的服务公开到互联网,您应该:

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

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

https://help.ubuntu.com/community/KVM/Installationhttps://help.ubuntu.com/community/KVM/Networking, 和https://help.ubuntu.com/12.04/serverguide/libvirt.html

答案2

如果您看到的行为是主机可以访问客户机,客户机可以访问主机,但客户机无法访问网络上的其他机器或反之亦然......可能是主机的防火墙阻止了访问。

看: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  

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

脚本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你应该看到一个br0具有 IP 地址的接口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,您只需设置您的客户网卡以用作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

相关内容