来宾和主机无法使用linux-kvm和macvtap互相看到


9

我正在将kvm虚拟机从旧主机(硬件和操作系统)迁移到新主机。

对于网络,virt-manager向我提出了一个新的选择:macvtap。这看起来比在eth0上架桥的好选择。

因此,现在访客启动正常,可以从我的局域网DHCP服务器获取IP,可以访问Internet。来宾还可以看到本地网络上的其他计算机,我可以将它们SSH等。

问题在于主机和来宾看不到对方。我无法使用来宾IP从主机与来宾联系,也无法使用来宾IP从来宾与主机联系。没有ping,ssh,http,什么也没有。

这是route -n来自主机的命令:

$ /sbin/route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.0.1     0.0.0.0         UG    0      0        0 eth0
192.168.0.0     0.0.0.0         255.255.255.0   U     1      0        0 eth0

(来宾的输出相同)。

我可能可以设置一个新的tun / tap接口,专门用于主机和来宾之间的通信,但看起来有些过分了。有没有办法让主持人和来宾交流?


Macvtap不是桥接的有效替代品。如果要切换而不是桥接,请查看openvswitch。
user186658 '16

Answers:


7

我在IRC上问了这个问题,看来macvtap

将访客流量注入网络堆栈太低

然后,解决方案是为来宾和主机添加网络接口以进行通信,或者使用旧的桥接解决方案。


1
这里是一步就如何创建主机/客户界面的步骤说明,而不必禁用网络管理员: wiki.libvirt.org/page/...
HDave

1
我没法得到这些指示才能工作...
HDave 2013年

4

virt-manager明确表示,设置时,macvtap不适用于主机到来宾网络通信。我仅添加了第二个基于nat的界面,在guest虚拟机中进行设置,然后使用该界面与主机进行通信。


1

解决方案是在虚拟机管理程序上配置一个macvlan接口,使其IP地址与真实的硬件接口相同(非常重要),并在主机上配置路由以使用它。在Qemu / KVM中,照常在硬件接口上使用macvtap接口。

对于我的配置(192.168.1.0/24网络,p10p1硬件接口和192.168.1.1网关),它提供了(在管理程序上):

ip link add link p10p1 address 00:19:d1:29:d2:58 macvlan0 type macvlan mode bridge
ip address add 192.168.1.100/24 dev macvlan0
ip link set dev macvlan0 up

ip route flush dev p10p1
ip route add default via 192.168.1.1 dev macvlan0 proto static

1

正如前面的答案中提到的那样,此问题的解决方案是在主机上添加macvlan网络适配器。但是,我觉得手动重新路由到macvlan适配器的路由有点麻烦,特别是因为我想要IPv6支持并在前缀更改时手动设置路由可能会成为问题。因此,这是我的配置,使内核可以控制路由表:

(此处的特定配置特定于Debian和Upstart,但基本步骤应在任何GNU / Linux上都可以使用。)

在启动时创建macvlan适配器

首先,您需要为适配器选择一个MAC地址。您也许可以只使用一个随机适配器,但我建议您手动创建一个macvlan适配器并使用其MAC。这样,MAC必须遵守可能存在的任何约定。

建议设置固定的MAC,因为否则,DHCP服务器无法重新启动后识别您的计算机并为其分配与以前相同的IP地址。

因此,创建一个适配器并查找MAC:

root@host:~# ip link add link eth0 macvlan0 type macvlan mode bridge
root@host:~# ip addr show dev macvlan0
#: macvlan0@eth0:  mtu 1500 qdisc noqueue state UNKNOWN group default qlen 1
    link/ether 12:34:56:78:90:ab brd ff:ff:ff:ff:ff:ff
...

高亮显示的十六进制数字是您的MAC地址。

现在,您将创建一个初始化脚本(必须在初始化网络之前运行该脚本),以在每次启动时创建macvlan适配器。为此的命令是:

ip link add link eth0 address <MACADDRESS> macvlan0 type macvlan mode bridge

为此目的,示例Upstart初始化脚本为:

start on starting networking

script
    ip link add link eth0 address <MACADDRESS> macvlan0 type macvlan mode bridge
end script

只是把它放在例如/etc/init/macvlan.conf

设置网络配置

在中/etc/network/interfaces,将物理网络适配器设置为手动(但将其保留为自动),然后将其先前的配置(通常为DHCP或静态IP地址)移动到您的macvlan适配器。例如:

auto eth0
iface eth0 inet manual

auto macvlan0
iface macvlan0 inet dhcp

禁用物理适配器的IPv6

最后,您不希望物理适配器获取IP地址。对于IPv4,将适配器设置为手动会阻止其获取地址。但是,我还没有找到阻止内核从适配器获取/分配IPv6地址的配置。如果这样做,它还会为其添加路由,这可能会导致问题。因此,最好的方法似乎是为物理适配器禁用IPv6。您可以通过添加以下行来实现

net.ipv6.conf.eth0.disable_ipv6=1

/etc/sysctl.conf,方法是在/etc/sysctl.d/此行中创建一个文件,或通过添加

sysctl -w net.ipv6.conf.eth0.disable_ipv6=1

到您的初始化脚本。

当您现在重新启动计算机时,从主机到来宾的通信应同时适用于IPv4和IPv6。


请注意,如果在设置时出错,即使重新启动后,主机也可能无法通过网络访问。仅当您对机器具有物理访问权限或已采取其他保护措施以解决潜在问题时,才这样做。


1

您想要结束的事情是这样的:

Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.0.1     0.0.0.0         UG    0      0        0 macvlan0
192.168.0.0     0.0.0.0         255.255.255.0   U     1      0        0 macvlan0

请注意,最后一列包含“ macvlan0”而不是“ eth0”。

为此,您可以使用以下命令,并假设192.168.0.42作为您的IP地址:

ip link add link eth0 macvlan0 type macvlan mode bridge
ip address add 192.168.0.42 dev macvlan0
ip link set dev macvlan0 up
ip route flush dev eth0
ip route add default via 192.168.0.1

通常类似于npen的解决方案。如果您想要更复杂的脚本,请参阅我的网页


不要忘记加载macvlan模块:modprobe macvlan
mdd 2015年

0

我使用了Lazzaro在Debian上写的内容,但是我想添加一些注释。

首先,访客接口需要设置为“源设备”->“主机设备eth0:macvtap”;“源模式”->“ 桥接 ”。

其次,您使用的初始化脚本对我不起作用(似乎macvlan0接口在启动期间创建得太晚了),因此我使用了以下命令:

nano /etc/init.d/macvlan

将mac更改为首次创建接口时分配的mac:

#!/bin/sh
### BEGIN INIT INFO
# Provides:          macvlan
# Required-Start:    $local_fs
# Required-Stop:     
# Default-Start:     S
# Default-Stop:      
# Short-Description: Set up macvlan
# Description:       This script sets up the macvlan interface
#                    before it can be used by networking.
# X-Start-Before:    networking
### END INIT INFO


PATH=/sbin:/usr/sbin:/bin:/usr/bin
. /lib/init/vars.sh


do_start () {
        ip link add link eth0 address 00:11:22:aa:bb:cc macvlan0 type macvlan mode bridge
###      REPLACE MAC ON EACH HOST ->  ^^ ^^ ^^ ^^ ^^ ^^
}

case "$1" in
  start|"")
        do_start
        ;;
  *)
        echo "Sorry, this only sets up the macvlan interface." >&2
        exit 3
        ;;
esac

保存并设置执行位:

chmod +x /etc/init.d/macvlan

并为init添加所有链接:

update-rc.d macvlan defaults
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.