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
和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-manager和hal。该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 是:
-device e1000,netdev=tunnel -netdev tap,id=tunnel,ifname=vnet0,要么使用 virt-manager 创建虚拟机,在 Step 4->Advanced Options 面板下指定 network Bridge br0。无需对网络、功能、模板或配置进行进一步更改。
要将新访客中的服务公开给 Internet,您应该:
请记住为您的主机测试并重新启用防火墙服务。它可能需要任何条目才能将流量转发给访客。
请参阅https://help.ubuntu.com/community/KVM/Installation、https://help.ubuntu.com/community/KVM/Networking和https://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)